3

我无法从 Python 脚本通过串行方式正确地将数据发送到 Arduino Uno。我正在使用 9600 波特,并且 Arduino 正确重置,但它没有读取我从 Python 脚本发送的字符。我打电话time.sleep()以确保 Arduino 上的重置不会干扰,并且我使用的是 Windows 7。我应该澄清说我的桌面正在运行 python 脚本并通过 USB 连接到我的 Arduino Uno 的串行。然后,我将 Uno 的 RX 和 TX 引脚(引脚 0 和 1)连接到我的 Mega 的 Serial1(引脚 18 和 19)。然后,我在笔记本电脑(使用 Mega 的常规串行)上的 Arduino IDE 中使用串行监视器来查看 Uno 所看到的内容。这是 Mega 的代码:

void setup() {
  Serial1.begin(9600);
  Serial.begin(9600);
  Serial.println("Master Ready");
}

void loop() {
  if(Serial1.available() > 0) {
    char inByte = Serial1.read();
    Serial.write(inByte);
    Serial.write("\n");
  }
}

这是 Uno 的代码:

void setup() {
  Serial.begin(9600);
  Serial.println("Slave Ready");
}

void loop() {
 if(Serial.available() > 0) {
   char inByte = Serial.read();
   Serial.write(inByte);
   }
}

最后,这是 python 脚本:

import sys
import serial
import time

ser = serial.Serial("COM23",9600)
n = int(sys.argv[1])
print n

time.sleep(10)
print ser
print n == 41
if (n == 70):
    ser.write(chr(97))
    print 'a'
elif n == 41:
    ser.write('ggggggg')
    print 'b'
elif n == 42:
    ser.write('hello world')
    print 'c'
elif n == 25:
    ser.write(chr(100))
elif n == 26:
    ser.write(chr(101))
elif n == 22:
    ser.write(chr(102))
elif n == 10:
    ser.write(chr(103))
elif n == 4:
    ser.write(chr(104))
elif n == 14:
    ser.write(chr(105))
elif n == 7:
    ser.write(chr(106))
elif n == 11:
    ser.write(chr(105))
elif n == 5:
    ser.write(chr(106))
elif n == 17:
    ser.write(chr(107))

# head - a - 70
# right bicep - b - 41
# right forearm - c - 42
# left bicep - d - 25
# left forearm - e - 26
# chest - f - 22
# right thigh - g - 10
# left thigh - h - 4
# right shin - i - 11 - 14
# left shin - j - 5 - 7
# waist - k - 17

如果有帮助,我实际上是在尝试将 Doom3 中的命中位置通过串行方式写入 Arduino,以便 Arduino 可以在您身体的适当位置打开电机。游戏代码是用 C++ 编写的,我首先尝试使用 C++ 的串行库,但这也不起作用。

4

4 回答 4

2

我刚遇到类似的事情。这里的关键是它在从 IDE 与 arduino 通信时工作,而在使用其他一些串行程序时失败。你已经被这个auto-reset 特性所吸引了。

查看Arduino Playground 上的此链接,详细了解正在发生的事情以及如何处理它。该网站根据您的技能和舒适度提供了几种解决方案。

我希望您的 C++ 代码在您从该站点实现其中一种变通方法后将起作用。

于 2012-06-07T17:52:53.227 回答
1

如果我正确理解您的物理设置,Arudino IDE 和 python 之间似乎存在冲突。默认情况下,一次只能打开一个程序(如打开文件进行独占写入)。如果您只使用 python 脚本,请不要启动 arduino IDE 并更改 arduino 以在收到消息时打开 LED,这应该可以工作(如果您的串行端口分配正确)。arduino 的诊断 LED 应随着正常的串行流量闪烁,但对于单个消息,您可能会错过短暂的闪烁。

看起来IDE之间和Arduinos之间使用串行端口之间也存在冲突。(我不明白多个 Arduino 的原因。)每个串行通信对应该是唯一的。使用 Arduino 的 SoftwareSerial 库使用另一对数字引脚在 arduino 之间进行通信,而不是 FTDI 芯片当前用于与 IDE 通信的 d0/d1 引脚。

如果 python 脚本无法打开/与串行端口通信,可能还会在 python 脚本中包含一些诊断消息。

于 2012-05-18T11:47:28.167 回答
1

问题:

串行通信并不总是准确的。有时您会注意到,在串行监视器中,由于来自 Arduino 的两条或多条数据重叠,您不希望出现的垃圾数据。同样,尝试快速发送两个值并在串行监视器上打印该值,您会注意到相同类型的重叠。Arduino 需要一定的延迟才能有效工作,因此 pyserial 模块不是将 python 与 Arduino 一起使用的最佳方式。



解决方案:

1) 在你的 python 脚本中使用 ser.write() 或 ser.read() 函数两次!如果您觉得这很烦人,请使用下一个解决方案。


2 ) 使用 Arduino_Master_Delta 模块(python)与 Arduino 进行通信,该模块专门设计用于简化流程并通过先进的数据科学和可视化功能去除垃圾值。

pip 模块的链接是Arduino_Master_Delta

安装此模块后,您可以改用以下语句:

import Arduino_Master_Delta as amd
writeSerial(23, msg=' Whatever you want to send to the serial monitor')
# Data will be encoded into bytes and hence use the Serial.readString() in Arduino code
# and then convert the string to your desired data type!

阅读以上链接中的文档以了解更多信息!

顺便说一句,我是这个 python 模块的开发者。请分享您对此的看法。

于 2019-06-30T21:39:33.390 回答
0

我也遇到了串行通信问题,我设法通过关闭 Arduino 中的串行监视器来解决它。我不知道你是否在运行程序时打开它,但如果你这样做了,那可能就是问题所在。

于 2013-03-07T04:39:36.020 回答