串口数据获取-时间间隔的问题

串口来数据了,我们需要去读。串口来的数据都放在一个数组上,读这个数组即可。

但是有问题了。因为串口来数据需要时间,如果我们读程序要比串口来数据快,那么我们读到没有新内容了,就认为这次读数据结束,会“分包”。或者,我们读程序远比串口传输要慢,比如间隔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。

这样,延时就可以设置为单个字符传输的延时,在串口里,可以根据波特率来设置,波特率可知。

或者,再尝试几百次,在这个范围内觉得是合理的。

延时放在单个字符里,再尝试标记。


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值