Как лучше принять данные из сериал?
- Войдите на сайт для отправки комментариев
byte MessageRx[100]={0}; //массив байтов принимаего сообщения if (mySerial.available()) { delay(100); int k=0; byte inbyte=0; while( mySerial.available() && k < 100) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Recieve: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); //распечатаем принятое сообщение в сериал for (int i = 0; i < 12; i++) MessageRx[i]=0;
Принимаются данные от ЭБУ двигателя автомобиля в виде сообщений, между посылкой каждого байта примерно 1мс. Скорость 10400 бод. между сообщениями от 50 до 150 мс.
1. Хотелось бы избавиться от задержки delay, а то остальное тормозит
2. Принимаемое сообщение длиной 81 байт. Данный скетч (или ЭБУ?) его режет на две части. Нужно понять это делает скетч или ЭБУ. Подсматривая обмен данных ЭБУ и диагностического прибора сниффером, задержка в этом сообщении в 81 байт присутствовала по середине сообщения.
Нужно както записывать это сообщение всё полностью в один массив.
Может считывать можно не через Serial.available()? а еще както,
вот что показал сниффер, Жирным это запрос от диагностики, остальное ответ ЭБУ
т.е. ардуина выступает вместо диагностики и получает данные. Вот так коряво получает, сообщение принимаемое 63 байта, это потому что такой размер буфера Serial ? Вот что творится в сериал уже при приеме данных ардуиной
1. Хотелось бы избавиться от задержки delay, а то остальное тормозит
так удалите ее, зачем вообще там задержка?
тогда каждый байт будет писаться в нулевой байт массива
т.е. вместо такого сообщения 0 FF FF 83 F1 11 C1 6B 8F 40 получим несколько коротких однобайтовых :
0
FF
FF
83
F1
11
C1
6B
8F
40
тогда каждый байт будет писаться в нулевой байт массива
вы бредите. Код свой посмотрите внимательно
я так понимаю в буфер mySerial без задержки успевает попасть только один байт, и потом там какоето время ничего нет, поэтому он сразу выходит из цикла while.
MaksVV
Как я вижу, вы с помощью задержки пытаетесь группировать байты в сообщения. Задержка - чрезвычайно ненадежный метод. На практике он работать не будет. Вы сами пишете, что интервал между сообщениями от 50мс. Значит при задержке 100мс у вас в массив может попасть несколько сообщений за раз, буфер переполнится и часть данных пропадет. Вам надо читать Serial без задержек, все подряд, а границы между сообщениями вычмслять по значениям ключевых байт. Например, судя по выводу в сообщении #1, у вас каждый ответ ЭБУ начинается с FF FF FF - вот на это и ориентируйтесь.
вообщето я пытаюсь как раз от задержки избавиться. А скетч который вверху нашел в инете. В принципе так и хотел как вы говорите действовать. Попробую. Хотя на данный момент все работает, после того как я увеличил буфер софтсериал до 100 байт. Но это не айс.