将串行数据发送到 arduino 可以在串行监视器中使用,但不能在 python 中使用

Posted

技术标签:

【中文标题】将串行数据发送到 arduino 可以在串行监视器中使用,但不能在 python 中使用【英文标题】:sending serial data to arduino works in serial monitor, but not in python 【发布时间】:2021-09-24 15:27:50 【问题描述】:

我正在尝试通过 python 脚本将我的 arduino 上的一个位从 0 翻转到 1。如果我在串行监视器中输入 1 并按 Enter,以下 arduino 代码可以很好地打开 LED:

int x;

void setup() 
  // this code proves that the LED is working
  digitalWrite(7, HIGH);
  delay(300);
  digitalWrite(7, LOW);
  Serial.begin(115200);


void loop() 
  Serial.print(x);
  if(Serial.available())
    x = Serial.parseInt();
    // if x is anything other than 0, turn the LED on
    if (x)
      digitalWrite(7, HIGH);
    
  

但是当我尝试使用这个 python 脚本时,变量 x 可能保持为 0,因为 LED 没有打开:

import serial
import time
arduino = serial.Serial(port='COM3', baudrate=115200, timeout=5)
time.sleep(5)
print(arduino.read())
arduino.write(b"\x01")
print(arduino.read())
arduino.close()

我将两个打印语句放入以试图弄清楚发生了什么,但我无法理解输出。通常是

b'0'
b'0'

但有时是

b'0'
b''

或者如果我在插入 arduino 后立即运行脚本:

b'\x10'
b'\x02'

或其他一些随机数。 我在这里做错了什么?

【问题讨论】:

也许你的python脚本应该发送1并输入。 【参考方案1】:

使用bytes("1", "<encoding>") 代替b"\x01" 可能会起作用,其中编码是您的python 文件的编码(如utf-8),虽然我不确定有什么区别。

另一个可能的错误原因:您的波特率非常大。对于这样简单的事情,您不需要这么大的波特率;使用标准的 9600 可以正常工作。尝试更改波特率,看看是否有帮助。

【讨论】:

顺便说一句,如果设置使用 USB 串行端口,我认为 115200 不会很大。 @quamrana:是的,但是对于这样的事情来说它太大了。这不是在进行大数据传输或类似的事情;它只是控制一个LED。在这种情况下,将其从 115200 更改为 9600 的速度几乎没有任何差异。最好消除所有可能的问题原因。 嗯,是的,至少他们可以先将其更改为 9600 以使其正常工作,然后再次更改以查看是否有帮助。无论如何,它目前归结为消息的数据内容。我们等待 OP。 最终不是波特率,而是字节(“1”,“utf-8”)修复它

以上是关于将串行数据发送到 arduino 可以在串行监视器中使用,但不能在 python 中使用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在从 Processing 接收数据的同时同时使用 Arduino 串行监视器?

使用 pyserial 将数据发送到串行 - 在 Razor 9DOF IMU 上工作

如何将浮点值从一个蓝牙模块发送到其他模块(HC 05)

arduino_1.0.1的串口监视器应该怎么用?

串行python到arduino

Java 未正确发送到串行端口