读取后Arduino丢失串行字节

时间:2014-09-25 08:21:35

标签: serial-port arduino

我遇到了麻烦,我有一台小型游戏机有串口通讯,我必须发送一个十六进制值,这样它就可以用十六进制值进行响应,其中在这个十六进制值内有一个我需要的数字提取

使用我在c#中编写的客户端,它可以很好地完成每个字节,

但是对于arduino,我得到了这个: '00 03 03 12' 我应该得到这个:'01 10 00 03 43 20 03 12',你看我松了一半的字节。

我尝试了一切,但我没有得到它。

当我与arduino和Pc沟通时,一切都是完美的读写。但是对于游戏机,只发送效果很好,但是当我收到数据时,我就像上面那样松散了。 谢谢

这是代码:

void setup()
{
  Serial3.begin(19200, SERIAL_8E1);
  Serial.begin(19200, SERIAL_8E1);
  delay(1000);
}

void statsP()
{ 
  delay(400);
  Serial3.write(0x01);
  Serial3.write(0x10);
  delay(300);
}

void generalpol()
{
  delay(200);
  Serial3.write(0x80); 
  Serial3.write(0x81);
}

void loop() 
{
  generalpol();
  statsP();
  if(Serial3.available()){
    char commandbuffer;
    int j = Serial3.available();
    for (int i =0 ; i<j ; i++)
    {
      while( Serial3.available()) {
        commandbuffer = Serial3.read();
        Serial.write(commandbuffer); 
      }     
    }
  }
}

3 个答案:

答案 0 :(得分:0)

我会尝试这个(而不是在generalpol()和statsP()之后的部分:

char commandbuffer;
if(Serial3.available() > 0){
   commandbuffer = Serial3.read();
   Serial.write(commandbuffer,HEX);
}

我认为你只需要在Serial3的接收缓冲区中检测“某事”,读取它(这也就是说,从缓冲区移动该字节),并将类似字节(以HEX形式)发送到Serial。 我希望你在函数generalpol()和statsP()中的延迟是正确的

答案 1 :(得分:0)

我会尝试:

char commandbuffer;

while(Serial3.available() > 0){
    commandbuffer = Serial3.read();
    Serial.write(commandbuffer,HEX);
}

但是,在返回循环()例程的开头并开始传输字符之前,您需要确保已收到所有字符。因为与while循环执行的速度相比,进入Arduino的角色非常慢。 12总是最后一个字符还是总是8个字符?

如果12总是我要添加的最后一个字符:

while (commandbuffer != 12){
    while(Serial3.available() > 0){
        commandbuffer = Serial3.read();
        Serial.write(commandbuffer,HEX);
    }
}

当然,现在你需要添加一个超时,以防12永远不会来,我把它作为练习留给你。

答案 2 :(得分:0)

谢谢你的建议我发现串口配置问题,因为windows会自动处理一些配置,在arduino你必须像WakeUp位一样手动配置,所以我将konfig更改为奇偶校验非停止位2 ,现在再次感谢非常感谢