pyserial串口通信

  • Post author:
  • Post category:其他




python的串口通信模块—pyserial

import serial导入模块

ser = serial.Serial(0) 是打开第一个串口

ser.write(“hello") 就是往串口里面写数据

ser.close() 就是关闭ser表示的串口

ser.open() 会打开这个串口

ser = serial.Serial('COM1', 115200) 来设置波特率,当然还有专门的函数

data = ser.read()可以读一个字符

data = ser.read(20) 是读20个字符

data = ser.readline() 是读一行,以/n结束,要是没有/n就一直读,阻塞。

data = ser.readlines()和ser.xreadlines()都需要设置超时时间

ser 来查看当前串口的状态

ser.isOpen() 看看这个串口是否已经被打开

参考:

https://www.cnblogs.com/zhengweizhao/p/8426826.html

作者自己的例子也很好。

一个比较经典的串口操作框架(python 使用线程接收串口数据,并同时可进行串口数据发送

https://blog.csdn.net/xiaoeleis/article/details/81484872):

import serial
import time
import threading

class SerialPort:
	message='' 
	def __init__(self,port,buand):
		super(SerialPort, self).__init__()
		self.port=serial.Serial(port,buand)
		self.port.close()
		if not self.port.isOpen():
			self.port.open()
	def port_open(self):
		if not self.port.isOpen():
			self.port.open()
	def port_close(self):
		self.port.close()
	def send_data(self):
			data = input("请输入要发送的数据(非中文)并同时接收数据: ")
			n=self.port.write((data+'\n').encode())
			return n
	def read_data(self):
		while True:
			self.message=self.port.readline()
			print(self.message)
 
serialPort="COM3"   #串口
baudRate=115200       #波特率
 
if __name__=='__main__':
    
	mSerial=SerialPort(serialPort,baudRate)
	t1=threading.Thread(target=mSerial.read_data) 
 
	t1.start()
	while True:
         time.sleep(3)
         mSerial.send_data()  

我自己的串口:

写在一个github仓库里,

https://github.com/liruijuan/facefollow方便自己以后看。


主要实现的功能是人脸跟踪的小程序,使用pyserial模块对摄像头串口调用并发指令。其中一些比较麻烦的是16进制、10进制、bytes等之间的转换。



python–常用的十进制、16进制、字符串、字节串之间的转换

参考:

https://www.cnblogs.com/fqfanqi/p/7900758.html

但还是需要普及一下这些基本的知识(也就是

自己遇到的问题

):



10进制转16进制:

hex(16) ==> 0x10

如上:
a = 40
b = hex(a)
print(b)    ## 结果为 0x28

但是:
Send_Buff=[]
m_Angle = 40
in_buff_m_Angle = hex(m_Angle) # 将数据转成十六进制字符串
print(in_buff_m_Angle)    ## 结果为 0x28
move_attr = [0x5A, 0x5A, 0x08, 0x06, 0x32, in_buff_m_Angle, 0x00]
for i in range(0,7):
	Send_Buff.append(move_attr[i])
print(Send_Buff)    ##  结果为 [90, 90, 8, 6, 50, '0x28', 0]


[90, 90, 8, 6, 50, ‘0x28’, 0]


这个结果让我好愁啊。

于是乎,我就直接把十进制数值放到数组里:

Send_Buff=[]
m_Angle = 40
move_attr = [0x5A, 0x5A, 0x08, 0x06, 0x32, m_Angle , 0x00]
for i in range(0,7):
	Send_Buff.append(move_attr[i])
print(Send_Buff)    ##结果为[90, 90, 8, 6, 50,40, 0]

然后将结果转化为bytes传入:

ser.write(bytes(Send_Buff))

这样的话又会出现另一个问题:如果m_Angle为负值(如-40)怎么办?

会出现个错误

ValueError: bytes must be in range(0, 256)

其实负数的16进制为:256-它绝对值==256+它

上一句具体为:大意是 (假定x为正数):y= x % 256, 然后256 – y(若x为负数是256+y),然后在对结果进行十六进制转换(上一篇中有介绍)

Send_Buff=[]
m_Angle = -40
m_Angle_in = 256 + m_Angle 
move_attr = [0x5A, 0x5A, 0x08, 0x06, 0x32, m_Angle_in , 0xFF]
for i in range(0,7):
	Send_Buff.append(move_attr[i])
print(Send_Buff)    ##结果为[90, 90, 8, 6, 50, 216, 255]

然后就可以进行转bytes的运算了。但是可能还是有些地方不合理,以后还要改。



b’\xa5’ 转 0xa5:
myout = ser.read(1)  #逐一字节接收
print(myout)   ## 结果为b'\xa5'
rcvdat =ord(myout)    ##结果为0xa5-----这个才是我想要的结果

如上:ord()的作用是:将字符转化为ASCII码

例子:

# 用户输入字符
c = input("请输入一个字符: ")
# 用户输入ASCII码,并将输入的数字转为整型
a = int(input("请输入一个ASCII码: "))

print( c + " 的ASCII 码为", ord(c))
print( a , " 对应的字符为", chr(a))

输出结果:

请输入一个字符: a
请输入一个ASCII码: 101
a 的ASCII 码为 97
101  对应的字符为 e

参考:

http://www.php.cn/python-tutorials-409018.html