首先,问题源于一个项目。本来是一个很简单的多个串口收发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. 申请内存的方式(1,malloc/free;2,new/delete)

    一.malloc/free的方式 // 4个int 的大小int *p = (int*) malloc(16); for (int i = 0; i < 4; ++i) { p[i] = i; ...

  2. EntityFramework 学习 一 Table-Valued Function in Entity Framework 5.0

    USE [SchoolDB] GO /****** Object: UserDefinedFunction [dbo].[GetCourseListByStudentID] */ SET ANSI_N ...

  3. ava:Map借口及其子类HashMap三

    ava:Map借口及其子类HashMap三 HashMap常用子类(异步非安全线程,性能高: Hashtable:同步的安全线程,性能低) map(HashMap)中的key,value可以通过 Se ...

  4. Java的反射机制(应用篇)

    Java的的反射机制,是一个很难但却比较有用的概念.反射机制经常出现在框架设计中,大神说:反射是框架设计的灵魂,也就是说要想看懂框架的源代码,必须得掌握反射机制. 作为初学者的我,觉得至少应该掌握它日 ...

  5. java_面试_01_一个月的面试总结(java)

    重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程 ...

  6. BEC listen and translation exercise 42

    These were built for the workers towards the end of the eighteenth century, and they are still furni ...

  7. 【leetcode刷题笔记】Roman to Integer

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  8. jquery中ON方法的使用

    以前在jquery中绑定动态元素一直使用live,现在才发现live已经被抛弃了,现在如果想实现live方法,可以使用最新的ON方法,具体使用如下: 替换live() live()写法   $('#l ...

  9. 如何在MySQl数据库中给已有的数据表添加自增ID?

    由于使用MySQL数据库还没有多久的缘故,在搭建后台往数据库导入数据的时候发现新增的表单是没有自增id的,因次就有了上面这个问题. 解决方法 1.给某一张表先增加一个字段,这里我们就以node_tab ...

  10. Python语言及其应用 第2章