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

stm32cube中的HAL库用UART时的问题  

[复制链接]
lzy888 提问时间:2014-9-11 14:02 /
研究了两天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,但是诸如此类的问题解决不了就没法用啊
收藏 2 评论58 发布时间:2014-9-11 14:02

举报

58个回答
魏科 回答时间:2015-4-22 10:19:45
本帖最后由 魏科 于 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的资料比较少,但是设计的很合理,以后用的人也越来越多
有时候对我们国人追求真知的态度真是不敢恭维,一个论坛的问题的回复,大多数都是什么沙发,板凳之类的糟粕,让人有些失望,大家加油吧!




ningzb 回答时间:2018-6-20 17:44:18
2014年遇到的问题,我现在准备用cube和freeRTOS,这个问题好像还是没有很好的解决办法,以前在NXP的CPU测试过,用UCOS基本正常,查看了芯片手册,NXP的串口有4个字节缓冲,STM32串只有1个字节,所以才会有这个问题,不知道有没有人又好的解决办法
damiaa 回答时间:2015-1-6 16:00:42
一般不知道个数的都是接收到一个产生中断,然后在中断中放进你的缓存。在主程序中你想怎么整就怎么整。这就是道理。ST的库只是提供了一种方法。用不用用哪个怎么用还是咋自己说了算。
popdes 回答时间:2014-9-12 09:24:18

回复:stm32cube中的HAL库用UART时的问题

我也是
icevel 回答时间:2014-9-22 12:13:41

回复:stm32cube中的HAL库用UART时的问题

没办法就把SIZE设为1。。。然后循环
stm32_beginner 回答时间:2014-12-29 11:28:14
HAL_UART_Receive_IT 仔细研究了下,接收数必须全部接收到,才会停止接收,才会产生HAL_UART_RxCpltCallback 的确有太多的不确定因素 改了每次接收size为1 ,自己另外定义接收的缓存,每次接收一个,在HAL_UART_RxCpltCallback内往自己的缓存丢,循环中再处理接收的数据就可以了。
stm32_beginner 回答时间:2015-1-6 14:18:52
我调通了,可以参照下
基于stm32cubef4带协议的串口通信在407运行成功
https://www.stmcu.org.cn/module/ ... &fromuid=130604
(出处: 意法半导体STM32/STM8技术社区)
xyc2690 回答时间:2015-1-9 10:17:55
串口通信的话还是用帧同步比较好,没有通信协议确实不太方便处理。
逍遥李 回答时间:2015-2-13 20:38:38
damiaa 发表于 2015-1-6 16:00
一般不知道个数的都是接收到一个产生中断,然后在中断中放进你的缓存。在主程序中你想怎么整就怎么整。这就 ...

感谢!正在头疼这个接收问题
党国特派员 回答时间:2015-4-23 07:29:52
魏科 发表于 2015-4-22 10:19
大家好,这是我在这个社区第一次发言,我开始也遇到这个问题,后来在百度和google都没有查到好的解决办法, ...

很明显楼主是在不带操作系统的情况使用串口。 blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png
党国特派员 回答时间:2015-4-23 07:33:26
给你这个建议,我们可以灵活变通,HAL_UART显然是接收固定字节,那我们可以在发送的时候对数据进行对齐啊。
魏科 回答时间:2015-4-23 09:25:36
党国特派员 发表于 2015-4-23 07:29
很明显楼主是在不带操作系统的情况使用串口。

不好意思,我比较笨,没有明显看出来楼主是否带操作系统,其实带不带操作系统又有什么区别呢!
popo_0214 回答时间:2015-5-7 11:15:31
魏科 发表于 2015-4-23 09:25
不好意思,我比较笨,没有明显看出来楼主是否带操作系统,其实带不带操作系统又有什么区别呢! ...

osSemaphoreCreate()函数没找到 不带操作系统是不是没用这个函数啊?

劳动节才开始认识stm32
为什么是EEFOCUS小白 回答时间:2015-5-7 11:32:20
HAL库和3.5库有什么区别呢
BG4RFF 回答时间:2015-5-16 15:20:29
其实4楼的办法是很好用的,我也在串口助手上实现了,但是回显不能在接收中断中用中断方式发送,直接用阻塞方式发送了也行的
1234下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版