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

NUCLEO-U545RE-Q评测】4. 串口实用收发测试

[复制链接]
STM1024 发布时间:2023-12-11 16:36

前面提到了使用串口的HAL库函数实现基本串口数据收发的功能,但是在实际应用中并不大,这里评测和推荐数据发送和接收两个比较好用的方式。

输出重定向

前面的例子中,我们为了发送数据,使用了C语言库函数sprintf先格式化字符串,然后再将字符串通过串口发送,虽然可以使用,但是比较麻烦, 需要自己先规划一个缓冲区,很多人应该在其他的控制器开发中也使用到了printf 重定向的技术,在STM32CubeIDE中也可以很方便的实现。

首先,在main.c函数中,加入如下代码:

/* USER CODE BEGIN 0 */
//redirect printf
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1, (uint8_t*) &ch, 1, 0xFFFF);
    return ch;
}

/* USER CODE END 0 */

留意此处代码放置的问题,有些刚上手的小伙伴会说每次生成代码以后就会把自己写的代码覆盖,其实这个地方的开发者都为我们规划好了位置,放在这些预留位置中间的话,就不会被覆盖了。上面这段代码中,先判断编译器是否为GNUC(实际上就是的),然后决定重定向的函数是__io_putchar还是fputc函数。

接下来,就可以在函数中愉快的使用printf了,例如:

uint8_t x=1;
        while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        printf("hello there, %d %f\n", x, 1.0f / x);
        x++;
        if (x == 0)
            x = 1;
        HAL_Delay(500);
    }

但是你会非常不幸的收到报错:

3.png

已经说的很清楚了,浮点数需要打开相应设置里面的支持,按照说明如下:

4.png

然后编译运行下载即可,运行效果如下:

6.png

至于其他的格式这里就不一一评测了。


空闲中断

相对于发送而言,接收具有很大的不确定性,程序很难知道什么时候外界会输入多少字节的数据给MCU,因此,使用轮询方式是一种高资源占用低效率处理的方式,更好的一种方法自然是使用中断了。得益于MCU的良好设计,在以前使用STM32F1系列标准库的时候,就可以使用接收空闲中断这种方式处理外界发送给MCU的数据,具体实现方式如下:

先将STM32U545的串口1中断使能:

7.png

然后,增加一个缓冲区(用于存放所接收的数据),并打开相关中断:

uint8_t usart1_rxBuff[255] =
{ 0 };//全局变量,存放中断接收数据
//...
HAL_UART_Init(&huart1);
HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart1_rxBuff, 255);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */

并编写相应的中断处理函数:

/* USER CODE BEGIN 4 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    uint8_t rxlen = 0;
    if (huart->Instance == USART1)
    {
        HAL_UARTEx_ReceiveToIdle_IT(&huart1, usart1_rxBuff, 255);
        //-------------------------------------------------
        //中断处理函数

        //eg: 计算接收到的字节个数
        rxlen = strlen((char*) usart1_rxBuff);
        //输出接收数据个数
        printf("Received %d byte(s)\n", rxlen);

        //使用完接收的数据以后注意释放
        memset(usart1_rxBuff, 0x00, 255);
    }
}
/* USER CODE END 4 */

上面这个接收中断处理函数,首先判断外设是否为USART1,然后简单处理一下所接收的数据(计算字节数)并输出,当然, 中断函数应该追求短小精悍、简单快捷的原则,更多的工作可以留到while(1)中去处理,上面的代码作为示例看看就行。

最后编译下载并运行,测试效果如下:

10.png

话说,这个编辑器不使用的残图怎么去掉,我一直没整明白。

4.png
收藏 评论2 发布时间:2023-12-11 16:36

举报

2个回答
h12121 回答时间:2023-12-11 18:05:06

U5的串口收发速度咋样

STM1024 回答时间:2023-12-11 18:46:01

h12121 发表于 2023-12-11 18:05
U5的串口收发速度咋样

[md]我个人感觉是够用的

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