基于pyserial【Python串口通信】

前言

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站建设、网站设计、锦江网络推广、微信小程序开发、锦江网络营销、锦江企业策划、锦江品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;成都创新互联公司为所有大学生创业者提供锦江建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

Python串口通信有多种方式,本文是基于基于pyserial实现的。首先安装pyserial依赖库,了解常用的方法函数,认识Serial参数说明;然后电脑查看可用的端口,举个简单示例:能自动检测串口,并连接此串口,收集串口的数据;最后查看运行效果。

安装pyserial

pip install pyserial

查看可用的端口

# coding:utf-8 import serial.tools.list_ports plist = list(serial.tools.list_ports.comports())  if len(plist) <= 0:     print("没有发现端口!") else:     plist_0 = list(plist[0])     serialName = plist_0[0]     serialFd = serial.Serial(serialName, 9600, timeout=60)     print("可用端口名>>>", serialFd.name) 

运行结果:

注:在pyCharm环境下运行的,在电脑串口上有一个采集的传感器(通过串口连接到电脑)

常用的方法函数 导入串口模块import serial;打开串口ser = serial.Serial(端口名称,...其他参数), ser.open()方法可以在close之后再次打开相应端口;关闭串口ser.close();通过串口写入ser.write(b\'\'),参数需要使用字节bytes类型,如果是str类型,则可以使用encode(\'utf-8\')的方式进行转换;读取模块信息的方法如下:
-> x= ser.read()读取一个字节,x=read(n)读取n个字节,readline()可以用来读取一行。 查看COM口工

python -m serial.tools.list_ports -v,可以列出所有串口名称及属性。

Serial参数说明

port端口名字,windows下为\'COM1\'等;

baudrate (int)波特率,可以设置的范围9600到115200;

bytesize为每个字节的比特数,设置值为FIVEBITS, SIXBITS,SEVENBITS, EIGHTBITS 5-8比特;

parity设置校验位PARITY_NONE, PARITY_EVEN,PARITY_ODD PARITY_MARK,PARITY_SPACE,用来设置校验位;stopbits停止位,用来指示字节完成,可以选择的设置STOPBITS_ONE,STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO;write_timeout(float) 写入超时设置;

timeout (float)读出超时设置;xonxoff (bool)软件流控开关;

rtscts (bool)硬件RTS/CTS流控开关;

dsrdtr (bool)硬件DSR/DTR流控开关。

关于UART流控两线方式没有硬件流控,四线方式采用DSR、DTR进行流控,而RS232标准中可以有DSR、DTR的流控方式。RTS-request to send; CTS- clear to send;DSR-data set ready;DTR-Data Terminal Ready。

一个简单示例:能自动检测串口,并连接此串口,收集串口的数据

#!usr/bin/python3.6  import serial import sys import os import time import re  global MAX_LOOP_NUM global newCmd MAX_LOOP_NUM = 10   def waitForCmdOKRsp():     maxloopNum = 0     while True:         line = ser.readline()         maxloopNum = maxloopNum + 1                   try:             print("Rsponse : %s"%line.decode(\'utf-8\'))         except:             pass                  if ( re.search(b\'OK\',line)):             break          elif(maxloopNum > MAX_LOOP_NUM):             sys.exit(0)   def sendAT_Cmd(serInstance,atCmdStr,waitforOk):     print("Command: %s"%atCmdStr)     serInstance.write(atCmdStr.encode(\'utf-8\'))     #or define b\'string\',bytes should be used not str     if(waitforOk == 1):         waitForCmdOKRsp()     else:         waitForCmdRsp()  ser = serial.Serial("COM5",9600,timeout=30) sendAT_Cmd(ser,\'AT+CFUN=1\\r\',1) ser.close()

综合上面的两个代码,能自动检测串口,并连接此串口,收集串口的数据

# !usr/bin/python3.6  import serial import sys import os import time import re  import serial.tools.list_ports  global MAX_LOOP_NUM global newCmd  MAX_LOOP_NUM = 10   def waitForCmdOKRsp():     maxloopNum = 0      while True:          line = ser.readline()                              #读取一行数据         maxloopNum = maxloopNum + 1                        #计算读取长度          try:             print("Rsponse : %s" % line.decode(\'utf-8\'))  #串口接收到数据,然后显示         except:             pass          if (re.search(b\'OK\', line)):             break         elif (maxloopNum > MAX_LOOP_NUM):             sys.exit(0)   def sendAT_Cmd(serInstance, atCmdStr, waitforOk):    # print("Command: %s" % atCmdStr)     serInstance.write(atCmdStr.encode(\'utf-8\'))   # atCmdStr  波特率     # or define b\'string\',bytes should be used not str      if (waitforOk == 1):         waitForCmdOKRsp()     else:         waitForCmdRsp()   plist = list(serial.tools.list_ports.comports())  if len(plist) <= 0:     print("没有发现端口!") else:     plist_0 = list(plist[0])     serialName = plist_0[0]       #先自动检测串口, 检测到可用串口,取出串口名  #ser = serial.Serial("COM6", 115200, timeout=30) ser = serial.Serial(serialName, 115200, timeout=30)  # timeout=30 30s print("可用端口名>>>", ser.name) sendAT_Cmd(ser, \'AT+CFUN=1\\r\', 1) ser.close() 

运行效果:

我用CC2530(Zigbee),采集了温度、湿度的数据,通过串口和电脑连接,运行此程序后,能自动检测到串口,然后获取 CC2530的数据,然后显示在电脑端。

希望对你有帮助。


当前标题:基于pyserial【Python串口通信】
链接分享:http://pwwzsj.com/article/checgi.html