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