完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
研究了两天cube就发现一个问题,HAL库中UART的操作,有DMA和IT两种方式,发送数据时没有问题,接收数据时的函数
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 和HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE)中都必须提供接收个数这个参数,接收时谁能确定究竟是收多少个,这个参数没法提供,那这就没法用了,改他的HAL也不是好办法,这就决定了cube这个东西没法用了. 有碰到这个问题的吗,想用cube,但是诸如此类的问题解决不了就没法用啊 |
|
相关推荐
60个回答
|
|
|
本帖最后由 魏科 于 2015-4-22 10:36 编辑
大家好,这是我在这个社区第一次发言,我开始也遇到这个问题,后来在百度和google都没有查到好的解决办法,我用的是串口中断,如果单纯按照大家说的去做代码会是这样的: void test_task(void const * argument) { uint8_t abyte[1] ; uc1_init(); uc1_sendbyte(0xAA); for(;;) { while(HAL_OK != HAL_UART_Receive_IT(&huart1,abyte,1)); uc1_sendbyte(abyte[0]); } } 但是这样单纯用串口工具一次发送一个byte是没问题的,如果是发送多个Byte就有问题了,我看了一下 HAL_UART_Receive_IT的实现方式,采用了以下解决方法: 软件硬件环境: STM32F030XXX 软件环境: MDK5.0, STM32Cube,FreeRTOS 在串口部分需要添加串口的信号量,如下代码所示: void uc1_init(void) { /*创建串口信号量*/ uc1sem_id = osSemaphoreCreate(0,1); /*让串口信号量耗尽*/ while(osOK != osSemaphoreWait(uc1sem_id,0)); } 让串口信号量先耗尽的原因是好让串口接收任务第一次请求该信号量的时候就挂起任务 随后,在接收任务中代码是这样的: void test_task(void const * argument) { uint8_t abyte[1] ; uc1_init(); for(;;) { //请求打开接收中断,每次接收1个字节,该函数一般会立即返回 while(HAL_OK != HAL_UART_Receive_IT(&huart1,abyte,1)); //等待信号量被唤醒 while(osOK != osSemaphoreWait(uc1sem_id,0)); //打印本次接收到的数据 uc1_sendbyte(abyte[0]); } } 那么uc1sem_id一般在哪里唤醒呢,就是在HAL_UART_RxCpltCallback回调函数中,代码如下: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { if(UartHandle == &huart1) { osSemaphoreRelease(uc1sem_id); } }另外,sendbyte代码如下: void uc1_sendbyte(uint8_t dat) { while(HAL_OK != HAL_UART_Transmit_IT(&huart1,&dat,1)); } 这样就可以一次发送多个连续byte了 写在这里给遇到有同样问题的朋友,希望能帮到大家 STM32Cube的资料比较少,但是设计的很合理,以后用的人也越来越多 有时候对我们国人追求真知的态度真是不敢恭维,一个论坛的问题的回复,大多数都是什么沙发,板凳之类的糟粕,让人有些失望,大家加油吧! |
|
|
|
|
|
我也是
|
|
|
|
|
|
没办法就把SIZE设为1。。。然后循环
|
|
|
|
|
|
HAL_UART_Receive_IT 仔细研究了下,接收数必须全部接收到,才会停止接收,才会产生HAL_UART_RxCpltCallback 的确有太多的不确定因素 改了每次接收size为1 ,自己另外定义接收的缓存,每次接收一个,在HAL_UART_RxCpltCallback内往自己的缓存丢,循环中再处理接收的数据就可以了。
|
|
|
|
|
|
我调通了,可以参照下
基于stm32cubef4带协议的串口通信在407运行成功 http://www.stmcu.org/module/foru ... &fromuid=130604 (出处: 意法半导体STM32/STM8技术社区) |
|
|
|
|
|
一般不知道个数的都是接收到一个产生中断,然后在中断中放进你的缓存。在主程序中你想怎么整就怎么整。这就是道理。ST的库只是提供了一种方法。用不用用哪个怎么用还是咋自己说了算。
|
|
|
|
|
|
串口通信的话还是用帧同步比较好,没有通信协议确实不太方便处理。
|
|
|
|
|
ke3978 发表于 2019-1-4 07:14 感谢!正在头疼这个接收问题 |
|
|
|
|
xiuzhen122 发表于 2019-1-4 06:21 很明显楼主是在不带操作系统的情况使用串口。 |
|
|
|
|
|
给你这个建议,我们可以灵活变通,HAL_UART显然是接收固定字节,那我们可以在发送的时候对数据进行对齐啊。
|
|
|
|
|
|
不好意思,我比较笨,没有明显看出来楼主是否带操作系统,其实带不带操作系统又有什么区别呢! |
|
|
|
|
|
osSemaphoreCreate()函数没找到 不带操作系统是不是没用这个函数啊? 劳动节才开始认识stm32 |
|
|
|
|
|
HAL库和3.5库有什么区别呢
|
|
|
|
|
|
其实4楼的办法是很好用的,我也在串口助手上实现了,但是回显不能在接收中断中用中断方式发送,直接用阻塞方式发送了也行的
|
|
|
|
|
|
基本不用库,最多也是参考
|
|
|
|
|
ke3978 发表于 2019-1-4 07:14 串口一般都有FIFO缓冲,打开这个缓冲,然后减少中断次数,一次可以接受8个或者16个字节,而不是1个字节,效率提升至少8倍或16倍。 接受完数据后再根据自己的实际情况进行数据分析处理。 |
|
|
|
|
xiuzhen122 发表于 2019-1-4 06:21 你这个是不错,为什么非得添加一个: /*让串口信号量耗尽*/ while(osOK != osSemaphoreWait(uc1sem_id,0)); 直接设置这个信号量可用就行了。 |
|
|
|
|
|
发送,接收都有个timeout,设置个timeout,在超时时就没什么问题,这个在freertos中就比较实用,可能HAL主要针对带实时系统的程序吧,
|
|
|
|
|
|
的确如此
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:57 , Processed in 1.077253 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1255