
前言
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的数据,然后显示在电脑端。
希望对你有帮助。
更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码官网:www.west.cn