Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Python Arduino串行通信_Python_Arduino_Bytearray_Serial Communication - Fatal编程技术网

Python Arduino串行通信

Python Arduino串行通信,python,arduino,bytearray,serial-communication,Python,Arduino,Bytearray,Serial Communication,因此,我在Python和Arduino Uno之间的串行通信中遇到了问题。我让Python通过串行通信将数字38(以及其他数字)通过bytearray发送到Arduino,然后返回Python 我正在发送的阵列是: [230, 0, 0, 0, 38] 它正在打印的数组(使用print()时)是: 符号之所以存在,是因为在字节数组的打印过程中有一个奇怪的细微差别,即当数字在某个范围(抱歉,我记不起该范围)之间时,它会以ASCII而不是十六进制打印出来,因此我发送给Arduino的数组应该仍

因此,我在Python和Arduino Uno之间的串行通信中遇到了问题。我让Python通过串行通信将数字38(以及其他数字)通过bytearray发送到Arduino,然后返回Python

我正在发送的阵列是:

 [230, 0, 0, 0, 38] 
它正在打印的数组(使用print()时)是:

符号之所以存在,是因为在字节数组的打印过程中有一个奇怪的细微差别,即当数字在某个范围(抱歉,我记不起该范围)之间时,它会以ASCII而不是十六进制打印出来,因此我发送给Arduino的数组应该仍然具有所需的所有信息

我通过以下方式收到Arduino的信息:

char values[5];    
Serial.readbytes(values, 5);
一旦arduino提供了这些信息,我就使用Serial.write将其发送回Python,并在Python中打印出来,以确保收到了正确的信息。在Python中接收的输出是:

b'\xe6\x00\x00\x00\xf6' 
如果0xe6为230(正确),0xf6为246(不正确),则应为38的十六进制值,即0x26

有人对如何解决这个问题有什么建议吗?任何建议或帮助将不胜感激

编辑:
发现我的问题时,我不小心放错了一个负号“0”,因为有一次我认为我必须将信息从ASCII转换为十六进制,但事实证明我没有。谢谢你的帮助

test.ino

char buffer[10] = {0,0,0,0,0,0,0,0,0,0};
void setup(){
    Serial.begin(9600);
}
void loop(){
    Serial.println(Serial.readBytes(buffer,5));
}
test.py

import serial
s=serial.Serial("COM5",timeout=5)
time.sleep(5) # wait a couple seconds
s.write(b"\xe6\x00\x00\x00&")
# or alternatively
# s.write(bytes(bytearray([0xe6,0x00,0x00,0x00,0x26])))
print(repr(s.read(1000)));

这就是最小代码示例的样子。。。它也应该工作…

test.ino

char buffer[10] = {0,0,0,0,0,0,0,0,0,0};
void setup(){
    Serial.begin(9600);
}
void loop(){
    Serial.println(Serial.readBytes(buffer,5));
}
test.py

import serial
s=serial.Serial("COM5",timeout=5)
time.sleep(5) # wait a couple seconds
s.write(b"\xe6\x00\x00\x00&")
# or alternatively
# s.write(bytes(bytearray([0xe6,0x00,0x00,0x00,0x26])))
print(repr(s.read(1000)));

这就是最小代码示例的样子。。。它也应该可以工作…

在c/c++中,ByTestRing通常必须以“\0”结尾(我使用了很多arduino serial和pyserial,我可以告诉你它在我尝试过的每种情况下都可以正常工作…)你能试着在其他数组索引位置发送除“0”之外的其他内容吗?(只是想看看它们是否会像预期的那样回来。)另外,这是python 3还是python 2?请尝试先发送
38
,然后再发送
230
,让我们知道结果是什么。您还可以举一个最小的示例,显示完全可复制的issue@Dan,我正在使用Python 3。尝试将[0,255,0,85,0]作为bytearray发送,收到了正确的数字,除了最后一个数字之外,它应该是\x00,而它给了我\xd0。在c/c++中,ByTestRing通常必须以“\0”结尾(我使用了很多arduino serial和pyserial,我可以告诉你,在我尝试过的每种情况下,它都可以正常工作…)是否可以尝试在其他数组索引位置发送除“0”之外的其他内容?(只是想看看它们是否会像预期的那样回来。)另外,这是python 3还是python 2?请尝试先发送
38
,然后再发送
230
,让我们知道结果是什么。您还可以举一个最小的示例,显示完全可复制的issue@Dan,我正在使用Python 3。尝试将[0,255,0,85,0]作为bytearray发送,并收到了正确的数字,除了最后一个数字之外,该数字应该是\x00,但它给了我\xd0。我认为您遗漏了一个小细节。问题是它们发送的是数组,而不是字节的十六进制值。十六进制值只是当数组在屏幕上打印时的输出,以在通过串行发送之前确认内容。这是一个好的开始。。。我添加了一个带有bytearray的评论。。。但是我没有弄乱它们,所以我不确定它会如何运行。测试了这个代码,它给了我输出:b'\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00'这是不对的。仅供参考,我在arduino代码中使用Serial.write()而不是Serial.println(),因为它使输出更可读。另外,Joran是对的,我正在通过s.write发送十六进制值,使用bytearray将数字转换为十六进制值。我认为您遗漏了一个小细节。问题是它们发送的是数组,而不是字节的十六进制值。十六进制值只是当数组在屏幕上打印时的输出,以在通过串行发送之前确认内容。这是一个好的开始。。。我添加了一个带有bytearray的评论。。。但是我没有弄乱它们,所以我不确定它会如何运行。测试了这个代码,它给了我输出:b'\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00'这是不对的。仅供参考,我在arduino代码中使用Serial.write()而不是Serial.println(),因为它使输出更可读。另外,Joran是对的,我正在通过s.write发送十六进制值,使用bytearray将数字转换为十六进制值。