当前位置: 首页 > 知识库问答 >
问题:

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

陈俊郎
2024-01-18

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

import serialimport threading  # 导入线程包import timeimport sys#串口初始化data_ser = serial.Serial()data_ser.port='ttyUSB0'data_ser.baudrate=115200data_ser.bytesize=8data_ser.stopbits=1data_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个答案

孟杰
2024-01-18

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

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

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

 类似资料:
  • 本文向大家介绍Python中的Socket 与 ScoketServer 通信及遇到问题解决方法,包括了Python中的Socket 与 ScoketServer 通信及遇到问题解决方法的使用技巧和注意事项,需要的朋友参考一下 Socket有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢。其中【recv(1024)】表示从缓冲区里取

  • 问题内容: 我正在尝试执行Java邮件,并且收到错误消息“无法将命令发送到SMTP主机”。任何帮助,将不胜感激。以及任何将来可能出现的问题的解决方案。确切的例外是 我的代码如下 问题答案: 服务器需要STARTTLS。如果我使用telnet进行手动SMTP会话,则会得到以下信息: 该服务器不接受未加密的连接

  • 本文向大家介绍解决Windows下python和pip命令无法使用的问题,包括了解决Windows下python和pip命令无法使用的问题的使用技巧和注意事项,需要的朋友参考一下 一. python命令找不到 安装python之后经常会出现下面的问题 , python命令找不到,这是因为Windows的环境变量中没有定义python的安装路径 这个时候我们先找到python的安装路径(或者在Pyt

  • 我试图用python控制总共6个LED。我使用pyserial向arduino发送一些数据,但遇到了几个问题。 我遇到的第一个问题是: 根据我在arduino上编写的代码,LEDS应该在接收到的特定数据中闪烁1秒。(这稍后会在下面解释。)但是,LEDS停留在它们应该闪烁的秒数上。这意味着如果LEDS应该闪烁10次。LEDS保持10秒并关闭。 第二个问题是: 我在代码中输入的if条件不符合顺序。正如

  • 问题内容: 我正在尝试为python安装MySql接口,但出现错误(如下所述)。我知道解决方案:安装Microsoft Visual C 。除了安装Microsoft Visual C ,还有其他解决方案吗?我的意思是这真的伤害了我。我为什么要安装Microsoft Visual C ++仅仅是因为构建单个程序包,从开发人员的角度来看,这是一种无用且浪费时间的方法。这个问题有其他解决方案吗? 我在

  • 本文向大家介绍解决python xlrd无法读取excel文件的问题,包括了解决python xlrd无法读取excel文件的问题的使用技巧和注意事项,需要的朋友参考一下 读取文件时报错: 该xls文件在打开时确实会警告该文件与扩展名格式不一致。用文本编辑器打开该xls文件查看,发现确实不是xls文件,而是xml文件被保存为了xls文件。 解决办法:将文件后缀名改为.xml,作为xml文件读入。