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

基于stm32f103的HAL库CUBEMX串口通信经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:45
串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

一.物理层
1.标准

根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进
行转换。

2130b1a6ca0547ff9a58a0b27dc3fbe9.png


2.波特率
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。

3.引脚
TX:发送数据输出引脚。
RX:接收数据输入引脚。
(与单片机相连接时,TX----RX,RX------TX)


二.代码层
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制
  3. HAL_UART_Transmit_IT();串口中断模式发送  
  4. HAL_UART_Receive_IT();串口中断模式接收
  5. HAL_UART_Transmit_DMA();串口DMA模式发送
  6. HAL_UART_Transmit_DMA();串口DMA模式接收
复制代码

1.发送函数
  1. HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
复制代码

8adf45855eba48089994bc38e0c34343.png

这里图片引自Z小旋博主的文章


2.中断接收
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
复制代码
  1. 举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);   //中断接收一个字符,存储到value中
复制代码

3.回调函数
  1. HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  
复制代码

在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中

4.重定义
在代码中可直接使用printf打印数据来检测数据
  1. /**
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  3.   * 输入参数: 无
  4.   * 返 回 值: 无
  5.   * 说    明:无
  6.   */
  7. int fputc(int ch, FILE *f)
  8. {
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  10.   return ch;
  11. }

  12. /**
  13.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  14.   * 输入参数: 无
  15.   * 返 回 值: 无
  16.   * 说    明:无
  17.   */
  18. int fgetc(FILE *f)
  19. {
  20.   uint8_t ch = 0;
  21.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  22.   return ch;
  23. }
复制代码

5.上位机
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应

6.串口中断
在cubemx中配置好中断之后,声明
HAL_UART_Receive_IT(&huart1,usart1_rx,6);
在main函数下添加回调函数
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断
  4.         {
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);
  7.         }
  8. }
复制代码

串口打印

2c111eb74d5847e7a6e2dcf991e3f054.png

每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
————————————————
版权声明:地球先生_
如有侵权请联系删除



收藏 评论0 发布时间:2023-5-1 16:45

举报

0个回答

所属标签

相似分享

官网相关资源

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