用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
<span style="font-size: medium; "><span style="font-family: 宋体; ">我用DMA方式从USART口接收数据,转存到缓存中,缓存大小为255,实际接收数据每包RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
这个数据包格式你自己能控制吗?也就是你自己定义的吗?如果是,那就容易一些,在包结束最后一个字节增加标示符,随便定义一个字符都行。根据包结束符,来判定一次DMA接收。
2、如果这个数据包是字符串,根据判定结束字符0x0d,0x0a字符来启动下一次DMA接收。
3、系统给定数据包,一般这样的数据包格式都比较固定。
这样需要判定每次结束符,来启动下一次DMA转换。
思路就是:根据接收到的字符最后一个或两个字节内容来判定结束标记。
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
楼上说的比较好,1、就是自定顶一个协议, 启动和停止用一个特定字符串来表示;如5A5A5A5A表示启动,A5A5A5A5表示停止。发送时以启动开头,以停止结尾,接收时可以检查。
2、发送一个字符串,第一个字节表示发送数据段的长度,紧接着是数据的内容; 接收时就可以知道数据接受完了没有。
很多协议都是这么实现的,比较常见的如USB协议的描述符实现
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
如果没有特殊的结束字符串很难办的,有的话按1楼方法做就行回复:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
上层可以自己封装一下,做一个包头一个结束RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
还是不建议LZ使用DMA接收, 接收最好使用中断方式, 这样易控制些。RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
还是不建议LZ使用DMA接收, 接收最好使用中断方式, 这样易控制些。RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
其实很简单的,发送的包分成两种,比如包A和包B,其中包B是你要发送的数据,包A只是包B的字节数目,而且包A的长度是固定的。每次都首先发送包A告之接收方包B的长度,然后再发送包B,如此一直下去就可以了。这是用DMA发送和接收不定长包的最好方式。其它的方法都太过复杂,操作性不强。回复:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
回复第 8 楼 于2014-01-18 20:00:45发表:其实很简单的,发送的包分成两种,比如包A和包B,其中包B是你要发送的数据,包A只是包B的字节数目,而且包A的长度是固定的。每次都首先发送包A告之接收方包B的长度,然后再发送包B,如此一直下去就可以了。这是用DMA发送和接收不定长包的最好方式。其它的方法都太过复杂,操作性不强。
你说的是一个完整的串口通信协议格式,原理是一样的,
自定义的串口通信协议一般都是这样:
帧头 +数据大小+ 数据内容+校验码+结束符
这种格式是串口通信最稳定的方法之一。
RE:用DMA方式从串行USART口连续接收数据,怎样确认收到一个完整的包。
谢谢各位大侠,我先和上位机协商一下,价格结束符试试。
页:
[1]
2