首先,问题源于一个项目。本来是一个很简单的多个串口收发FIFO存取数据的小程序,通过电脑验证也可用,而下位机板子之间通信就出现了丢数问题。

经过分析原因如下:

  我的串口收模块是基于特权同学的开发板程序修改而来的,也就是信号线一旦拉低,就认为数据开始传输,便闷头数数,那么数满10个bit(1起始位+8位数据+1停止位),就算接完一个字节,回头接着检测信号线是否被拉低。当发数端发出了错码的情况下,这套程序是不能检测出来的。要想能识别错码,就必须起始位与停止位都检测,才能确定该字节是否完整。

  经过一个周末的编写,新模块出炉了。模块入口有rs232_rx信号,出口有rx_data[7:0]以及一个FLAG信号线,FLAG是一个字节接满结束的标志。

新模块主要思想就是在原有模块的基础上,加入判断帧尾的步骤。办法是:

  1、准备做处10路冗余,每一路都检测rs232_rx的下降沿。(实际应该用不到那么多)10路冗余是有优先级的,当第一次检测到下降沿之后,第一路启动计数,开始10位bit的数据采集。当第一路计数启动之后,再遇到下降沿便启动第二路计数,以此类推。也就是说,在接收模块第一次启动计数之后,每遇到一次下降沿,就启动一路计数。

  2、当第一路数到第10个bit,也就是停止位的时候,如果采集到了1,那么也就证明采集的是停止位,则将之后的所有冗余计数一并停下。如果第一路的停止位没有采集到1,则证明传输出错,第一路没有接到完整的一帧数据,则不输出数据,等待第二路的停止位采集结果。以此类推,知道某一路数据的停止位为1,则将剩下的冗余路置位,输出数据。

3、这10路冗余只是为一帧数据服务,也就是1个字节,确保单个字节能够采集正确。

经过以上修改,程序可以正确的采集数据了。但是以上修改还不算完美,原因是,接收bit的采集是在波特率的中心位置采集,假如某帧率  1bit  的时长为 100ms ,那么我在第50ms的时候采集一次数据,记录。这么做不能保证数据是正确的,有可能在采集之前出的错,或者刚刚采集完之后又出的错。如果是这种情况,并且在本该出现在停止位的位置有了一个高的数据,那么就误认为该帧数据没错。

  所以最稳妥的做法是每个bit的数据采集三次,大概在    1/6    3/6    5/6  ,这三个位置采集,如果都相同,才判断本bit采集正确。这样会极大的提高数据采集的准确率。

经过更改后模块还有一个优点,就是每次接收一个完整的字节之后,就会有一个高信号产生(FLAG),对于实时性要求较强的任务,有所帮助。每接到一个数据都可以马上进行判断和操作,不必开辟一个较大的缓冲类寄存器。

基于FPGA具有容错能理的异步串口程序设计的更多相关文章

  1. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  2. 基于FPGA的数字识别的实现

    欢迎大家关注我的微信公众号:FPGA开源工作室     基于FPGA的数字识别的实现二 作者:lee神 1 背景知识 1.1基于FPGA的数字识别的方法 通常,针对印刷体数字识别使用的算法有:基于模版 ...

  3. 基于FPGA的线阵CCD实时图像采集系统

    基于FPGA的线阵CCD实时图像采集系统 2015年微型机与应用第13期 作者:章金敏,张 菁,陈梦苇2016/2/8 20:52:00 关键词: 实时采集 电荷耦合器件 现场可编程逻辑器件 信号处理 ...

  4. 基于FPGA的XPT2046触摸控制器设计

    基于FPGA的XPT2046触摸控制器设计 小梅哥编写,未经许可,文章内容和所涉及代码不得用于其他商业销售的板卡 本实例所涉及代码均可通过向 xiaomeige_fpga@foxmail.com  发 ...

  5. 基于FPGA的HDMI显示设计(三)

    上一篇:基于FPGA的VGA显示设计(二) 10月10日 ~ 20日期间实习,令我万万没想到的是实习题目是 “便携式高清电视显示屏测试系统原型设计” 也就是 “基于FPGA的视频显示”. 实习要求用 ...

  6. 基于FPGA的VGA显示设计(二)

    上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...

  7. 基于FPGA的简易数字时钟

    基于FPGA的可显示数字时钟,设计思路为自底向上,包含三个子模块:时钟模块,进制转换模块.led显示模块.所用到的FPGA晶振频率为50Mhz,首先利用它得到1hz的时钟然后然后得到时钟模块.把时钟模 ...

  8. 基于FPGA的以太网开发

    基于FPGA的以太网开发,在调试过的FPGA玩家开来,其实算不上很难的技术!但是如果只是菜鸟级别的选手,没有调试过的话,就有些头疼了!早在自己在实习的时候,就接触到XAUI(万兆以太网口)接口,但是由 ...

  9. 基于FPGA的RGB图像转灰度图像算法实现

    一.前言 最近学习牟新刚编著<基于FPGA的数字图像处理原理及应用>的第六章直方图操作,由于需要将捕获的图像转换为灰度图像,因此在之前代码的基础上加入了RGB图像转灰度图像的算法实现. 2 ...

随机推荐

  1. poj 1426 Find The Multiple 搜索进阶-暑假集训

    E - Find The Multiple Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  2. 测试CPU核心个数

    //测试CPU核心个数 #if !defined (_WIN32) && !defined (_WIN64) #define LINUX #include <unistd.h&g ...

  3. Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析

    Office文件的奥秘——.NET平台下不借助Office实现Word.Powerpoint等文件的解析 分类: 技术 2013-07-26 15:38 852人阅读 评论(0) 收藏 举报 Offi ...

  4. Linux_服务器_08_网卡eth1修改为eth0

    一.现象 二.解决步骤 1.修改 70-persistent-net.rules 执行命令: vim /etc/udev/rules.d/-persistent-net.rules 找到与ifconf ...

  5. type为number的input标签输入小数的方法

    纠结了一段时间都没找出方法,最后灵光一现想出这个方法,没想到测试下果然成功了! 看目前网上几乎很难找到相对应的解决方法,所以这里分享出来,如果有更佳方法欢迎提出. 方法如下: <input ty ...

  6. JdbcUtils针对事务问题作出的第三次修改

    DAO中的事务 其实在DAO中处理事务真的是“小菜一碟” try{ con.commit(); }catch(Exception e){ con.rollback(); } 但是dao层中只能是对账户 ...

  7. 6_State 游戏开发中使用状态机

    ### State 不好的代码 ``` //处理玩家输入的代码 void Heroine::handleInput(Input input) { if (input == PRESS_B) { if ...

  8. bzoj 4817: [Sdoi2017]树点涂色 LCT+树链剖分+线段树

    题目: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob可能会进 ...

  9. 检测 iOS 的 APP 性能的一些方法

    本文转载于微信公众号:iOS大全 首先如果遇到应用卡顿或者因为内存占用过多时一般使用Instruments里的来进行检测.但对于复杂情况可能就需要用到子线程监控主线程的方式来了,下面我对这些方法做些介 ...

  10. Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb

    实验环境: SQL> select * from v$version;BANNER                                                         ...