串口来数据了,我们需要去读。串口来的数据都放在一个数组上,读这个数组即可。
但是有问题了。因为串口来数据需要时间,如果我们读程序要比串口来数据快,那么我们读到没有新内容了,就认为这次读数据结束,会“分包”。或者,我们读程序远比串口传输要慢,比如间隔500ms发来两个串口数据包,那么可能我们会把它们当做一个包来处理,会“合包”。
这里就需要一个很好的检测方法。
开始的做法,如下,检测到可读,然后一直判断是否可读。会分包。因为程序执行比串口来数据要快。
if(HSUR_CanRead())
{
while(HSUR_GetOneChar(&getChar))
{
getCommand[currentPoint++] = getChar;
}
}
后来加延迟。检测到可读,稍微等一下,等所有数据来到,再一次读取。会合包,因为程序加上延时后,可能两个数据包来到。
if(HSUR_CanRead())
{
DELAY_Ms(100);
while(HSUR_GetOneChar(&getChar))
{
getCommand[currentPoint++] = getChar;
}
}
这样的话,一是,延时多久不好定,因为一个数据包数据越长,那等的时间应该越长,但是数据包的长度并不预先知道。二是,发送两个包的间隔不知道。这么的延迟后,可能就会把两个包合在一起。
不得不承认,我还是很弱,L老师虽然很恶心,但他提的方法也很有效。再次修改如下:
if(HSUR_CanRead())
{
while(check)
{
check = FALSE;
while(HSUR_GetOneChar(&getChar))
{
check = TRUE;
getCommand[currentPoint++] = getChar;
}
DELAY_Ms(1);
}
}
将延时放到读完一个字符后。如果没有了,延时,再尝试一次。如果这次依旧没有,说明没有数据了,推出,如果有,读数据,并且值得再去尝试一次。
是否值得再尝试一次的标记-check。
这样,延时就可以设置为单个字符传输的延时,在串口里,可以根据波特率来设置,波特率可知。
或者,再尝试几百次,在这个范围内觉得是合理的。
延时放在单个字符里,再尝试标记。