串口通信就是计算机和外设之间,通过数据信号线、底线、控制线等,按位进行传输数据的一种通讯方式。这种通讯方式使用的数据线少。
串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆及使用的协议。

Python实现简单的串口通信

1 获取可用的串口列表:

参考代码:
 

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])

输出结果:

python 串口通信 python3串口通信_串口通信

2 简单的串口通信

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进制的方式显示))

python 串口通信 python3串口通信_Python3_02

 

3 借助串口通信实现的简单聊天器:

参考代码:

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

结果展示:

python 串口通信 python3串口通信_串口_03