串口调试接收不到数据
import sysimport 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(self.serial.inWaiting())
if (recv_data_raw != None):
data = "DEVICE---->PC: " + recv_data_raw.decode()
print(data)
except:
print("recv data error!")
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!")
键盘向串口发送数据之后,标橙色的位置接受到的数据一直是0
问题分析:
根据您提供的代码,串口接收数据的部分存在一些问题。标橙色位置接收到的数据一直为0可能是因为在接收数据时使用了错误的方法。
解决方案:
请尝试修改uart_recv_thread方法中的接收数据部分,将self.serial.inWaiting()替换为self.serial.in_waiting,同时修改self.serial.read()中的参数为recv_len。以下是修改后的代码示例:
def uart_recv_thread(self):
print("start uart_recv_thread.")
while True:
sleep(0.02)
try:
recv_len = self.serial.in_waiting
if recv_len > 0:
recv_data_raw = self.serial.read(recv_len)
if recv_data_raw != None:
data = "DEVICE---->PC: " + recv_data_raw.decode()
print(data)
except:
print("recv data error!")
break
将上述修改后的代码应用到您的程序中,重新运行程序,查看是否能正确接收到串口数据。注意确保串口连接正确,波特率设置与设备一致。
这样修改后,您应该能够成功接收到从串口发送过来的数据了。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
根据你提供的代码,问题可能是在串口接收函数中。以下是可能导致接收数据一直为0的几种情况:
1. 数据未完全接收:在你的代码中,你使用了self.serial.inWaiting()获取可读取的字节数,并尝试读取相同数量的字节。但是,根据串口接收数据的速度,可能在调用self.serial.inWaiting()之后还未完全接收到数据,导致读取的字节数为0。为了解决这个问题,你可以修改代码,将recv_len = self.serial.inWaiting()的结果保存到变量中,在接下来的代码中使用这个变量来确保读取完整的数据。
2. 数据处理错误:在你的代码中,你使用recv_data_raw.decode()将接收到的原始数据解码为字符串。然而,当接收到的数据无法正确解码时,会引发异常。为了解决这个问题,你可以使用try-except结构来捕获解码异常,并进行适当的处理。
综上所述,你可以尝试以下修改来解决接收不到数据的问题:
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 is not None:
data = "DEVICE---->PC: " + recv_data_raw.decode()
print(data)
except Exception as e:
print("recv data error:", str(e))
break
这样修改后,可以确保使用完整的接收字节数来读取数据,并捕获解码异常,以便进行错误处理。希望这能解决你的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案 问题描述:在给串口发送数据后,串口接收线程中标橙色位置接收到的数据一直是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() 多次读取。这样可以避免读取过程中出现新的数据而导致旧数据被丢弃。
使用改进后的代码,你应该能够正确地接收串口数据。如果问题仍然存在,请检查串口连接、串口设置以及串口设备的工作状态。 脚本还带蹭鱼币的?!
页:
[1]