我遇到了麻烦,我有一台小型游戏机有串口通讯,我必须发送一个十六进制值,这样它就可以用十六进制值进行响应,其中在这个十六进制值内有一个我需要的数字提取
使用我在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);
}
}
}
}
答案 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 ,现在再次感谢非常感谢