2013-10-11 3 views
1

Я получаю пакет, такой как 0xFA5D0D01. Теперь я хочу PARCE это какАнализ входящего пакета

ФА Header1 5D является 0D Заголовок 2 является длина и 01 является контрольной суммой. const int data_availabe = Serial.available();

Я могу написать в последовательный порт, но не в состоянии PARCE это как , если я получил FA затем распечатать полученные HEADER1

const int data_availabe = Serial.available(); 
if (data_availabe <= 0) 
{ 
    return; 
} 
const int c = Serial.read(); 

Serial.print("Receive Status: "); 
Serial.println(STATE_NAME[receiveState]); 
Serial.print(c, HEX); 
Serial.print(" "); 
if (isprint(c))   //isprint checks whether it is printable character or not (e.g non printable char = \t) 
{ 
    Serial.write(c); 
} 
Serial.println(); 
Serial.println(receiveState); 

switch (receiveState) 
{ 
case WAITING_FOR_HEADER1: 
    if (c == HEADER1) 
    { 
     receiveState = WAITING_FOR_HEADER2; 

    } 
    break; 

case WAITING_FOR_HEADER2: 
    if (c == HEADER2) 
    { 
     receiveState = WAITING_FOR_LENGTH; 
    } 
    break; 
} 

Где receiveState меняется перечисление, как мы получаем exptected данные ..

ответ

2

Я предполагаю, что Arduino принимает данные с USB.

Что такое if (data available <= 0)? Если вы хотите читать данные из последовательного порта, пока он доступен, вам следует сделать if (Serial.avalaible() > 1), а затем Serial.read() внутри {}.

Если инициализировать const вы не сможете изменить свое значение с течением времени ...

Что такое readString и как она инициализируется?

Вы пытались Serial.print(c) посмотреть, что находится внутри?

Снова, нам было бы легче, если бы вы могли дать нам больше информации о том, почему и когда этот кусок кода работает.

EDIT:

#define HEADER_1 0xFA // here you define your headers, etc. You can also use variables. 

uint8_t readByte[4]; // your packet is 4 bytes long. each byte is stored in this array. 

void setup() { 
    Serial.begin(9600); 
} 

void loop() { 

    while (Serial.avalaible() > 1) { // when there is data avalaible on the serial port 

     readByte[0] = Serial.read(); // we store the first incomming byte. 
     delay(10); 

     if (readByte[0] == HEADER_1) { // and check if that byte is equal to HEADER_1 

      for (uint8_t i = 1 ; i < 4 ; i++) { // if so we store the 3 last bytes into the array 
       readByte[i] = Serial.read(); 
       delay(10); 
      } 

     } 

    } 

    //then you can do what you want with readByte[]... i.e. check if readByte[1] is equal to HEADER_2 and so on :) 

} 
+0

Это не касается USB, этот сериал RS-232, если вы не знаете ответа, то не отвечают. –

+0

, пожалуйста, просмотрите обновленный вопрос ... я не могу разобрать его так, как ожидалось. Что-то пошло не так где-то ... –

+0

@ChrisDesjardins Я могу быть совершенно глупым, но откуда вы это знаете? Я отредактировал свой ответ, скажите, если это то, что вы хотите сделать. – ladislas

Смежные вопросы