【问题标题】:Exact same python3 code working in shell but not in script?完全相同的python3代码在shell中工作但不在脚本中?
【发布时间】:2019-12-31 10:42:24
【问题描述】:

我正在尝试通过串行向 Arduino 写入一个字符,该字符运行代码来控制 IR-led 以进行远程控制。

在 Arduino 终端中运行代码有效,LED 完成其工作。 Arduino 代码有效。
在shell中逐行运行,没问题。
但是当我运行“python remote.py”时它不起作用。

我尝试了一段额外的代码,以确保 shell 和解释器在命令提示符下运行相同版本的 python。

import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))

当我启动它时,它会生成“Python 3.7.3”,这是 shell 的版本。

这是整个 Python 代码:

import serial
ser = serial.Serial('COM7', 9600)
ser.write('a'.encode())
ser.close()

我意识到这不是很“Pythonic”,甚至不是完全正确,而是简化并尝试 并且尽可能少的代码我删掉了所有不需要的东西。 由于代码在shell中运行,它的正确性如何?

Arduino 代码在这里:https://pastebin.com/7T2yFzrL

我在 Windows 10 下使用 Python 3.7.3 和 Notepad++

我找到了这个帖子:Arduino Python3 script, 但我不明白我的代码如何在 shell 而不是脚本中工作?它可能是代码点(这意味着我不明白)但在这种情况下我该如何纠正它?也没有显示错误。我希望有人能引导我朝着正确的方向前进。

/最好的问候马格努斯

根据 T. Feix 的建议尝试添加我的代码,如下所示:

#! python3

    import serial

    try:
        ser = serial.Serial('COM7', 9600)
        ser.write('a'.encode())
        ser.close()
    except input() as ex:
        print(ex)

不幸的是它什么都没有返回,没有错误,什么都没有?

我在 Arduino 上的代码需要一个字符,而 Python 似乎发送一个字节,这可能是错误吗?如果是,我该如何更改这两种类型?

现在已将 Arduino 上的预期数据类型更改为字节,代码仍然可以在终端中运行,但在我运行 Python 脚本时没有运气。

【问题讨论】:

  • “它不起作用”是什么意思?
  • 代码似乎在运行,即 Arduino 接收到一些东西并且板载 LED 闪烁,但 IR-LED 上没有任何反应。虽然当我运行两段不同的代码时,它在 Arduino 上的闪烁并不相同。不知道为什么?
  • 命令提示符在执行停止时自动关闭窗口。可能会发生错误,但 cmd 提示会在发生后立即关闭窗口。怎么做:将您的整个代码包装在try .. except 中。对于除类型input()。然后您可以阅读错误消息并告诉我们。
  • 或者尝试使用IDLE Python。您可以在下载 Python 的同一个网站上找到它。
  • 我在运行之前打开了一个命令提示符窗口,所以它在执行后保持打开状态,但我尝试了这样的新代码 #! python3 import serial try: ser = serial.Serial('COM7', 9600) ser.write('a'.encode()) ser.close() except input() as ex: print(ex) 但它没有显示任何错误。我也弄错了吗?

标签: python python-3.x arduino pyserial


【解决方案1】:

问题解决了,我找到了以前没有找到的答案。

pySerial write() works fine in Python interpreter, but not Python script

这是脚本的快速执行,2 秒的小延迟起到了作用。

感谢所有对解决方案提出建议并打算结束的人。 祝大家新年快乐!

【讨论】:

  • 我就是这么说的。使用 flush() 等待字符实际传输!
【解决方案2】:

我已经用一个简单的环回厌倦了你的程序。它按预期工作:

import serial

try:
    ser = serial.Serial("/dev/ttyUSB0")
    print("Bytes Written: %d" % (ser.write("b".encode())))
    ser.flush()
    print(ser.read())
    ser.close()
except Exception as e:
    print(e)

输出:

Bytes Written: 1
b'b'

我已致电flush 以确保数据已写入物理端口。请参阅此link 了解更多信息。

文件类对象的刷新。在这种情况下,请等到所有数据都被写入。

看来您的电线或 arduino 代码可能存在问题。

【讨论】:

  • 试过你的代码,它确实输出了第一行“Bytes Written ....”,但它挂起,我必须关闭命令提示符?如果 Arduino 代码或接线有问题,为什么它在 shell 或 Arduino 终端上工作?
  • 已删除读取并再次运行。现在它运行没有任何评论,没有错误。但是Arduino仍然没有反应。我使用的是 Windows 10,我怀疑你使用的是 Linux,这可能是个问题吗?
  • 我认为您看到 TX/RX LED 闪烁。这意味着 Arduino 正在接收字节。
  • 是的,我同意,但有没有办法检查 Arduino 收到的内容?如果 Python 发送的内容多于预期的字符,那么问题就在那里。也许我可以在 Arduino 上写一些东西以某种方式解析传入的串行数据?但是,我又怎么知道会发生什么?
  • 是的。有两种方法。要么通过其他串行端口重新传输 arduino 接收到的数据(检查 SoftwareSerial),要么您可以在您的 arduino 中回显流并在 python 中读取它!
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 2022-12-29
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多