如何用python写个串口通信的程序

Python025

如何用python写个串口通信的程序,第1张

使用 pyserial 就可以处理串口通信,这个包是跨平台的。

http://pyserial.sourceforge.net/

示例程序在这里:

https://pyserial.readthedocs.io/en/latest/examples.html#wxpython-examples

import serial

# 创建serial实例

serialport = serial.Serial()

serialport.port = 'COM1'

serialport.baudrate = 9600

serialport.parity = 'N'

serialport.bytesize = 8

serialport.stopbits = 1

serialport.timeout = 0.6

try:

    serialport.open()

    serialport.setDTR(True)

    serialport.setRTS(True)

except Exception, ex:

    print ex

    

# 发送数据

serialport.write(raw_data)

# 根据项目要求,可以开一个线程扫描接收数据

Python非常适合写一些测试的脚本,如快速的串口通信测试等。如果使用VC++ QT开发,可能用时较多,使用python,如果掌握使用方法,可以直接读写测试,配合设备或是串口助手,很快验证与实现。Python有没有现成的串口API直接调用呢?经过实践验证,需要安装一个叫 Pyserial的组件即可。这个可以在github上下载。在windows 7 64bit 上可以使用吗?当然可以使用,我安装的python3.5为64位的。把下载后的文件,其中有一个serial的文件夹,拷贝到python35安装路径, C:\Python35\Lib\site-packages\serial网上可以搜一下windows的安装包,安装完也是:C:\Python35\Lib\site-packages\serial ,可以用最新的版本,替换即可。测试的方法:在python IDE里测试:>>>import serial这里如果报错,是python版本与pyserial版本没有配合好。如果正常,不返回,即可以导入serial模块。>>>ser=serial.Serial("COM5",115200)这里为COM5,115200的波特率。如果打不开,请检查安装环境。>>>ser.write('hello,serial test'.encode())17发送测试(如果返回字节数,说明返回成功),这里需要转换一个编码为字节。以上测试,可以使用现在的设备或是串口助手,如安装Virtual Serial Port Driver 7.2 虚拟串口软件,设置一对串口,进行自发自收的测试。>>>print(ser.read()line())b'abcdefg\r\n'这里是串口接收,有接收的超时。设备或是串口助手发送一个字符串,以回车换行结束,这里就可以收到打印出来。也可以用ser.read(),这里只接收一个字符来实现。上面已经实现了基本的串口操作。关闭串口为:>>>ser.close()如果使用python,一般写个py文件,就像windows bat 批处理一样,这是python强大的地方。如果写一个py脚本呢?其实只要把上面的命令,一条条写下来,就是一个脚本,测试如下:import serialser=serial.Serial("COM5",115200,timeout=0.5)for i in range(0,100-1):ser.write('hello\r\n'.encode())print(ser.readline())ser.close()

下载 pyserial包

def OpenCom(self,*args):#设置端口和波特率selComPort =‘com2’#波特率selBaudRate =9600 #奇偶校验selParity = 'N'try:if(not self.mySerial):self.mySerial = serial.Serial(port=selComPort, baudrate=selBaudRate,bytesize=8,parity=selParity,stopbits=1,timeout=5)else:if(self.mySerial.isOpen()):self.mySerial.close()self.mySerial = serial.Serial(port=selComPort, baudrate=selBaudRate, bytesize=8, parity=selParity, stopbits=1, timeout=5)self.lblInfo['text'] = '打开成功!'except Exception as ex:self.lblInfo['text'] = '打开失败!'

#使用com口发送modbus协议给终端设备。

def btnEmId_Click(self):

barray = bytearray([0x05, 0x03, 0xA#, 0x54, 0x00, 0x08])

vOldEmId = self.txbOldEmId.get()

vNewEmId = self.txbNewEmId.get()

barray[0] = int(vOldEmId)

barray[5] = int(vNewEmId)

#crc校验

strInput = utils.crc16_append(barray)

print(barray)

n = self.mySerial.write(barray)

if(n >0):

str = self.mySerial.readall()

self.lblInfo['text'] = 'success!'

# for s in str:

# print (hex(s))

else:

self.lblInfo['text'] = 'error!'