鱼C论坛

 找回密码
 立即注册
查看: 1666|回复: 4

串口调试接收不到数据

[复制链接]
发表于 2023-7-27 18:01:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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(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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-27 18:01:35 | 显示全部楼层

回帖奖励 +20 鱼币

问题分析:
根据您提供的代码,串口接收数据的部分存在一些问题。标橙色位置接收到的数据一直为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
将上述修改后的代码应用到您的程序中,重新运行程序,查看是否能正确接收到串口数据。注意确保串口连接正确,波特率设置与设备一致。

这样修改后,您应该能够成功接收到从串口发送过来的数据了。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 18:01:45 | 显示全部楼层

回帖奖励 +20 鱼币

根据你提供的代码,问题可能是在串口接收函数中。以下是可能导致接收数据一直为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

这样修改后,可以确保使用完整的接收字节数来读取数据,并捕获解码异常,以便进行错误处理。希望这能解决你的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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() 多次读取。这样可以避免读取过程中出现新的数据而导致旧数据被丢弃。

使用改进后的代码,你应该能够正确地接收串口数据。如果问题仍然存在,请检查串口连接、串口设置以及串口设备的工作状态。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-27 18:05:58 | 显示全部楼层
脚本还带蹭鱼币的?!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 07:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表