Получение данных с ком порта
- Войдите на сайт для отправки комментариев
Втр, 16/01/2018 - 12:34
Добрый день! есть некая программна на компьютере которая отпавляет в com порт команды вот такого вида FF 01 01, у меня ни как не получается их обработать в ардуино , нужно просто сделать если прила эта команда то выполнить условие вот код
byte val ;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop() {
if (Serial.available() > 0) {
val = Serial.read();
String myStr = String(val);
if (myStr=="FF 01 01") digitalWrite(13,HIGH);
if (myStr=="FF 01 00") digitalWrite(13,LOW);
Serial.println(val);
}
}
В 12-ой строке Вы читаете 1 (один) байт, а затем в строке 14 сравниваете его со строкой "FF 01 01", состоящей из 8 (восьми) байтов. И Вы всерьёз рассчитываете, что они могут быть равны друг другу?
Навскидку:
byte buff[3] = {0}; byte wanted[3] = {0xFF,0x01,0x01}; byte writeIndex = 0; void setup() { Serial.begin(9600); } void loop() { while(Serial.available()) { if(writeIndex > 2) { for(byte i=0,j=1;j<3;i++,j++) buff[i] = buff[j]; writeIndex = 2; buff[writeIndex] = 0; } buff[writeIndex] = Serial.read(); writeIndex++; if(!memcmp(buff,wanted,3)) { writeIndex = 0; memset(buff,0,3); Serial.println(F("GOTCHA!")); } } }Спасибо работает! но можете поснить для чего нужен вот этот код
for(byte i=0,j=1;j<3;i++,j++) buff[i] = buff[j]; writeIndex = 2; buff[writeIndex] = 0;Спасибо работает! но можете поснить для чего нужен вот этот код
для того чтоб исправить ту вашу ошибку, о которой вам написали в ответе #1.
Почучается он обнулет массив?
вот код который у меня получился и работает
byte wanted[3] = {0xFF,0x01,0x01};// Название команды FF 01 01 byte wantedl[3] = {0xFF,0x01,0x00};//Название команды FF 01 00 byte wanted3[3] = {0xFF,0x01,0x10};//Название команды FF 01 10 byte writeIndex = 0; void setup() { lcd.init(); lcd.backlight(); Serial.begin(9600); pinMode(13, OUTPUT); } void loop(){ while(Serial.available()) { if(writeIndex > 2) { for(byte i=0,j=1;j<3;i++,j++) buff[i] = buff[j]; writeIndex = 2; buff[writeIndex] = 0; } buff[writeIndex] = Serial.read(); writeIndex++; byte a=buff[2]; lcd.setCursor(0,0); // это я выводил на экран lcd.print("Sensor 1: "); // это я выводил на экран lcd.print(!memcmp(buff,wanted,3));// это я выводил на экран lcd.setCursor(0,1); // это я выводил на экран lcd.print("Sensor 2: "); // это я выводил на экран lcd.print(!memcmp(buff,wantedl,3)); // это я выводил на экран if(!memcmp(buff,wanted,3)) // здесь сравнивается полученная команда с com порта с командой пресвоенной переменной wanted в данном случае FF 01 01 { digitalWrite(13,HIGH);//здесь просто зажигаю светодиот на 13 пине // writeIndex = 0; но по сути здесь будут включатся реле // memset(buff,0,3); // Serial.println(F("GOTCHA!")); } if (!memcmp(buff,wantedl,3))// условие по другой команде { digitalWrite(13,LOW); } if (!memcmp(buff,wanted3,3))// условие по другой команде { digitalWrite(13,HIGH); delay(1000); digitalWrite(13,LOW); lcd.print("+2"); } } }Спасибо работает! но можете поснить для чего нужен вот этот код
for(byte i=0,j=1;j<3;i++,j++) buff[i] = buff[j]; writeIndex = 2; buff[writeIndex] = 0;Этот код перемещает массив в голову на 1 байт. Нужен для того, чтобы гарантированно в приходящем потоке байт выловить последовательность из ваших трёх байт, когда бы устройство ни включилось в прослушку потока.