Arduino与Python之间的通信
我需要使用我的笔记本电脑与Arduino对话(发送一个命令来控制状态机,使之成为一个简单的自动售货机)。当我试图将该命令放入串行监视器时,一切看起来都很好,但当我通过python发送该命令时,该命令不起作用。看起来状态并没有像我预期的那样改变 以下是python代码:Arduino与Python之间的通信,python,arduino,pyserial,Python,Arduino,Pyserial,我需要使用我的笔记本电脑与Arduino对话(发送一个命令来控制状态机,使之成为一个简单的自动售货机)。当我试图将该命令放入串行监视器时,一切看起来都很好,但当我通过python发送该命令时,该命令不起作用。看起来状态并没有像我预期的那样改变 以下是python代码: def query(): cmd = "0" dev = serial.Serial("COM3", 9600,timeout=5) time.sleep(2) dev.write(cmd.encode("
def query():
cmd = "0"
dev = serial.Serial("COM3", 9600,timeout=5)
time.sleep(2)
dev.write(cmd.encode("utf-8"))
print("Pyhton: Query ",dev.readline())
#time.sleep(1)
#print(dev.readline())
def up():
cmd = "1"
dev = serial.Serial("COM3", 9600)
time.sleep(2)
dev.write(cmd.encode("utf-8"))
print("Pyhton: up ",dev.readline())
#time.sleep(1)
#print(dev.readline())
def pickup():
cmd = "2"
dev = serial.Serial("COM3", 9600)
time.sleep(2)
dev.write(cmd.encode("utf-8"))
print("Pyhton: pickup ",dev.readline())
#time.sleep(1)
#print(dev.readline())
def ship():
cmd = "3"
dev = serial.Serial("COM3", 9600)
time.sleep(2)
dev.write(cmd.encode("utf-8"))
print("Pyhton: ship ",dev.readline())
#time.sleep(1)
#print(dev.readline())
def origin():
cmd = "4"
dev = serial.Serial("COM3", 9600)
time.sleep(2)
dev.write(cmd.encode("utf-8"))
print("Pyhton: origin ",dev.readline())
#time.sleep(1)
#print(dev.readline())
tokenDict = {
"001":query,
"002":up,
"003":ship,
"004":pickup,
"005":origin
}
lineList = [line.rstrip('\n') for line in open("cmd.txt")]
for line in lineList:
time.sleep(1)
functionToCall = tokenDict[line]
functionToCall()
以下是Arduino代码:
int cmd = 0;
enum {IDLEx, UP, PICKUP, SHIP, ORIGIN};
uint8_t STATE = IDLEx;
void setup() {
Serial.begin(9600);
//Serial.flush();
pinMode(LED_BUILTIN, OUTPUT);
}
void readSerialData() {
if (Serial.available()>0) {
delay(300);
//cmd = Serial.readStringUntil('\n');
cmd = Serial.read();
process_serial(cmd, &STATE);
//test(cmd);
}
}
void process_serial(int data, uint8_t *state)
{
switch (*state)
{
case IDLEx: {
if (data == '0') {
*state = IDLEx;
Serial.println("Arduino: IDLE");
} else if (data == '1' ) { //go to up state
*state = UP;
//Serial.println("Arduino: Up");
} else if (data == '2') {
*state = PICKUP;
//Serial.println("Arduino: PICKUP");
} else if (data == '3') {
//Serial.println("Arduino: SHIP");
*state = SHIP;
} else if (data == '4') {
//Serial.println("Arduino: ORIGIN");
*state = ORIGIN;
}
break;
}
case UP: {
Serial.println("Arduino: UP");
delay(1000);
*state = PICKUP;
break;
}
case PICKUP: {
Serial.println("Arduino: PICKUP");
delay(1000);
*state = SHIP;
break;
}
case SHIP: {
Serial.println("Arduino: SHIP");
delay(1000);
*state = ORIGIN;
break;
}
case ORIGIN: {
Serial.println("Arduino: ORIGIN");
delay(1000);
*state = IDLEx;
}
break;
}
}
void loop() {
//Serial.println(STATE);
readSerialData();
}
我从文本文件中读取命令,如下所示
001
001
002
001
001
003
001
004
001
005
以下是我期望的输出:
Pyhton: Query b'Arduino: IDLE\r\n'
Pyhton: Query b'Arduino: IDLE\r\n'
Pyhton: up b'Arduino: Up\r\n'
Pyhton: Query b'Arduino: Up\r\n'
Pyhton: Query b'Arduino: Up\r\n'
Pyhton: ship b'Arduino: SHIP\r\n'
Pyhton: Query b'Arduino: SHIP\r\n'
Pyhton: pickup b'Arduino: PICKUP\r\n'
Pyhton: Query b'Arduino: PICKUP\r\n'
Pyhton: origin b'Arduino: ORIGIN\r\n'
我的问题是,当我将数据发送到Arduino时,Arduino似乎没有改变状态(以大小写作为代码),请注意,我使用的是Arduino nano 328和python 3.x,有人能给我建议吗?如何解决此问题?在每个函数中,您都有以下行:
dev = serial.Serial("COM3", 9600)
该线路打开串行端口,复位Arduino板。为了避免这种情况,您应该在程序开始时打开该端口一次,然后每次只使用相同的串行端口实例,而不是在每个函数中重新创建它 你是说Serial.readStringUntil('\n');在Arduino?如果是,它不在使用中。为什么在每个函数中反复出现这一行:dev=serial.serial(“COM3”,9600)。这应该在开始时发生一次,然后继续使用相同的串行端口。每次打开该端口时,都会重置电路板。在你的设置功能中输入一些东西来打印一些东西,这样你就可以在每次发送数据时看到电路板是否被重置。非常感谢你现在正在工作。到时候我会给你一个答案。请接受,非常感谢。这对我很有帮助。