通过arduino上的串行发送的数据有时会字节移位

时间:2018-10-22 17:42:42

标签: arduino serial-communication usart arduino-due

我正在通过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很好地复制到缓冲区中,然后整个值都会移位。我该如何解决?

1 个答案:

答案 0 :(得分:0)

问题似乎不在此代码块中,您没有将数据写到USART端口,而是在将数据存储到该阵列中。当发生字节偏移时,是否可以验证数组中的数据是否符合您的预期?

编辑: 更改

for(int l = 0; l <= buflen; l ++)

for(int l = 0; l

因此您枚举了0到511的集合,即512个元素。现在,您正在枚举一个附加元素,该元素从意外的内存位置读取数据并返回其中的任何内容(可能是静态结构的下一个字节)。