吴永铎 发表于 2023-7-27 18:01:21

串口调试接收不到数据

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

Mike_python小 发表于 2023-7-27 18:01:35

问题分析:
根据您提供的代码,串口接收数据的部分存在一些问题。标橙色位置接收到的数据一直为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:}

陶远航 发表于 2023-7-27 18:01:45

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


这样修改后,可以确保使用完整的接收字节数来读取数据,并捕获解码异常,以便进行错误处理。希望这能解决你的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-7-27 18:01:48

问题描述:在给串口发送数据后,串口接收线程中标橙色位置接收到的数据一直是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() 多次读取。这样可以避免读取过程中出现新的数据而导致旧数据被丢弃。

使用改进后的代码,你应该能够正确地接收串口数据。如果问题仍然存在,请检查串口连接、串口设置以及串口设备的工作状态。

sfqxx 发表于 2023-7-27 18:05:58

脚本还带蹭鱼币的?!
页: [1]
查看完整版本: 串口调试接收不到数据