pySerial close() 后串口阻塞

缘由

考试也考完了,重修也考完了,接下来就是课设了,我的题目是上位机和下位机串口的通信,下位机就是51单片机,上位机老师没有要求用什么语言,我就取巧了用 Python。

不过还是被坑了,以前用 Python 采集过 GoPro 的实时视频,坑在玄幻的多线程上,Python 的多线程就是单线程,最后还是用多进程解决了。

其实这次也不算是 Python 的坑,是对串口的不了解造成的,这个毕设的事,打算过几天再写一篇来叙说一下。

现象

代码如下

import serial

# 连接 串口 python3
# window 和 mac 不同
# ser = serial.Serial('COM1', 9600)  windon
ser = serial.Serial('/dev/tty.usbserial', 9600) # mac

# 发送数据
ser.write(b'\01')

# 接受数据
print(ser.read())

# 发送数据
ser.write(b'\02')

# 关闭 串口
if ser.isOpen():
    ser.close()

嗯,看上去没什么问题,
嗯,连接串口,进行测试。
不对啊,怎么卡着了,
重新打开命令行,再次运行发现无法连接到串口了。
对于这个问题,重启电脑,然后又可以进行连接,我试了一下直接用 Python 的命令行,一行一行的输入,没问题。

解决方法

我尝试在 ser.write(b’\02’) 后面加 print(‘ok’),ok 能正常输出说明不是 write() 的问题。我又想着会不会是 write 函数写的数据达到一定数量后才发过去,存在一个缓冲区。所以在关闭串口的时候,缓冲区里面还有数据,我突然关闭串口,发生死锁了。我应该在 write 函数后,不需要再发送时,将缓冲区里面的数据全部发送过去,也就是清空缓冲区。
当我查看 pySerial API 时,发现有 flush() 函数

Flush of file like objects. In this case, wait until all data is written.

import serial

# 连接 串口 python3
# window 和 linux 不同
# ser = serial.Serial('COM1', 115200)  windon
ser = serial.Serial('/dev/tty.usbserial', 9600) # linux

# 发送数据
ser.write(b'\01')

# 接受数据
print(ser.read())

# 发送数据
ser.write(b'\02')
ser.flush()

#print('ok')

# 关闭 串口
if ser.isOpen():
    ser.close()

猜你喜欢

转载自blog.csdn.net/zwt520123/article/details/78945836