擅长:python、mysql、java
<p>这里可能会有很多问题,但请放心,pyserial并不是问题的根源。它使用底层操作系统的API与UART驱动程序通信。也就是说,您首先必须使用真正的Linux测试您的代码,以查看WSL是否导致了这种情况。即Linux和Windows UART缓冲区是否正确同步。
很抱歉,我无法判断您的代码中是否存在问题,因为我不知道您正在使用的设备,因此我无法猜测其通信通道末端发生了什么。请记住,在最好的情况下,单靠Windows操作系统可能会表现得很怪异,因此,请在这里为一些挫折做好准备。检查主板或USB2串行转换器驱动程序或您正在使用的任何硬件</p>
<p>接下来,您应该知道,如果没有设置超时,有时通信会变得混乱。为什么?没有人真正知道。因此,尝试设置超时。检查是否需要打开软件Xon/Xoff,以及与之通信的设备可能需要的其他RS232参数</p>
<p>另外,看看s.readline()是怎么回事,我个人不会使用它。超时可能会有所帮助,或者您可以将s.read(1024)与超时一起使用。我现在不记得了,但看看pyserial是否支持异步通信。如果有,您可以尝试使用它而不是标准的阻塞模式</p>
<p>另外,检查是否必须在s.write()之后强制刷新串行缓冲区,或在其之后添加睡眠。可能发生的情况是,设备未收到消息,但已激活读取请求。由于设备没有收到命令,因此没有响应。在您发送另一个命令后,IO缓冲区将被刷新,上一个将被传递,依此类推。串行通信很有趣,但当它遇到障碍时,它可能是a中的一个真正的P,相信我</p>
<p>现在,请检查设备是否仅发送“\r\n\r\n”或“\r\n”,或“\r”或“\n”作为响应。s、 readline()可能会混淆。首先,试着把两个s.readline()一个接一个地放在那里,然后打印出每个输出。如果设备发送双下线,则当您发送另一个命令时,s.readline()将在空行上停止,并且您的程序将收到一个空响应。s.readline()将通过缓冲区返回一个已存在但以前未读取的完整行</p>