2014-09-25 45 views
1

我遇到了麻烦,我有一台具有串行通信的小型游戏机,我必须发送一个十六进制值,因此它可以用十六进制值进行响应,其中有十六进制值一个我需要提取的数字。Arduino在读取后丢失串行字节

随着我在C#中已经writen一个客户它完美的作品,我得到的每一个字节,

但随着Arduino的我得到这个: '00 03 03 12' 在那里我normaly应该得到这样的: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); 
     }  
    } 
    } 
} 

回答

0

我会尝试:

char commandbuffer; 

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

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

如果12总是最后一个字符我想补充:

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

当然,现在你需要的情况下,12还没有出现增加超时,我离开,作为一个练习。

0

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

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

我认为你只需要在Serial3的接收缓冲区中检测到“东西”,读取它(也就是说,将该字节从缓冲区中移出),然后像字节(以十六进制形式)发送到串行。 我希望你把你的功能generalpol()和statsP()延迟是正常

0

谢谢你的建议我发现它是在串行配置的问题,因为Windows自动处理一些配置,在arduino中你必须手动配置它像唤醒位,所以我将konfig改为奇偶校验非停止位2,现在它工作很好再次感谢