【问题标题】:pySerial very strange behaviour ... Code works when executed in shell but not in a scriptpySerial 非常奇怪的行为......代码在 shell 中执行时有效,但在脚本中无效
【发布时间】:2016-03-08 21:51:38
【问题描述】:

我正在为 pySerial 苦苦挣扎。简而言之……下面的代码在 Python Shell 中执行时效果很好……

>>> import serial
>>> s=serial.Serial("COM5", 9600)
>>> while(1):
       s.write("#")
       s.readline()

在 shell 中产生以下输出:

1L
'56.73\r\n'
1L
'56.73\r\n'

当在脚本中写入相同的代码时说“readSerial.py”,该脚本要么不发送触发串行设备发送数据的主题标签,要么不接收回复的数据。

我正在使用 pySerial 3,但注意到与 2.7 相同的行为。在 Win10 上使用 Python 2.7.10 64 位。但也注意到在带有 /dev/ttyACM0 的 Raspberry Pi 上的这种行为。我真的很想解决这个问题。我在 Python 方面没有那么丰富的经验,所以这可能是一个疏忽。

硬件检查和双重检查。

谢谢,

KK


谢谢,但我真的知道如何从 Python 打印数据。问题出在 pySerial 上。这是完整的代码,请不要在注释掉的代码中讨论错误。这些在这里无关紧要。

#from numpy import array
#import matplotlib.animation as animation
import time
import serial as s

#data = array([])

Arduino = s.Serial("COM5", 9600)
i = 0

while (1):
    try:
         Arduino.write("#")
         time.sleep(.1)
         inString = Arduino.readline()
         data = float(inString)

         print i, ":", data
         i += 1

         time.sleep(1)

    except KeyboardInterrupt:
        break

Arduino.close()

但是就像说这行不通。据我所知, readline() 函数没有返回。而且......通过设置 tx 超时让它返回真的没有意义。增加谜团;当代码被调试(即阶梯式)时,它确实可以工作。

提前致谢,

KK

【问题讨论】:

  • 我根本看不到该代码如何产生 any shell 输出。它没有打印语句。
  • @John 我认为他在谈论 Pi 上的输出,它可能连接在 COM5 上(我知道它至少可以与 Arduino 一起工作)。 @K到目前为止,您尝试了什么?快速的谷歌搜索显示了很多类似问题的结果,例如stackoverflow.com/questions/2301127/…
  • 即便如此,发生的唯一输出是s.write("#"),我看不出它如何转化为假定的给定输出。
  • @John,它连接到 COM5 的 arduino,但这无关紧要。在脚本中有很多打印语句。 arduino 使用来自传感器和 Windows 线路终端的数据回复主题标签。尽管接收到数据,但 readline() 或 read() 函数在调用时永远不会返回。
  • @whrrgarbl 我再次查看了您发布的链接...确实有很多类似的帖子,但我从未找到解决问题的帖子...我最喜欢的是“pySerial 无法在 Windows AMD64 上运行”或“计算机速度很快”我注意到在 Raspberry Pi B 上的 Raspbian Linux 上存在相同的行为。您可以了解很多关于 RPi 的信息,但它并不快.

标签: python pyserial


【解决方案1】:

来自FAQ

示例在 serial.tools.miniterm 中有效,但在脚本中无效。

端口打开时,RTS 和 DTR 线会切换。这可能 在连接的设备上进行一些处理或重置。在这样一个 情况下,紧随其后的 write() 调用可能不会被 设备。

打开端口后,第一次 write() 之前的 延迟,是 在这种情况下推荐。例如。一个 time.sleep(1)

【讨论】:

  • 我阅读了常见问题解答。不,事实并非如此……而是进一步缩小问题范围。我已经尝试将 FTDI USB 上的 Tx 和 Rx 线桥接到 Arduino 的串行转换器上 -> 脚本的工作原理很吸引人,但它在 COM4 处被索引。当我使用相同的软件和 Mega2560(索引为 COM4)时,脚本就像一个魅力!
  • 哇,这是我遇到过的最难的论坛软件,无法编辑我以前的帖子。到了手头:实际上再次阅读您的答案并在创建串行对象后摆弄睡眠时间,问题就解决了。我有一些原始的意大利 Arduino 东西放在周围,所有的东西都像魅力一样,即使是很短的延迟。不幸的是,我也有一些廉价的中国仿冒品(即 Infiduino Uno R3),它们需要 2 秒的延迟。
  • 您可以编辑 cmets 5 分钟。之后,您可以随时复制/擦除/粘贴修改。您可以无时间限制地编辑问题答案
  • 是的,我应该留个便条,为什么我从常见问题解答中发布行。原始代码在打开和第一次写入之间没有延迟。
  • Intel 的 Genuino 101 工作起来就像一个魅力,没有延迟,完全取决于 USB 串行接口。
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多