【原创】低速串口通信经验

【原创】低速串口通信经验

废话说了一大堆,下面进入正题。

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 = 0for(i=0;i<size(data);i++)
    {
        write(data[i],1 //发送数据帧
    }   
    sleep(10 //延时一个固定的很小的时间
    set_recive_mode() //设置为接收模式  在其他接收过程中完成接收
}

这样做的好处是,发送后只需要延时很小的一个固定时间,保证最后一个字节能发送完成即可。
上面的方法还有缺陷,就是当对方回复极快时,最后的延时可能导致接收不正确,所以改进的方法是:

send( data )
{
    set_send_mode()  //发送前设置为发送模式
    int i = 0for(i=0;i<size(data);i++)
    {
        write(data[i],1 //发送数据帧
    }   
    write(data[i],1 //发送一个多余的数据替代延时或者也可以改为将数据刷新保证数据真的被发送出去了
    //sleep(10)    //延时一个固定的很小的时间
    set_recive_mode() //设置为接收模式  在其他接收过程中完成接收
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值