1

我正在通过 Arduino Due 上的 USART 发送数据。我目前正在填充缓冲区,因此仅在缓冲区已满时才发送数据。

我放入缓冲区的数据是具有 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 程序上检查接收到的数据。我认为错误从未发生在波的中间很奇怪:一个或两个波在缓冲区上被很好地复制,然后整个值被转移。我该如何解决这个问题?

4

1 回答 1

0

看起来问题不在于您将数据写入 USART 端口的代码块中,而在于将数据存储到该数组中。当您发生此字节偏移时,您能否验证数组中的数据是否与您预期的一样?

编辑:改变

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

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

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

于 2018-10-22T19:24:02.837 回答