Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Windows上将Python脚本中的串行数据发送到Arduino-什么都不起作用_C++_Python_Serial Port_Arduino - Fatal编程技术网

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

C++ 如何在Windows上将Python脚本中的串行数据发送到Arduino-什么都不起作用,c++,python,serial-port,arduino,C++,Python,Serial Port,Arduino,我无法正确地通过串行方式将数据从Python脚本发送到Arduino Uno。我使用9600波特,Arduino正确重置,但它不读取我从Python脚本发送的字符。我调用time.sleep()以确保Arduino上的重置不会干扰,我使用的是Windows 7。我应该澄清一下,我的桌面正在运行python脚本,并通过USB连接到我的Arduino Uno的序列号。然后,我将Uno的RX和TX引脚(引脚0和1)连接到Mega的Serial1(引脚18和19)。然后,我使用笔记本电脑上Arduino

我无法正确地通过串行方式将数据从Python脚本发送到Arduino Uno。我使用9600波特,Arduino正确重置,但它不读取我从Python脚本发送的字符。我调用
time.sleep()
以确保Arduino上的重置不会干扰,我使用的是Windows 7。我应该澄清一下,我的桌面正在运行python脚本,并通过USB连接到我的Arduino Uno的序列号。然后,我将Uno的RX和TX引脚(引脚0和1)连接到Mega的Serial1(引脚18和19)。然后,我使用笔记本电脑上Arduino IDE中的串行监视器(使用Mega的常规串行)查看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++的一个串行库,但也没用。

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

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


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

我刚刚遇到了类似的情况。这里的关键是,它在从IDE与arduino通信时工作,在使用其他串行程序时失败。您已被
自动重置
功能锁定

查看详细的描述,了解正在发生的事情以及如何应对。该网站根据您的技能和舒适度提供多种解决方案


<>我希望你的C++代码在你实现这个站点的一个工作时能起作用。

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

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



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


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

到pip模块的链接是 安装此模块后,您可以使用以下语句:

导入Arduino_Master_Delta作为amd
writeSerial(23,msg='您想发送到串行监视器的任何内容')
#数据将被编码为字节,因此在Arduino代码中使用Serial.readString()
#然后将字符串转换为所需的数据类型!
阅读以上链接中的文档了解更多


顺便说一句,我是这个python模块的开发人员。请分享您的观点。

您能进一步指出问题所在吗?例如,如果你让Mega在收到任何东西后闪烁,它会闪烁吗?你能确认Uno得到了命令吗?ArduinoIDE和python之间没有冲突。这就是为什么我们有两个Arduino的复杂设置。Arduino Uno通过USB从电脑游戏中捕获串行消息。然后UNO上的零号和一号引脚被馈送到Mega,这样Mega基本上可以窥视UNO发送的串行消息。Mega是唯一一个也连接到IDE的,因为Mega有多个序列。Serial1用于接收来自Uno的连接(Uno吐回它接收到的所有内容),Serial0用于打印到IDE。我还应该提到的是,我使用Arduino IDE代替电脑游戏进行了相同的设置。我的意思是一台计算机连接到Uno,另一台连接到Mega。Uno的计算机打开了IDE,并通过串口发送了一条消息。然后,UNo将同样的信息通过串口发送回来,并在另一台计算机上打印在Mega的IDE上。最后,我最初尝试了闪烁的LED,它工作正常。消息是通过串行方式发送的,只是格式不正确。在Mega上打印空行,有时打印奇数字符,因此我假设正在打印的某些字符没有实际的打印字符到屏幕上。例如,EON和换行符。为什么time.sleep(10)不能防止自动重置干扰?从我在网上的研究来看,这似乎是足够的时间来防止串行数据丢失