Мне нужно использовать свой ноутбук для разговора с Arduino (отправить команду для управления конечным автоматом, чтобы создать простой торговый автомат), все выглядит нормально, когда я пытался ввести команду в последовательный монитор, но когда я отправляю команду через python не работает. похоже, что состояние не изменилось, как я ожидал.
Вот код python:
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. Может ли кто-нибудь мне предложить? Как я могу решить эту проблему?