【原创】低速串口通信经验
废话说了一大堆,下面进入正题。
Author: chad
Mail: linczone@163.com
本文可以自由转载,但转载请务必注明出处以及本声明信息。
在实际项目中遇到过多次红外口数据收发问题,程序结构如下:
send( data )
{
set_send_mode() //发送前设置为发送模式
write(data) //发送数据帧
sleep(100) //延时一段时间保证发送能正确进行
set_recive_mode() //设置为接收模式 在其他接收过程中完成接收
}
以上程序出现的问题是:
如果sleep时间过短,将导致数据不能发送完成,出现数据帧断帧问题,如果sleep过长,会导致接收不完整,并且sleep时间并不与发送的长度成线性关系,所以极难调试。
有效的解决办法是将数据发送改为按字节发送模式,结构如下:
send( data )
{
set_send_mode() //发送前设置为发送模式
int i = 0;
for(i=0;i<size(data);i++)
{
write(data[i],1) //发送数据帧
}
sleep(10) //延时一个固定的很小的时间
set_recive_mode() //设置为接收模式 在其他接收过程中完成接收
}
这样做的好处是,发送后只需要延时很小的一个固定时间,保证最后一个字节能发送完成即可。
上面的方法还有缺陷,就是当对方回复极快时,最后的延时可能导致接收不正确,所以改进的方法是:
send( data )
{
set_send_mode() //发送前设置为发送模式
int i = 0;
for(i=0;i<size(data);i++)
{
write(data[i],1) //发送数据帧
}
write(data[i],1) //发送一个多余的数据替代延时或者也可以改为将数据刷新保证数据真的被发送出去了
//sleep(10) //延时一个固定的很小的时间
set_recive_mode() //设置为接收模式 在其他接收过程中完成接收
}