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