如何在Windows上将Python脚本中的串行数据发送到Arduino-什么都不起作用

2024-05-16 16:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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++的一个串行库,但也没用。


Tags: right脚本timeserialleftarduinoserwrite
3条回答

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

我刚遇到类似的事。这里的关键是它在从IDE与arduino通信时工作,而在使用其他串行程序时失败。您已经被auto-reset功能所取代。

查看this link on the Arduino Playground以获取有关正在进行的操作以及如何处理的详细说明。根据你的技能和舒适程度,网站提供了几种解决方案。

我希望您的C++代码一旦实现了这个站点的一个工作,就会起作用。

如果我正确理解您的物理设置,那么Arudino IDE和python之间似乎存在冲突。默认情况下,一次只能有一个程序打开串行端口(比如打开文件进行独占写入)。如果您只是使用python脚本,不要启动arduino IDE,并将ardiuno更改为在收到消息时打开LED,这应该可以工作(如果串行端口分配正确)。arduino的诊断指示灯应该在正常串行通信情况下闪烁,但对于单个消息,您可能缺少短闪烁。

在IDE和Arduinos之间使用串行端口似乎也有冲突。(我不明白多个ardinos的原因。)每个串行通信对都应该是唯一的。使用Arduino的软件串行库使用另一对数字管脚在arduinos之间进行通信,而不是FTDI芯片当前使用的d0/d1管脚与IDE进行通信。

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

相关问题 更多 >