Получение данных с ком порта

sava
Offline
Зарегистрирован: 07.07.2016

Добрый день! есть некая программна на компьютере которая отпавляет в 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);
   
  }
               
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В 12-ой строке Вы читаете 1 (один) байт, а затем в строке 14 сравниваете его со строкой "FF 01 01", состоящей из 8 (восьми) байтов. И Вы всерьёз рассчитываете, что они могут быть равны друг другу? 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Навскидку:

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!"));
		}
	}
}

 

sava
Offline
Зарегистрирован: 07.07.2016

Спасибо работает! но можете поснить для чего нужен вот этот код

 for(byte i=0,j=1;j<3;i++,j++)
                buff[i] = buff[j];
             
            writeIndex = 2;
            buff[writeIndex] = 0;

 

b707
Offline
Зарегистрирован: 26.05.2017

sava пишет:

Спасибо работает! но можете поснить для чего нужен вот этот код

для того чтоб исправить ту вашу ошибку, о которой вам написали в ответе #1.

 

sava
Offline
Зарегистрирован: 07.07.2016

Почучается он обнулет массив?

вот код который у меня получился и работает 

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");
       
       }
       
    }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sava пишет:

Спасибо работает! но можете поснить для чего нужен вот этот код

 for(byte i=0,j=1;j<3;i++,j++)
                buff[i] = buff[j];
             
            writeIndex = 2;
            buff[writeIndex] = 0;

 

Этот код перемещает массив в голову на 1 байт. Нужен для того, чтобы гарантированно в приходящем потоке байт выловить последовательность из ваших трёх байт, когда бы устройство ни включилось в прослушку потока.