Данные, отправляемые через последовательный порт на Arduino, иногда сдвигаются по байтам

Я отправляю данные через USART на Arduino Due. В настоящее время я заполняю буфер, поэтому данные отправляются только тогда, когда буфер заполнен.

Данные, которые я помещаю в буфер, представляют собой справочную таблицу различных форм волн с 12-битной глубиной (значения от 0 до 4095). Поэтому я помещаю в буфер значения, которые имеют 2 байта глубины, а старший байт всегда равен 0.

Моя проблема в том, что время от времени весь период волны сдвигается на байт (каждое значение умножается на 256). Ошибка непредсказуемая: может случиться на 2-м или 3-м периоде отправки, но случается скоро. Я пробовал более медленные скорости передачи данных или добавлял два стоповых бита, но это ничего не исправляет. Соответствующий фрагмент кода:

const int buflen = 2048;
int i = 0;
int j = 0;
int k = 1;
int wave = 0;
short buff[buflen];
volatile PROGMEM short sintab[3][512] = ...//there's no need to paste here the lookup tables

void setup(void){
  Serial3.begin(115200, SERIAL_8N2);
  }

void loop(void) {
  buff[j]= sintab[wave][i];
  i+= k;
  j++;
  if (i>511){
    i-=512;     
    }
  if (j>=buflen){
    byte* bytePointer =(byte*)buff;
    for (int l=0; l<=buflen; l++){
      Serial3.write(bytePointer[l]);
      Serial3.flush();
      }
    int j = =0;
    }

Я проверяю полученные данные как на последовательном мониторе, так и на программе Python, которая сохраняет полученные значения и распечатывает их. Мне кажется странным, что ошибка никогда не возникает в середине волны: одна или две волны хорошо копируются в буфер, а затем смещается целое значение. Как я могу это исправить?


person Dan Berezin    schedule 22.10.2018    source источник


Ответы (1)


Похоже, проблема не в этом блоке кода, где вы записываете данные в свой порт USART, а в сохранении данных в этот массив. Когда у вас возникает это смещение байтов, можете ли вы проверить, что данные в вашем массиве соответствуют вашим ожиданиям?

Изменить: изменить

for (int l=0; l‹=buflen; l++)

to

for (int l=0; l‹ buflen; l++)

поэтому вы перечисляете набор от 0 до 511, что составляет 512 элементов. Теперь вы перечисляете дополнительный элемент, который считывает данные из неожиданного места в памяти и возвращает все, что там есть (вероятно, следующий байт вашей статической структуры).

person Lev    schedule 22.10.2018
comment
Самый очевидный способ сделать это — отправить данные через последовательный порт. Я просто попытался подключить светодиод и включить его, когда значение буфера превышает 4095 (что просто происходит, если оно имеет неправильные значения), и фактически он мигает время от времени непредсказуемым образом. Таким образом, очевидно, что данные неправильно хранятся в буфере. Как я могу это исправить? - person Dan Berezin; 22.10.2018
comment
Не уверен, что это проблема, но, Выделите место для буфера.. Я не вижу, где вы это делаете. - person Lev; 22.10.2018
comment
интервал * фу; foo = новый интервал [5]; - person Lev; 22.10.2018
comment
Не могли бы вы объяснить, как это сделать? Я просто подумал, что объявив буфер и его длину, под него будет сэкономлено место. - person Dan Berezin; 22.10.2018
comment
Я попробовал следующее: short* buff; затем, в настройках buff = new short(buflen), где buflen — это int длины буфера. Это не решило проблему. Отбрасывает ли это теорию распределения памяти? - person Dan Berezin; 23.10.2018
comment
О, я вижу это, я думаю. У вас есть ‹= bufflen в цикле for, где он основан на нуле, поэтому должно быть ‹ bufflen - person Lev; 23.10.2018
comment
Я согласен, что это должно быть ‹ bufflen, и я это исправил, но это все еще не решает мою проблему. - person Dan Berezin; 23.10.2018
comment
Я смотрю на ваш код, как опубликовано, и вижу строку int j = = 0;. Я предполагаю, что это было искажено - я не думаю, что буду разбирать. Но, что более важно, если вы имели в виду int j=0;, это создаст НОВУЮ локальную переменную j. Таким образом, ваш индекс никогда не начнется заново (пока он не достигнет 65535). Удалите int (и 2-й =). - person bobwki; 24.10.2018