|
发表于 2023-7-27 18:01:48
|
显示全部楼层
回帖奖励 +20 鱼币
问题描述:在给串口发送数据后,串口接收线程中标橙色位置接收到的数据一直是0,无法正确接收数据。
问题分析:在代码中的串口接收线程 uart_recv_thread 中,通过 self.serial.read(self.serial.inWaiting()) 读取串口缓冲区的数据,但是此方法可能会返回空的数据,导致打印出来的结果为0。可能原因是串口缓冲区中没有数据或者读取数据出现异常。
解决方案:为了解决这个问题,我们可以做以下改进:
1. 在读取串口数据之前,先检查串口缓冲区是否有数据可读。
2. 当读取数据出现异常时,输出错误信息,方便排查问题。
下面是改进后的代码:
- import sys
- import serial
- import threading
- from time import sleep
- class Uart(object):
- def __init__(self, port, baud):
- self.err = 0
- # open serial
- try:
- self.serial = serial.Serial(port, baud)
- print("open serial success.")
- except:
- print("open serial error!")
- self.err = -1
- def uart_recv_thread(self):
- print("start uart_recv_thread.")
- while True:
- sleep(0.02)
- try:
- recv_len = self.serial.inWaiting()
- if recv_len > 0:
- recv_data_raw = self.serial.read(recv_len)
- if recv_data_raw:
- data = "DEVICE---->PC: " + recv_data_raw.decode()
- print(data)
- except Exception as e:
- print("recv data error:", e)
- break
- def start_recv_thread(self):
- thread = threading.Thread(target=self.uart_recv_thread, daemon=True)
- thread.start()
- def send_uart_data(self, data):
- self.serial.write(data.encode())
- def uart_close(self):
- self.serial.close()
- if __name__ == "__main__":
- myuart = Uart("COM1", 9600)
- if 0 == myuart.err:
- print("Init Uart Success.")
- # 如果打开串口成功,启动接收线程,准备实时的接收数据
- myuart.start_recv_thread()
- while True:
- input_data = input("Please input data...")
- if input_data == "quit":
- # 退出
- myuart.uart_close()
- break
- else:
- # 发送数据给设备
- myuart.send_uart_data(input_data)
- sleep(0.01)
- print("exit!")
复制代码
请注意,这里使用了 try-except 块来捕获异常,并输出错误信息。同时,在读取串口数据时,直接读取指定长度的数据,而不是使用 self.serial.inWaiting() 多次读取。这样可以避免读取过程中出现新的数据而导致旧数据被丢弃。
使用改进后的代码,你应该能够正确地接收串口数据。如果问题仍然存在,请检查串口连接、串口设置以及串口设备的工作状态。 |
|