STM32-串口-UART-Asynchronous

打印 上一主题 下一主题

主题 1882|帖子 1882|积分 5646

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一,发送数据

  1. #include "stdio.h"
复制代码
  1. uint8_t hello[]="Hello,blocking\r\n";
  2. HAL_UART_Transmit(&huart1,hello,sizeof(hello),500);       
复制代码
二,MicroLIB-printf(" hello\r\n")

  1. #include "stdio.h"
  2. #ifdef __GNUC__
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  4. #else
  5. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  6. #endif
  7. PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; }
复制代码

注意:每次GENERATE CODE确定勾选MicroLIB,波特率==115200 。
三,中断接收不定长数据

1.usart.c下添加

你只需更改huart->Instance为你利用串口号的,注意发送以回车结束。
  1. uint8_t g_usart_rx_buf[USART_REC_LEN];/* 接收缓冲, 最大USART_REC_LEN个字节. */
  2. uint16_t g_usart_rx_sta = 0;/*  接收状态 bit15,接收完成标志 bit14,接收到0x0d bit13~0,接收到的有效字节数目 */
  3. uint8_t g_rx_buffer[RXBUFFERSIZE];  /* HAL库使用的串口接收缓冲 */
  4. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  5. {
  6.     if (huart->Instance == USART1)                    /* 如果是串口1 */
  7.     {
  8.         if ((g_usart_rx_sta & 0x8000) == 0)             /* 接收未完成 */
  9.         {
  10.             if (g_usart_rx_sta & 0x4000)                /* 接收到了0x0d(即回车键) */
  11.             {
  12.                 if (g_rx_buffer[0] != 0x0a)             /* 接收到的不是0x0a(即不是换行键) */
  13.                 {
  14.                     g_usart_rx_sta = 0;                 /* 接收错误,重新开始 */
  15.                 }
  16.                 else                                    /* 接收到的是0x0a(即换行键) */
  17.                 {
  18.                     g_usart_rx_sta |= 0x8000;           /* 接收完成了 */
  19.                 }
  20.             }
  21.             else                                        /* 还没收到0X0d(即回车键) */
  22.             {
  23.                 if (g_rx_buffer[0] == 0x0d)
  24.                     g_usart_rx_sta |= 0x4000;
  25.                 else
  26.                 {
  27.                     g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0];
  28.                     g_usart_rx_sta++;
  29.                     if (g_usart_rx_sta > (USART_REC_LEN - 1))
  30.                     {
  31.                         g_usart_rx_sta = 0;             /* 接收数据错误,重新开始接收 */
  32.                     }
  33.                 }
  34.             }
  35.         }
  36.                                 HAL_UART_Receive_IT(huart, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
  37.     }
  38. }
复制代码
 2.usart.h下添加

  1. #define USART_REC_LEN               200         /* 定义最大接收字节数 200 */
  2. #define RXBUFFERSIZE  1                        /* 缓存大小 */
  3. extern uint8_t  g_usart_rx_buf[USART_REC_LEN];  /* 接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 */
  4. extern uint16_t g_usart_rx_sta;                 /* 接收状态标记 */
  5. extern uint8_t g_rx_buffer[RXBUFFERSIZE];       /* HAL库USART接收Buffer */
复制代码
3.main.c下开启接收中断

  1. HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
复制代码
4.验证

  1.         uint8_t len;
  2.         uint16_t times = 0;
  3.   while (1)
  4.   {
  5.                         if (g_usart_rx_sta & 0x8000)        /* 接收到了数据? */
  6.                         {
  7.                                         len = g_usart_rx_sta & 0x3fff;  /* 得到此次接收到的数据长度 */
  8.                                         printf("\r\n您发送的消息为:\r\n");
  9.                                         HAL_UART_Transmit(&huart1,(uint8_t*)g_usart_rx_buf, len, 1000);    /* 发送接收到的数据 */
  10.                                         while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);           /* 等待发送结束 */
  11.                                         printf("\r\n\r\n");             /* 插入换行 */
  12.                                         g_usart_rx_sta = 0;
  13.                         }
  14.                         else
  15.                         {
  16.                                         times++;
  17.                                         if (times % 200 == 0) printf("请输入数据,以回车键结束\r\n");
  18.                                         HAL_Delay(10);
  19.                         }
  20.     /* USER CODE END WHILE */
  21.     /* USER CODE BEGIN 3 */
  22.   }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表