• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

串口接收如何判断一帧接收完成?

dwwzl 2017-12-25 浏览量:7095
说明:每一帧长短不一,没有统一的开始和结束字符,波特率115200bps
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 1.设定好通讯协议,如包头+长度+数据+校验+包尾,那么中断中每收到一个字节就判断,直到收到包尾为止。这是51时代用得比较多的状态机接收流程。
    但如果由于接收中断被嵌套,或干扰等原因导致一帧数据的后部分丢失,就是说接收不到包尾,那么这个状态机如何能自动复位以便接收下一帧?

    2.串口空闲中断也是用得比较多的一种方法,但是波特率较高的时候,空闲中断的触发时间相应变短,使得接收中断不被打断的要求变高,如果接收中断被耽误了,从而触发空闲中断,也是收不到完整数据。

    3.定时器中断代替串口空闲中断,这个可以避免串口空闲中断时间不够的问题,因为这个定时器中断可以自己设置。但是一个串口需要搭配一个定时器使用,不爽。

    4.串口接收只把数据放到缓存,此外不做任何事情。然后在另一个线程不断parse这个缓存,从头开始找其中有没有符合一帧的数据,如果有就是解析,同时将这一帧从缓存中删掉,如果没有就什么也不做。这样的程序就不用管一帧是否结束,可以较好的适应各种收不全、丢数据的问题。
    • 发布于 2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :这个应用条件超过原厂的规格,一定会有影响。只能在105±2 °C for96 hours. 。 回复

其他答案 数量:21
  • 如果是没有空闲中断的单片机的话,可以采用判断数据流间隔时间来判断一阵数据是否接受完成,比如说,波特率是9600,那么发送一个字节的时间就是T=1000/9600*8≈0.833ms,如果数据流间隔时间超过n个字节时间,就认为当前数据流接受完毕,视为一帧数据;当然如果单片机自带空闲中断的话,直接用空闲中断即可,单片机会自动识别一阵数据是否接收完成。
    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 1
    • 0
电子老工程师 回复了  :封装是MSOP-8 ,确认没尾缀的型号是否完整, 回复

  • 判断帧间隔,比如如果50ms或者100ms没有收到新的字符说明一帧结束了。

    如果是CDT循环规约那样的持续发送,就必须有结束符了。

    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :是堆叠式的, 回复

  • 如果没有空闲中断,就以n个字节空闲为帧间隔。
    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://www.dccomponents.com/upload/product/original/922966930222.pdf 回复

  • 串口空闲中断是比较好的方式,或者自己定一个10ms或者更短更长的计时器,接收数据的时候开启并清除count计数器,定时器中断的时候置个标志位就好。
    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://www.littelfuse.com/~/media/electronics/product_catalogs/littelfuse_power_semiconductors_product_catalog.pdf.pdf 回复

  • 只能是一个字节接收了判断一下,如果不是一帧,再收下一个字节
    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :图纸上面说明是浅灰色。材质是尼龙66,纯塑料材质物料因为批次不同会造成色差。不会影响使用。 回复

  • 以一段时间为一个间隔,这个间隔内收到的认为是一帧。
    • 发布于2017-12-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :没有国产替代,尺寸没有匹配的 回复

  • 和发送端约定下,两条数据的发送间隔,大于等于约定的间隔则可以判断是不同帧,最好还是约定个通信格式,加上包头和校验位
    • 发布于2017-12-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 协议中有数据长度就判断长度,没有就只能通过空闲中断或超时接收来判断了。超时接收就是接收完一个字节后开始计时,超过接收几个字节的时间认为帧结束,具体超过几个字节可以自己通过测试决定。
    • 发布于2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :TR代表卷装, 回复

  • 我是用时间中断的办法的。接收到数据开始计时,每接收到一个数据刷新一次计数器,没接到了,一段时间后,判断接收完一帧。(这个时间根据波特率计算)


    当然,单单这个方法其实不好,数据的稳定还是要靠好的通讯协议来的,上面那个,我现在只是用来减少出错可能性用的。   通讯中有,数据头,长度,数据,校验,数据尾。这样才好。然后加入前一个 数据中间断了,为了不影响下一次数据,通过判断是否传完一帧,将接收状态 恢复。而不是继续等前一帧数据。

    • 发布于2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :原厂规格书对丝印差异有解释说明,以下有图片说明。 回复

  • 时间间隔判断比较方便,连续10ms没有数据就说明结束了。弄个定时器,接收到串口数据开始在定时器中自增变量,每接收到一个字节在中断中启动变量,如果变量达到10ms那么说明数据接收完成。进行相应处理即可。
    • 发布于2017-12-26
    • 举报
    • 评论 2
    • 0
    • 0
