Данные, передаваемые через последовательный порт на Arduino, иногда сдвигаются на байты - PullRequest
0 голосов
/ 22 октября 2018

Я отправляю данные через 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 Ответ

0 голосов
/ 22 октября 2018

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

Редактировать: Изменить

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

до

для (int l = 0; l

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

...