Я успешно следовал инструкциям на этом сайте:
http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
и я смог получить связь между пи и моей мега-арудино точно так, как указано на сайте.
Однако вместо отправки целого числа, представляющего количество миганий светодиода, я хочу отправить текст ASCII, например:
«ПЕРЕМЕСТИТЬ 5 МЕТРОВ ВПЕРЕД», «ПОВЕРНУТЬ ВЛЕВО», «ПЕРЕМЕСТИТЬ 10 МЕТРОВ ВПЕРЕД» к ардуино от пи.
Я написал следующий код:
char inData[64];
char inChar=-1;
void setup(){
Serial.begin(9600);
Serial.begin("Waiting for Raspberry Pi to send a signal...\n");
}
void loop(){
byte numBytesAvailable= Serial.available();
// if there is something to read
if (numBytesAvailable > 0){
// store everything into "inData"
int i;
for (i=0;i<numBytesAvailable;i++){
inChar= Serial.read();
inData[i] = inChar;
}
inData[i] = '\0';
Serial.print("Arduino Received: ");
Serial.println(inData);
}
}
Я успешно прошил код выше моего Arduino Mega 2560.
Я переключился на свой терминал Python на Raspberry Pi и в консоли набрал:
import serial
ser = serial.Serial('/dev/ttyACM1',9600)
ser.write("MOVE")
На моем последовательном мониторе Arduino отображается следующее:
Arduino Received: M
Arduino Received: O
Arduino Received: V
Arduino Received: E
Но то, что я хочу, это:
Arduino Received: MOVE
Как изменить приведенный выше код, чтобы получить все символы в буфере inData?
Ответы:
Проблема в том, что Arduino зацикливается так быстро, что будет выполнять
if (numBytesAvailable > 0)
линию несколько раз между каждым символом, поступающим через последовательный порт. Поэтому, как только персонаж действительно появляется, он захватывает его, зацикливается с нуля на один и печатает один символ.Что вы должны сделать, это послать символ конца строки ('\ n') после каждой команды из вашей программы Python. Затем пусть ваш код Arduino буферизует каждый полученный символ и воздействует на сообщение только после получения символа конца строки.
Поэтому, если вы измените свой код Python, отправьте символ конца строки, например, так:
Тогда ваш код Arduino может быть примерно таким:
источник
Ваш Python скрипт отправляет четыре байта,
M
,O
,V
, иE
. Как Arduino должен знать, что это одна строка? Учтите, что код Python:является полностью идентичным с
с точки зрения Arduino. Последовательные порты передают символы, а не строки.
В вашем коде Arduino работает быстро (по сравнению со скоростью 9600 бод), поэтому при каждом вызове
Serial.available()
он видит только один из этих четырех символов. Вот почему вы получили результат, который вы сделали.Что вам нужно сделать, так это придумать какой-то способ разграничения строк, то есть пометить их каким-либо образом из Python, чтобы Arduino мог добавлять отдельные символы, которые он получает, в ваше высокоуровневое понятие строки .
Использовать строки просто: отправьте каждую строку, оканчивающуюся символом новой строки (
'\n'
). На Arduino читайте символы и добавляйте их в строку. Когда вы видите'\n'
, строка заканчивается, и вы можете напечатать ее.источник
Приведенный выше код прекрасно работает на моей связи между Pi и Arduino
источник
Используйте
.readline
вместо.read
У меня была та же проблема, и это сразу же исправило. Надеюсь, это помогло!
источник
Вот как я это сделал из первого примера:
источник