电子老工程师 回复了  :确认型号是否正确,原厂和供应商平台都查不到此型号,没有参数 回复
电子老工程师 回复了  :没有替代 回复

  • 有的单片机有空闲中断,如果没有的话,可以判断没有电平变化的时间,一般2个字节的时间就差不多了
    • 发布于2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :包装不同. RUEF900 袋装 RUEF900-2 reel装 回复

  • 如果有硬件流控,根据流控来识别,如果是modbus rtu模式需要根据时间判断
    • 发布于2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :资料没有有关批次的丝印信息的文字描述,也就是说TI原厂并没有对外公开此部分信息,批次信息是无法确认的,经查该型号的丝印是TPS51116 与实物是相符的,物料是正确的 回复

  • 没有中断的TTL串口没有别的办法,只能判断换行字节0x0d和0x0a,有中断的串口可以判断串口标志位,带RTS的串口更方便。

    • 发布于2017-12-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 没有帧头和帧尾很难做到,基本坏包率很高,最好还是设置一下,最后做一下校验和
    • 发布于2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :https://www.mouser.cn/manufacturer/nec/ 回复

  • 定义好通讯协议啊,帧头帧尾,不就知道啥时候开始,啥时候结束啦
    • 发布于2017-12-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :规格书上面说明不同的两个型号。属于不同类型,参数不同。以下有规格书说明。 回复

  • 串口刷新时间的办法。
    • 发布于2017-12-27
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :74HC4017D,653封装为SO16(SOT109-1),不能和SOP16通用;尺寸不一样 回复

  • 这样的话,就只有靠判断字符间时间间隔了;还有如果帧数据有格式,还个亿根据帧数据格式解析判断,比如,帧前几个字节表示长度。
    • 发布于2017-12-30
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :是同一颗料件。包装区别。 回复

电子老工程师 回复了  :SIT8004AC-13-33E-125.00000Y 厂牌:SiTime 不涉足敏感行业料件 回复

  • 每帧中间要有间隔时间,帧尾前加校验,要有帧头和帧尾
    • 发布于2018-02-07
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :NTCALUG01T103FL 150mm NTCALUG02A103F800A 80mm Vishay 回复

  • 要解决这种问题,有以下方法。

    第一种方法便是串口空闲中断,这种方法结束判断是由硬件完成的,CPU只需中断中处理,基本上是最简单的一种。

    第二种方法是延时判断技术,这种方法我在51单片机上实现的,因为51单片机没有串口空闲中断,所以说我在接收串口数据的时候通常会使用一个变量来计算串口收到的数据量,主程序延时判断这个数字是否与上一次一样,如果延时一定时间判断,数据量和上次一样的话那么就认为数据接收完毕。

    第三种方法是约定一定的通讯协议,在通信协议中加入长度字段,比如说OneNet平台的EDP协议,该协议在第二字节中就指出了剩余消息长度,解析的时候可以直接读第二字节,然后定长接收,超过长度的部分视为非法数据。

    第四种方法是增大缓冲区,例如PC机的缓冲区就有多达kb级别的串口缓冲区,可以考虑在硬件电路上做出改变,增加uart串口缓冲区,但是这种想法对于本人而言,也只是一个想法,还没有实践过。

    • 发布于2018-03-02
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :未查到PCN变更的资料,从客户提供的实物照片来看与资料是有出处的,但从立创的实物照片来看,客户收到的物料是一致的https://item.szlcsc.com/2880505.html 回复

相关问题

问题达人换一批

串口接收如何判断一帧接收完成?