串口通信的基础知识,请参考博客:https://blog.csdn.net/xiaobaixiongxiong/article/details/83998436
串口通信就是计算机和外设之间,通过数据信号线、底线、控制线等,按位进行传输数据的一种通讯方式。这种通讯方式使用的数据线少。
串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆及使用的协议。
参考代码:
import serial
import serial.tools.list_ports
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])
1. 从串口读数据
import serial # pyserial
try:
# 端口:CNU; Linux上的/dev /ttyUSB0等; windows上的COM3等
portx = "COM3"
# 波特率,标准值有:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
bps = 115200
# 超时设置,None:永远等待操作;
# 0:立即返回请求结果;
# 其他:等待超时时间(单位为秒)
timex = None
# 打开串口,并得到串口对象
ser = serial.Serial(portx, bps, timeout=timex)
print("串口详情参数:", ser)
# # 十六进制的发送
# result = ser.write(chr(0x06).encode("utf-8")) # 写数据
# print("写总字节数:", result)
# 十六进制的读取
print(ser.read().hex()) # 读一个字节
print("----------")
ser.close() # 关闭串口
except Exception as e:
print("error!", e)
2.从串口写
import serial # pyserial
try:
# 端口:CNU; Linux上的/dev /ttyUSB0等; windows上的COM3等
portx = "COM4"
# 波特率,标准值有:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
bps = 115200
# 超时设置,None:永远等待操作;
# 0:立即返回请求结果;
# 其他:等待超时时间(单位为秒)
timex = 5
# 打开串口,并得到串口对象
ser = serial.Serial(portx, bps, timeout=timex)
# 写数据
result = ser.write("HELLO WORLD".encode("gbk"))
print("写总字节数:", result)
ser.close() # 关闭串口
except Exception as e:
print("error!", e)
运行结果:(虽然写端写了11个字节,可是读端只读了一个(采用了16进制的方式显示))
参考代码:
import serial
import threading
DATA = "" # 读取的数据
NOEND = True # 是否读取结束
# 读数据的本体
def read_data(ser):
global DATA, NOEND
# 循环接收数据(此为死循环,可用线程实现)
while NOEND:
if ser.in_waiting:
DATA = ser.read(ser.in_waiting).decode("gbk")
print("\n>> receive: ", DATA, "\n>>", end="")
# print(">>", end="")
if(DATA == "quit"):
print("oppo seri has closen.\n>>", end="")
# 打开串口
def open_seri(portx, bps, timeout):
ret = False
try:
# 打开串口,并得到串口对象
ser = serial.Serial(portx, bps, timeout=timeout)
# 判断是否成功打开
if(ser.is_open):
ret = True
th = threading.Thread(target=read_data, args=(ser,)) # 创建一个子线程去等待读数据
th.start()
except Exception as e:
print("error!", e)
return ser, ret
# 关闭串口
def close_seri(ser):
global NOEND
NOEND = False
ser.close()
# 写数据
def write_to_seri(ser, text):
res = ser.write(text.encode("gbk")) # 写
return res
# 读数据
def read_from_seri():
global DATA
data = DATA
DATA = "" #清空当次读取
return data
if __name__ == "__main__":
# ser, ret = open_seri("COM4", 115200, None) # 串口com3、bps为115200,等待时间为永久
# if ret == True: # 判断串口是否成功打开
# count = write_to_seri(ser, "exit")
# print("写入总字节数:", count)
# 打开一个串口
port = input("输入串口名:")
ser, ret = open_seri(port, 115200, None) # 串口com3、bps为115200,等待时间为永久
# oprate_lst = {"quit":close_seri}
# print("操作数字所对应的行为,1:read_from_seri 2:write_to_seri 3:close_seri: ")
while True:
text = input(">>")
write_to_seri(ser, text)
if text == "quit":
close_seri(ser)
print("bye!")
break
https://blog.csdn.net/xiaobaixiongxiong/article/details/83998436
https://www.cnblogs.com/dongxiaodong/p/9992083.html