我正在通过Arduino Due上的USART发送数据。我目前正在填充缓冲区,以便仅在缓冲区已满时才发送数据。
我要放入缓冲区的数据是具有12位深度(值从0到4095)的不同波形的查找表。因此,我将深度为2个字节的缓冲区值放入缓冲区,最高有效字节始终为0。
我的问题是,在整个波浪周期中的每一刻,每个字节都会移位一个字节(每个值都乘以256)。错误是无法预测的:它可能会在要发送的第二个或第三个期间发生,但很快就会发生。我尝试使用较慢的波特率,或添加两个停止位,但没有解决方法。相关的代码块:
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程序中检查所接收的数据。我认为奇怪的是,错误永远不会发生在wave的中间:将一两个wave很好地复制到缓冲区中,然后整个值都会移位。我该如何解决?
答案 0 :(得分:0)
问题似乎不在此代码块中,您没有将数据写到USART端口,而是在将数据存储到该阵列中。当发生字节偏移时,是否可以验证数组中的数据是否符合您的预期?
编辑: 更改
for(int l = 0; l <= buflen; l ++)
到
for(int l = 0; l 因此您枚举了0到511的集合,即512个元素。现在,您正在枚举一个附加元素,该元素从意外的内存位置读取数据并返回其中的任何内容(可能是静态结构的下一个字节)。