我在Raspberry Pi(Python脚本)和Arduino nano/uno之间的串行通信方面遇到一些问题。我的两个设备都通过USB端口连接,当我直接从arduino IDE串行监视器发送命令时,arduino草图始终正确响应:
<Arduino is ready>
<MSG:GDI,RESPONSE:EMD-1707-1993,Time:7>
<MSG:GDI,RESPONSE:EMD-1707-1993,Time:23>
<MSG:GDI,RESPONSE:EMD-1707-1993,Time:26>
<MSG:GDI,RESPONSE:EMD-1707-1993,Time:30>
<MSG:GDI,RESPONSE:EMD-1707-1993,Time:34>
<MSG:GDI,RESPONSE:EMD-1707-1993,Time:38>
但是,当我运行python脚本,他发送相同的命令时,草图以随机方式响应。
覆盆子终端:
pi@raspberrypi:~/test/raspberry $ python test.py
Sending GDI command to device...
<GDI>
Traceback (most recent call last):
File "test.py", line 47, in <module>
response = read_from_device(serial_connection)
File "test.py", line 15, in read_from_device
while ord(current_char) != MSG_START_CHAR:
TypeError: ord() expected a character, but string of length 0 found
Arduino串行监视器:
<Arduino is ready>
MGIRSPi35
Mi代码为:
Arduino草图:
#include <EEPROM.h>
#define DEVICE_BAUD_RATE 9600
#define EEPROM_SIZE 1024
#define ID_PREFIX "EMD-"
#define MSG_START_CHAR '<'
#define MSG_END_CHAR '>'
#define MSG_GET_DEVICE_ID "GDI"
const byte buffSize = 40;
char inputBuffer[buffSize];
byte bytesRecvd = 0;
boolean readInProgress = false;
boolean newMsg = false;
char cmd[buffSize] = {0};
int pin = 0;
int value = 0;
unsigned long curMillis;
void setup() {
if(getDeviceId() == "") {
setDeviceId();
}
Serial.begin(DEVICE_BAUD_RATE);
while(!Serial) {
;
}
Serial.println("<Arduino is ready>");
}
void loop() {
curMillis = millis();
readMsg();
processCommand();
}
void readMsg() {
if(Serial.available() > 0) {
char x = Serial.read();
if(x == MSG_END_CHAR) {
readInProgress = false;
newMsg = true;
inputBuffer[bytesRecvd] = 0;
strcpy(cmd, inputBuffer);
}
if(readInProgress) {
inputBuffer[bytesRecvd] = x;
bytesRecvd++;
if(bytesRecvd == buffSize) {
bytesRecvd = buffSize - 1;
}
}
if(x == MSG_START_CHAR) {
bytesRecvd = 0;
readInProgress = true;
}
}
}
void processCommand() {
if(strcmp(cmd, MSG_GET_DEVICE_ID) == 0) {
sendMsg(getDeviceId());
} else {
sendMsg("Command Not Found");
}
}
void sendMsg(String response) {
if(newMsg) {
newMsg = false;
Serial.print("<MSG:");
Serial.print(cmd);
Serial.print(",RESPONSE:");
Serial.print(response);
Serial.print(",Time:");
Serial.print(curMillis >> 9);
Serial.println(">");
}
}
String getDeviceId() {
String id = "";
for(int i=0; i<EEPROM_SIZE; i++) {
int value = EEPROM.read(i);
if(value == 0xFF) {
return id;
}
id += char(value);
}
return id;
}
void setDeviceId() {
randomSeed(analogRead(0));
String id = ID_PREFIX + String(random(1000, 10000)) + "-" + String(random(1000, 10000));
for(int i=0; i<EEPROM_SIZE; i++) {
EEPROM.write(i, i<id.length() ? id.charAt(i) : 0xFF);
}
}
Python脚本:
#!/usr/bin/python
import os
import serial
MSG_START_CHAR = '<'
MSG_END_CHAR = '>'
MSG_GET_DEVICE_ID = 'GDI'
def read_from_device(serial_connection):
response = ""
current_char = "z"
while ord(current_char) != MSG_START_CHAR:
current_char = serial_connection.read()
while ord(current_char) != MSG_START_CHAR:
if ord(current_char) != MSG_START_CHAR:
response = response + current_char
current_char = serial_connection.read()
return(response)
def write_to_device(serial_connection, msg):
cmd = MSG_START_CHAR + msg + MSG_END_CHAR
print(cmd)
serial_connection.write(cmd)
with serial.Serial('/dev/ttyACM0', 9600, timeout=10) as serial_connection:
waiting_for_reply = False
if waiting_for_reply == False:
print('Sending {0} command to device...'.format(MSG_GET_DEVICE_ID))
write_to_device(serial_connection, MSG_GET_DEVICE_ID)
waiting_for_reply = True
if waiting_for_reply == True:
while serial_connection.inWaiting() == 0:
pass
response = read_from_device(serial_connection)
print('Reply Received: {0}'.format(response))
waiting_for_reply = False
serial_connection.close()
问题是您正在将int与字符串进行比较。在从\u设备读取\u的函数中,此行:
while ord(current_char) != MSG_START_CHAR:
当前字符是一个字符串
ord(当前字符)
是一个整数(实际上是一个字符串的ASCII值)
MSG\u START\u CHAR
是一个字符串
因此,比较是在int和字符串之间进行的。这将永远是False,因此而循环永远不会退出。最终,Arduino中不再有字符,此时您将在空字符串上执行
ord()
。这是不允许的,所以你在那一点上有一个追溯。
您根本不需要ord函数。在Python中,您只需直接处理字符串。
试试这个:
def read_from_device(serial_connection):
while serial_connection.read() != MSG_START_CHAR:
pass
response = ""
while True:
current_char = serial_connection.read()
if current_char == MSG_END_CHAR:
break
response = response + current_char
return response
有一件事我不知道:Arduino正在发送单字节字符。在Python3中(如果您使用的是Python3),所有字符都是unicode。我不知道串行库将如何处理这个问题。
我想用Python在我的树莓派和Arduino之间进行交流。到目前为止,Arduino成功地向Raspberry Pi发送了一条串行消息,并使用Python中的ser.readline()函数读取消息。但是当我想用IF语句闪烁连接到树莓派的led时,它就不起作用了 这是我的Arduino代码: 这是在我的Raspberry Pi上运行的Python代码: 这是我在终端中看到的:终端图像 我已经找了
我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。 这是我的主代码:'ulusetup(){Serial.begin(9600); }}//输出
我遇到了一个非常简单的问题。 我正在尝试制作一个Qt GUI应用程序,以从GUI控制我的Arduino(而不是从Arduino IDE的串行监视器控制它)。我能够使用QSerialPort Write()方法成功地向Arduino写入,但我无法从Arduino读取任何内容。从串行端口读取数据的唯一方法是在Qt代码的waitForBytesWrite()中的write()函数之后使用waitForR
我试图用python控制总共6个LED。我使用pyserial向arduino发送一些数据,但遇到了几个问题。 我遇到的第一个问题是: 根据我在arduino上编写的代码,LEDS应该在接收到的特定数据中闪烁1秒。(这稍后会在下面解释。)但是,LEDS停留在它们应该闪烁的秒数上。这意味着如果LEDS应该闪烁10次。LEDS保持10秒并关闭。 第二个问题是: 我在代码中输入的if条件不符合顺序。正如
我已经设法从我的arduino(Uno)到我的Raspberry Pi 3,通过串口进行了写操作。 如果我在pi端使用相同的python脚本,在arduino端使用相同的Sketch,但使用Teensy,我无法从Arduino读取任何输出。 根据串行通信,arduino Uno和teensy之间有什么区别吗? Arduino草图: 我的Pi上的Python脚本: 此代码适用于我的Arduino U
我在一个项目中,我想通过串行通信发送传感器数据从Arduino到PHP。 不幸的是,我无法读取PHP中的串行端口。然而,另一个方向(PHP到Arduino)工作得很好。我使用的是php_系列。班来自Rémy Sanchez的php,由Rizwan Kassim修改。我依赖于readPort()函数。 我在Mac OS X上使用Arduino UNO和Apache WAMP-Server。我应该实现