1. 基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import serial	# 引入 serial 库
import serial.tools.list_ports

port_list = list(serial.tools.list_ports.comports()) # 搜索串口列表

ser = serial.Serial(com, int(bps), timeout=int(timex))

ser.flushInput() # 清空缓冲区

count = ser.inWaiting() # 获取缓冲区字符数量

str = ser.readline(ser.in_waiting) # 读取内容并回显

str = glo.ser.read(ser.in_waiting)

2. 搜索串口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class getCom(QThread):
comUpdate = pyqtSignal(list)
port_list_orignal = []

def run(self):
"""得到所有的串口号
args: NONE
return: (串口号列表: ['COM1', ...], 串口名列表: ['通信端口 (COM1)'], 串口列表: ['COM1 - 通信端口 (COM1)', ...])
"""
while(True):
port_list = list(serial.tools.list_ports.comports())
if set(port_list) != set(self.port_list_orignal):
self.port_listUpdate(port_list)
if len(port_list) == 0:
print('No serial port found!')
exit()
else:
self.comUpdate.emit(port_list)

def port_listUpdate(self, port_list):
self.port_list_orignal = port_list
  • 串口的相关信息

    • | 描述 | 函数 | 示例输出 |
      | ————- | ———————— | —————————————————————————— |
      | 串口信息 | port | COM7 - Silicon Labs CP210x USB to UART Bridge (COM7) |
      | 设备名 | name | COM7 |
      | 设备号 | device | COM7 |
      | 设备描述 | description | Silicon Labs CP210x USB to UART Bridge (COM7) |
      | 硬件 ID | hwid | USB VID:PID=10C4:EA60 SER=0001 LOCATION=1-5 |
      | 供应商 ID | vid | 4292 |
      | 产品 ID | pid | 60000 |
      | 序列号 | serial_number | 0001 |
      | 位置 | location | 1-5 |
      | 制造商 | manufacturer | Silicon Labs |
      | 产品 | product | None |
      | 接口 | interface | None |
      | USB 信息 | usb_info() | USB VID:PID=10C4:EA60 SER=0001 LOCATION=1-5 |
      | USB 描述 | usb_decription() | COM7 |

3. 打开串口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def serialOpen(com, bps, timex):
"""打开串口
args: com: 串口号; bps: 波特率; timex: 超时时间
return: ser: 串口对象
"""
try:
ser = serial.Serial(com, int(bps), timeout=int(timex))
if ser.isOpen():
print('open success')
return ser
else:
print('open failed')
return None
except:
print("serialOpen: 串口不存在")
return
finally:
...
  • 打开串口参数

    • ```python
      port = None, # 设备名
      baudrate = 9600, # 波特率
      bytesize = EIGHTBITS, # 数据位
      parity = PARITY_NONE, # 奇偶校验
      stopbits = STOPBITS_ONE, # 停止位
      timeout = None, # 读超时
      xonxoff = False, # 软件流控
      rtscts = False, # 硬件流控
      write_timeout = None, # 写超时
      dsrdtr = False, # DSR/DTR
      inter_byte_timeout = None, # 字节间隔超时
      exclusive = None, # 独占端口
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31

      # 4. 串口数据读取

      ```python
      class serialRead_original(QThread):
      dateReadUpdate = pyqtSignal(str) # 数据更新信号
      serDisconnect = pyqtSignal() # 串口断开信号

      def run(self):
      """读取串口数据
      args: NONE
      return: NONE
      """
      print("serialRead start")
      ser.flushInput() # 清空缓冲区
      while(isConnected):
      if serialIsOpen(ser) == False: # 串口断开 或 不存在
      print("serialRead stop")
      self.serDisconnect.emit()
      serialClose(ser)
      break
      count = ser.inWaiting() # 获取缓冲区字符数量
      # print("count: ", count)
      if count != 0:
      str = ser.readline(ser.in_waiting) # 读取内容并回显
      # str = glo.ser.read(ser.in_waiting)
      # str -> b'' => 二进制数据
      # str = str.decode(encoding='utf-8', errors='ignore')
      self.dateReadUpdate.emit(str)
      # print('data:', data)
      sleep(1)