你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于串口DMA循环接收方式的数据错位问题!

[复制链接]
robotfan 提问时间:2014-12-8 17:20 /
uint8_t Buffrev[5];

DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;           
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Buffrev;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;               
DMA_InitStructure.DMA_BufferSize = 1;            
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;               
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;           
DMA_Init(DMA1_Channel5, &DMA_InitStructure);            
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
DMA_Cmd (DMA1_Channel5,ENABLE);

问题描述:
比如上位机发送的数据为十六进制0x12 0x13 0x14 0x15 0x16五个字节,下位机在开启DMA循环接收模式(DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_BufferSize = 5;)后正常传输后Buffrev[0]=0x12,Buffrev[1]=0x13,Buffrev[2]=0x14,Buffrev[3]=0x15,Buffrev[4]=0x16,但万一上位机发送有误或发生干扰,传输的过程中多了或少了一个字节数据,比如实际发送了0x12 0x13 0x14 0x15 0x16 0xAA 六个数据,则第一次数据接收正常,这时其实Buffrev[0]=0xAA,第二次发送正确数据的时候0x12 0x13 0x14 0x15 0x16,接收到0x15就产生了DMA接受中断Buffrev[0]=0xAA,Buffrev[1]=0x12,Buffrev[2]=0x13,Buffrev[3]=0x14,Buffrev[4]=0x15,这样我接受的数据就全部错位了,请问大家如何解决?

收藏 评论4 发布时间:2014-12-8 17:20

举报

4个回答
robotfan 回答时间:2014-12-8 21:57:54
:):)
巅峰残狼 回答时间:2014-12-9 09:00:13
程序中做一个校验呢,比如说
if(Buffrev[0]=0x12 && Buffrev[1]=0x13 &&Buffrev[2]=0x14 && Buffrev[3]=0x15 && Buffrev[4]=0x16)
{
      //执行你的代码;
}
else
{
     //丢包;
}
也就是说,收到错误的数据时就丢包,正确再执行

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

arm8686 回答时间:2014-12-9 10:35:05
在我看来,DMA循环接收这种模式,并不适合楼主所描述的这种简单应用场合。
它类似于 FIFO,适合较多数据的传输,而且,每个数据帧(数据包)里头应该包含着校验值。
当然,还可以加上帧头、帧长、帧尾这些冗余信息。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

dsjsjf 回答时间:2018-3-19 18:51:04
DMA加串口空闲中断是绝配,绝对好用

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版