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

Cube下实现串口+DMA+空闲中断接收不定长数据  

[复制链接]
wjjontheway 提问时间:2015-7-30 16:38 /
阅读主题, 点击返回1楼
4 收藏 22 评论81 发布时间:2015-7-30 16:38
81个回答
wjjontheway 回答时间:2015-8-1 10:41:42
smare 发表于 2015-7-31 20:27
正需要这个。明天测试一下楼主的方法。谢谢

行,测完有什么考虑不周全的地方一起聊聊,我也只是大概弄了下,后面串口接收的时候说不定会出什么问题。我的回调函数还没有定义。
geter 回答时间:2015-9-7 11:03:19
很不错的帖子
Sphinx001 回答时间:2015-9-19 10:47:23
wjjontheway 发表于 2015-7-30 17:16
按HAL的回调方式写,是指在HAL_UART_IRQHandler()中添加   
tmp1 = __HAL_UART_GET_FLAG(huart, UART_F ...

你可以把HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);放在 if里面 初始化也要开启一次
                        }
太阳部落 回答时间:2015-12-8 18:45:33
刚刚接触这块,有个地方不明白:使能了串口空闲中断,那么没有数据接收的时候不就一直中断吗?再请教一个问题:HAL_UART_Receive_DMA这个函数如果接收的数据长度大于指定长度,这个函数会跳转到哪里?
光环 回答时间:2015-12-9 16:40:00
刚接触STM32 ,试验了一下楼主程序,每次重启MCU后,第一次向mcu发送数据,收不到,从第二次以后就正常了。不知什么原因?
另外:下面不理解的地方,请教:
if((tmp_flag != RESET))
       {
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);
                temp = huart1.Instance->SR;      这里的赋值是什么意义?
                temp = huart1.Instance->DR;      这里的赋值是什么意义?
                HAL_UART_DMAStop(&huart1);
                temp  = hdma_usart1_rx.Instance->NDTR;            
                rx_len =  BUFFER_SIZE - temp;                           
                 recv_end_flag = 1;
         }
刚接触STM32,请问见笑。
haitio-33754 回答时间:2015-12-10 10:43:33
光环 发表于 2015-12-9 16:40
刚接触STM32 ,试验了一下楼主程序,每次重启MCU后,第一次向mcu发送数据,收不到,从第二次以后就正常了。 ...

                temp = huart1.Instance->SR;      这里的赋值是什么意义?
                temp = huart1.Instance->DR;      这里的赋值是什么意义?
这不是赋值,这是STM32的寄存器操作方式,先读uart的SR寄存器,再读DR寄存器,可以清除某些标志位。
但是我也不清楚为啥要在这里清除这些标志位呢。按照我的理解,楼主可能是想把IDLE标志位给清除掉,但是前面不是已经调用 __HAL_UART_CLEAR_IDLEFLAG(&huart1)这个函数清除掉了么?为什么重新来一次呢?
光环 回答时间:2015-12-10 11:22:13
本帖最后由 光环 于 2015-12-10 11:27 编辑
haitio-33754 发表于 2015-12-10 10:43
temp = huart1.Instance->SR;      这里的赋值是什么意义?
                temp = hua ...

感谢,明白了,是为了清除标志,谢谢你。另外我试验了一下:
1、注释掉这两句也能正常接收。
2、我将 HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE); 放到while(1)前面(只执行一次)也可以正常接收。
quanqiuying 回答时间:2015-12-28 11:37:01
要用循环模式
飘云如风 回答时间:2016-3-1 15:51:07
谢谢楼主分享。支持
ontot 回答时间:2016-4-14 14:14:53
我正在写这个程序,今天下午正在想怎么解决这个问题呢,刚刚好想法不谋而合。你那个长度获取对我来说也有吸引力。这个用在485上完美了。C:\Users\Tsar\Desktop\2016-04-14_141327.png
mjun5210 回答时间:2016-6-23 16:58:04
你们用空闲中断,会不会丢数据?我的丢数据很严重。
mjun5210 回答时间:2016-6-23 16:58:20
你们用空闲中断,会不会丢数据?我的丢数据很严重。
efree 回答时间:2016-7-25 16:39:13
好资料。顶一下。
dongyichen 回答时间:2016-10-26 14:22:33
我的也用DMA加串口空闲接收数据,也丢失很严重,不知道为啥呢。待会我上传下代码,各位看下
ynwscfsfi 回答时间:2016-10-26 14:37:39

多谢分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版