Данные, посылаемые через последовательный порт на 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 элементов. Теперь вы перечисляете дополнительный элемент, который читает данные из неожиданного места в памяти и возвращает все, что там есть (вероятно, следующий байт вашей статической структуры).