0

我使用发送一系列字节的程序通过串行与 Arduino 通信。

为了让 Arduino 意识到它正在接收消息而不是垃圾,我用字符“S”“T”“A”“R”“T”标记了我的字节数组的开头。在此之后最终将遵循一系列将分配给内部变量的字节(尚未实现)。

Arduino 必须按顺序读取每个字节并将其与字节数组进行比较,如果所有字节都以正确的顺序出现,它将继续程序的下一部分,否则它将丢弃当前字节并等待更多字节到达。

我试图以最有效和可读的方式实现它,而不是使用一系列嵌套的 if 语句。

到目前为止,我得到了:

byte inByte = 0;
byte handShake[] = {'S','T','A','R','T'};

void setup() {
  Serial.begin(9600);

}

void loop() 
{
  while (Serial.available()) 
{
  for (int x =0; x < sizeof(handShake) ; x++)
    {
    inByte = Serial.read();
    Serial.println(x);
    if (inByte == handShake[x]) 
     {
        if (x == (sizeof(handShake)-1)) {setArduino();}  
      }
       else break;
   }
  }
}


void setArduino () {
  Serial.println("Ready To Set Parameters");
}

然而,这似乎没有超过第二个字节,我不知道为什么。

4

3 回答 3

1

更好的答案:这允许循环的其余部分在等待消息完成时进行迭代,如果未收到完整的握手消息,则计数器将重置。

byte inByte = 0;
char handShake[] = {'S','T','A','R','T'};
int messageIndex = 0;

void setup() {
  Serial.begin(9600);

}

void loop() 
{
  while (Serial.available()) 
  {
    inByte = Serial.read();
    Serial.println(messageIndex);
    if (inByte == handShake[messageIndex]) 
      {
        messageIndex++;
        if (messageIndex == sizeof(handShake)) {messageIndex = 0; setArduino();}  
      }
       else {messageIndex=0;}
  }
// Other code while waiting for message to finish
Serial.println("tick");
}


void setArduino () {
  Serial.println("Ready To Set Parameters");
}
于 2013-03-20T15:30:52.187 回答
1

解决了:

这是答案:

byte inByte = 0;
char handShake[] = {'S','T','A','R','T'};

void setup() {
  Serial.begin(9600);

}

void loop() 
{
  while (Serial.available()) 
  {
  for (int x =0; x < sizeof(handShake) ; x++)
    {
    inByte = Serial.read();
    Serial.println(x);
    if (inByte == handShake[x]) 
      {
       if (x == (sizeof(handShake)-1)) {setArduino();}  
       while(!Serial.available()) {delay(1);}
      }
       else {break;}
    }
  }
}


void setArduino () {
  Serial.println("Ready To Set Parameters");
}

这可能不是最有效的方法,但我目前看不出它有问题。

于 2013-03-20T15:14:45.910 回答
0

您可以尝试计算您的消息。CRC 是旧的很好的解决方案。我使用它,它非常适合我。我不确定您正在与哪种设备通信。

//define
const uint32_t Polynomial = 0xEDB88320;
const uint16_t NumBytes = 256;
uint8_t data[NumBytes];

/// compute CRC32
uint32_t crc32_bitwise(const void* data, uint16_t length, uint32_t previousCrc32 = 0)
{
  uint32_t crc = ~previousCrc32; // same as previousCrc32 ^ 0xFFFFFFFF
  uint8_t* current = (uint8_t*) data;

  while (length--)
  {
    crc ^= *current++;
    for (uint8_t j = 0; j < 8; j++)
    {
      uint8_t lowestBit = crc & 1;
      crc >>= 1;
      if (lowestBit)
        crc ^= Polynomial;
    }
  }
  return ~crc; // same as crc ^ 0xFFFFFFFF
}
void setup() {
  // put your setup code here, to run once:    
}

void loop() {
  // put your main code here, to run repeatedly:    
}

当您需要计算 CRC 时

uint32_t crc = crc32_bitwise(data_bytes, sizeof(data_bytes));

data_bytes是字节数组。

然后您可以获取所有设置或消息byte data[x]并计算CRC。然后您可以将CRC添加到消息并发送消息byte data[x+sizeof(CRC)]

PS 使用byte而不是int. 例如。for(byte x =0; x<sizeof(handShake); x++)

于 2014-10-21T10:08:30.297 回答