Данные, посылаемые через последовательный порт на 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, которая сохраняет полученные значения и распечатывает их. Я думаю, странно, что ошибка никогда не происходит в середине волны: одна или две волны хорошо копируются в буфер, а затем все значение сдвигается. Как я мог это исправить?

1 ответ

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

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

для (int l=0; l<=buflen; l++)

в

для (int l = 0; l

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

Другие вопросы по тегам