由于普通的舵机不具有记忆功能,在调试arduino六自由度机械臂时很难受,于是添加了遥控控制,通过串口返回各个舵机当前的角度。当实现后,发现每次通过串口调试助手记录舵机角度也很麻烦,所以我想要利用python的串口通信实现接收并保存指定数据到一个文本中,方便后续调用,ta应该具有如下功能:
CH340,单片机,python3
pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。
安装:pip3 install pyserial
导入:import serial
示例:
打开串口
import serial
def serget(port,bps,time):#port:端口号,bps:波特率,time:超时时间
try:
ser = serial.Serial(port, bps, timeout=time)# 打开串口
print('串口已连接,当前串口:{0}'.format(port))
print("串口详情参数:", ser)
return ser
except Exception as e: # 如果出现异常
print("串口连接失败,失败分析:", e)
portx = input('输入端口号') # 例如:端口 = "COM8"
ser = serget(portx,115200,None)
关闭串口
ser.close() # 关闭串口
状态 | 说明 |
---|---|
name | 设备名 |
port | 端口 |
baudrate | 波特率 |
bytesize | 字节大小 |
parity | 校验位 |
stopbits | 停止位 |
timeout | 读超时 |
writeTimeout | 写超时 |
interCharTimeout | 字符间隔超时 |
xonxoff | 软件流控 |
rtscts | 硬件流控 |
dsrdtr | 硬件流控 |
使用示例:
print(ser.name)
指令 | 说明 |
---|---|
open() | 打开串口 |
close() | 关闭串口 |
示例:
读数据
def serload(ser):
while True:
if ser.in_waiting:
str1 = ser.readline().decode('GBK') # 读一行,以/n结束。
char1 = print(ser.read(size=1).hex()) # 从串口读size个字节
print(str1)
写数据
def serwrite(ser):
text = input('请输入:')
ser.write(text.encode("gbk"))
指令 | 说明 |
---|---|
read(size=1) | 从串口读size个字节 |
write(data) | 发送data,并返回发送字节数 |
inWaiting() | 返回接收缓存中的字节数 |
flush() | 等待所有数据写出 |
flushInput() | 丢弃接收缓存中的所有数据 |
flushOutput() | 终止当前写操作,并丢弃发送缓存中的数据 |
sendBreadk(duration=0.25) | 发送BREAK条件,并于duration时间之后返回IDLE |
串口将会接到的消息:
将通过python接收串口数据,并将每次接收的当前角度存入指定文本中,也可以向串口发送数据。
import serial, os.path
import serial.tools.list_ports
filename='arduino.txt'
def menu():
print('功能选择:\n1.获得串口列表\n2.连接串口\n3.读取并筛选数据\n4.读取文本\n5.写入数据\n6.退出')
def comget():
port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:
print('无可用串口')
else:
for i in range(0, len(port_list)):
print(port_list[i])
def serget(port,bps,time):
try:
# 打开串口,并得到串口对象
ser = serial.Serial(port, bps, timeout=time)
print('串口已连接,当前串口:{0}'.format(port))
print("串口详情参数:", ser)
return ser
except Exception as e: # 如果出现异常
print("串口连接失败,失败分析:", e)
def serload(ser):
while True:
if ser.in_waiting:
data = ser.readline().decode('GBK') # 读一行
print(data)
if data == 'quit': # 如果读取到quit则退出读取
break
elif data.find('当前角度') == 0: # 如果读取到指定字符则存入文本
save(data)
def save(savedata):
try:
file = open(filename, 'a', encoding='gbk')
except:
file = open(filename, 'w', encoding='gbk')
file.write(str(savedata))
file.close()
def openfile():
pass
def serwrite(ser):
text = input('请输入:')
ser.write(text.encode("gbk")) # 写数据
def serclose(ser):
try:
ser.close() # 关闭串口
print('已关闭串口')
except Exception:
print('未启用串口')
if __name__ == '__main__':
portx = input('输入端口号') # 端口portx = "COM8"
ser = serget(portx, 115200, None)
while True:
menu()
choice = input('选择功能:')
if choice == '1':
comget()
elif choice == '2':
portx = input('输入端口号') # 端口portx = "COM8"
ser = serget(portx,115200,None)
elif choice == '3':
serload(ser)
elif choice == '4':
openfile()
elif choice == '5':
serwrite(ser)
elif choice == '6':
serclose(ser)
break
else:
print('输入错误,请重新输入')
continue
print("程序已正常退出")