0

我有一个平板电脑向设备发送一条 5 字节的消息,我传递的消息正常,但有时数据被写入缓冲区的错误部分。

我用于读取缓冲区的代码如下,缓冲区是一个 int[25]

if((tempByte != 0) && (tempByte != 0xEE))           // If 'ready' returned..
{
  tempByte &= 0x3F;
  if(tempByte > 0) 
  { 
    for(i = 0; i < tempByte; i++)
    {
      buffer[bufferWrite] =  periph_irxdata() ;
      bufferWrite++;
      bufferContents++;
      if(bufferWrite > 24) 
      {
        bufferWrite = 0;
      }           
    }
  }
}

if(bufferContents >= 5)
{
  for(i = 0; i < 5; i++)
  {
    readings[i] = buffer[bufferRead];
    bufferRead++;
    bufferContents--;
    if(bufferRead > 24) 
    {
      bufferRead = 0;
    }        
  }

  if(readings[0] == 0x18)
  {
    tabletValue = readings[2];
    OnOff = readings[1];
  }
}

这个想法是,如果您从 [0] 开始并每次写入 5 个字节,则 18、01、02、00、00 的消息将从值 [0]、[5]、[10] [15] 开始重复 [ 20]。

这将读取 18, 01, 02, 00, 00 | 18, 01, 02, 00, 00 | 18, 01, 02, 00, 00 | 18, 01, 02, 00, 00 发送 5 条消息后。

问题是偶尔会发生错误,缓冲区结束了一个 ot 两个字节,看起来像这样 02, 00, 00, 18, 01 | 02, 00, 00, 18, 01 | 02、00、00、18、01 02、00、00、18、01。

正在发送消息,但设备会忽略它们,因为它将消息视为垃圾,因为它与读取块不对齐。

发生错误时,我能做些什么来自动解决这个问题?我正在考虑移动读取以搜索下一个 18 并读取 5 个字节,或者尝试找到下一个 18 并将字节写回正确的块中。

4

0 回答 0