当前位置:   article > 正文

STM32系列——串口收发数据基础_stm32串口接收数据

stm32串口接收数据
  1. 串行接口相关知识
  • 两种通信方式:并行通信与串行通信,并行通信传输速度快但是占用的引脚资源多,串行通信传输速度慢但是占用的引脚资源少。

  • 三种模式:单工、半双工、全双工

  • 异步串行通信:通信双方在没有同步时钟的前提下,将一个字符(包括特定的附加位)按位进行传输的通信方式。

  • 波特率:每秒钟传输的二进制位数,如9600bps。

  • 串口<--------->USB接口:CH340 CP2012

  • STM32芯片的串口UASRT功能十分强大,但对于日常编程而言,使用最多的还是异步串行通信。

USART1_TX与PA9复用,USART1_RX与PA10复用。

USART2_TX与PA2复用,USART2_RX与PA3复用。

  1. STM32CubeMX中关于USART的配置

注意:(1)Mode模式设置为异步通信;(2)波特率配置要与上位机选择的一致;

  1. HAL库中串口发送的重要函数(重点)
  • 阻塞式发送函数(串口数据发送完以后,单片机才能执行下一步程序,一般串口需要发送的数据也不多,等他发完也不会花太多时间,所以其影响可忽略不计)

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

四个参数:使用哪个串口;需要发送的数据(是字符串还是字节获数组);数据大小;设定的发送时间;

  • 非阻塞式发送函数(串口发送数据,不需要等待发送完数据,单片机能执行下一步程序,一般用于串口需要发送很长的数据的情况)待串口将数据发送完以后,回调对应中断服务函数。

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

  • 发送完毕中断回调函数

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);

  1. 串口发送数据实例
  • 使用非阻塞式的串口发送函数,将发送缓数组dat_Txd中的前5个数据发送到USART1,在数据发送完成后,翻转PB9引脚的输出电平。

  1. HAL_UART_Transmit_IT(&huart1,&dat_Txd,5);//调用非阻塞式的串口发送函数
  2. void HAL_UART_TxCpltCalback(UART_HandleTypeDef *huart)//发送完毕中断回调函数
  3. {
  4.     if(huart->Instance == USART1)//判断是否为串口1
  5.     {
  6.         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
  7.     }
  8. }
  • 补充:使用阻塞式的串口发送函数怎么写代码?

  1. HAL_UART_Transmit(&huart1, &dat_Txd, 5, 10000);
  2. HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
  1. HAL库中串口接收的重要函数(重点)
  • 阻塞式接收函数(不推荐使用,一般不知道什么时候能够接受到数据,单片机不可能一直不工作只为等着接收数据)

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  • 非阻塞式接收函数(推荐使用)

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

  • 接收完毕中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

  1. 串口接收数据实例
  • 使用非阻塞式的串口接收函数,接收USART1的一个字节,将其保存在变量dat_Txd中,在数据接收完成后若该字节为0x5A,翻转PB8引脚的输出电平。

  1. HAL_UART_Receive_IT(&huart1,&dat_Rxd,1);//调用非阻塞式的串口发送函数
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  3. {
  4.     if(huart->Instance == USART1)//判断是否为串口1
  5. {
  6.         if(huart->Instance == USART1)
  7.          {
  8.             if(dat_Rxd == 0x5A)
  9.             HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
  10.         }
  11. }
  12. }
  1. 综合实训

STM32F103C8T6开发板上,连接相关外电路, 还需要一个串口,利用STM32CubeMX和Keil5协同开发,完成以下的功能。

【1】开机后,向串口1发送“hello world ! ”。

【2】串口1收到字节指令“OxA1”,PB9输出高电平,发送“LED1 Open ! ”。

【3】串口1收到字节指令“OxA2”,PB9输出低电平,发送“LED1 Closed! ”。

【4】在串口发送过程中,翻转PB8作为发送数据指示灯。

(1)cubmx配置

在本文第2点关于USART的配置基础下勾选中断,并将波特率修改为9600。

(2)Keil5编写代码
  1. /* Private user code ---------------------------------------------------------*/
  2. /* USER CODE BEGIN 0 */
  3. /*宏定义*/
  4. #define LED1_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
  5. #define LED1_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  6. #define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
  7. #define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
  8. uint8_t Tx_str1[] = "hello world!\r\n";
  9. uint8_t Tx_str2[] = "LED1 Open!\r\n";
  10. uint8_t Tx_str3[] = "LED1 Close!\r\n";
  11. uint8_t RX_dat = 0;
  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  13. {
  14. if(huart->Instance == USART1)//判断是否为串口1
  15. {
  16. if(huart->Instance == USART1)
  17. {
  18. if(RX_dat == 0xa1)
  19. {
  20. LED1_ON();
  21. LED2_ON();
  22. HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str2),10000);
  23. LED2_OFF();
  24. HAL_UART_Receive_IT(&huart1,&RX_dat,1);
  25. }
  26. else if(RX_dat == 0xa2)
  27. {
  28. LED1_OFF();
  29. LED2_ON();
  30. HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str3),10000);
  31. LED2_OFF();
  32. HAL_UART_Receive_IT(&huart1,&RX_dat,1);
  33. }
  34. }
  35. }
  36. }
  37. /* USER CODE END 0 */
  1. /* USER CODE BEGIN 2 */
  2. LED2_ON();
  3. HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);
  4. LED2_OFF();
  5. HAL_UART_Receive_IT(&huart1,&RX_dat,1);
  6. /* USER CODE END 2 */
操作完毕!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/399588
推荐阅读
相关标签
  

闽ICP备14008679号