Python串口通信问题:如何解决指令无法从PC发送到单片机的问题?

编写了一个基于python的串口通信,在ubuntu系统上通过串口来控制单片机,现在遇到的问题是运行python代码后,串口可以正常连接,但是指令没办法从PC端发到单片机端口,给单片机手动复位下后,指令就可以发送到单片机了,然后单片机正常控制电机。端口为ttyUSB0,端口权限也给了,实在想不明白什么问题,求大佬们解决一下。代码如下所示。

import serial
import threading  # 导入线程包
import time
import sys


#串口初始化
data_ser = serial.Serial()
data_ser.port='ttyUSB0'
data_ser.baudrate=115200
data_ser.bytesize=8
data_ser.stopbits=1
data_ser.parity="N"#奇偶校验位
data_ser.setDTR(False)
data_ser.setRTS(False)
try:
    data_ser.open()
    print(f"成功打开串口")
except serial.SerialException as e:
    print(f"无法打开串口: {e}")
    sys.exit(1)
stop_event = threading.Event()

def get_data():
    while not stop_event.is_set():  # 使用 Event 判断线程是否需要停止
        try:
            data_count = data_ser.inWaiting()
            if data_count != 0:
                recv = data_ser.read(data_ser.in_waiting).decode("gbk", errors="ignore")
                time.sleep(1)
                print(recv)
                process_received_data(recv)  # 在这里调用处理函数
        except Exception as e:
            print(f"读取串口数据时出错: {e}")
        time.sleep(0.1)
data_thread = threading.Thread(target=get_data)

def process_received_data(recv):
    # 假设 recv 是类似 "start:middle:end" 的形式
    start_marker = 'MaiChong2的值为:'
    end_marker = 'MaiChong3'

    # 找到起始和结束标记的位置
    start_index = recv.find(start_marker)
    end_index = recv.find(end_marker)

    if start_index != -1 and end_index != -1:
        # 从起始标记后到结束标记前的位置截取字符串
        middle_part = recv[start_index + len(start_marker):end_index].strip()
        print(middle_part)
    else:
        print(f"Start or End marker not found")
data_thread.start()
angle1 = 'abcd700e1500f1000g0h250i0' + 'j0k0l0\r\n'
data_ser.write(angle1.encode('utf-8'))
# 等待一段时间,让线程运行
time.sleep(5)

相同的程序将端口ttyUSB0换为COM11后,在windows系统上可以正常运行,不用手动复位。

阅读 1.3k
avatarAI BotBETA

这个问题可能是由于在连接单片机和PC时,两者之间的通信协议或参数不匹配所导致的。以下是一些可能的解决方案:

  1. 检查串口参数:确认串口的参数(波特率、数据位、停止位、奇偶校验等)是否与单片机所期望的参数相匹配。
  2. 检查指令格式:确认发送给单片机的指令格式是否正确。例如,确认指令的起始和结束标记是否正确,以及指令中的特殊字符是否进行了正确的编码。
  3. 检查DTR和RTS信号:在代码中,你设置了DTR和RTS信号为False。在一些单片机系统中,这些信号可能用于控制串口通信的开始和结束。如果需要,你可以尝试更改这些信号的状态。
  4. 检查串口驱动和固件:确认PC和单片机的串口驱动以及单片机的固件都是最新的,并且相互兼容。
  5. 检查硬件连接:确认PC和单片机之间的硬件连接是可靠的,没有短路或断路的情况。
  6. 使用串口调试工具:尝试使用串口调试工具(如PuTTY或RealTerm)来发送指令,看是否能成功发送。这可以帮助你判断问题是否出在Python代码上,还是出在硬件或驱动上。
  7. 查看系统日志和串口错误:检查系统的日志文件或串口的错误输出,看是否有任何关于通信失败的提示。

如果以上方法都不能解决问题,你可能需要更深入地调查这个问题,可能需要查看单片机的源代码或与单片机的制造商联系以获取更多的帮助。

1 个回答

serial发送和读取的函数调用之后,使用data_ser.flush()刷新一下缓存区就行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题