当前位置: 首页 > article >正文

STM32-串口-UART-Asynchronous

一,发送数据

#include "stdio.h"
uint8_t hello[]="Hello,blocking\r\n";
HAL_UART_Transmit(&huart1,hello,sizeof(hello),500);	

二,MicroLIB-printf(" hello\r\n")

#include "stdio.h"
#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; }

注意:每次GENERATE CODE确定勾选MicroLIB,波特率==115200 。

三,中断接收不定长数据

1.usart.c下添加

你只需更改huart->Instance为你使用串口号的,注意发送以回车结束。

uint8_t g_usart_rx_buf[USART_REC_LEN];/* 接收缓冲, 最大USART_REC_LEN个字节. */
uint16_t g_usart_rx_sta = 0;/*  接收状态 bit15,接收完成标志 bit14,接收到0x0d bit13~0,接收到的有效字节数目 */
uint8_t g_rx_buffer[RXBUFFERSIZE];  /* HAL库使用的串口接收缓冲 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)                    /* 如果是串口1 */
    {
        if ((g_usart_rx_sta & 0x8000) == 0)             /* 接收未完成 */
        {
            if (g_usart_rx_sta & 0x4000)                /* 接收到了0x0d(即回车键) */
            {
                if (g_rx_buffer[0] != 0x0a)             /* 接收到的不是0x0a(即不是换行键) */
                {
                    g_usart_rx_sta = 0;                 /* 接收错误,重新开始 */
                }
                else                                    /* 接收到的是0x0a(即换行键) */
                {
                    g_usart_rx_sta |= 0x8000;           /* 接收完成了 */
                }
            }
            else                                        /* 还没收到0X0d(即回车键) */
            {
                if (g_rx_buffer[0] == 0x0d)
                    g_usart_rx_sta |= 0x4000;
                else
                {
                    g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0];
                    g_usart_rx_sta++;

                    if (g_usart_rx_sta > (USART_REC_LEN - 1))
                    {
                        g_usart_rx_sta = 0;             /* 接收数据错误,重新开始接收 */
                    }
                }
            }
        }
				HAL_UART_Receive_IT(huart, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
    }
}
 2.usart.h下添加
#define USART_REC_LEN               200         /* 定义最大接收字节数 200 */
#define RXBUFFERSIZE  1                        /* 缓存大小 */
extern uint8_t  g_usart_rx_buf[USART_REC_LEN];  /* 接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 */
extern uint16_t g_usart_rx_sta;                 /* 接收状态标记 */
extern uint8_t g_rx_buffer[RXBUFFERSIZE];       /* HAL库USART接收Buffer */
3.main.c下开启接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
4.验证
	uint8_t len;
	uint16_t times = 0;
  while (1)
  {
			if (g_usart_rx_sta & 0x8000)        /* 接收到了数据? */
			{
					len = g_usart_rx_sta & 0x3fff;  /* 得到此次接收到的数据长度 */
					printf("\r\n您发送的消息为:\r\n");

					HAL_UART_Transmit(&huart1,(uint8_t*)g_usart_rx_buf, len, 1000);    /* 发送接收到的数据 */
					while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);           /* 等待发送结束 */
					printf("\r\n\r\n");             /* 插入换行 */
					g_usart_rx_sta = 0;
			}
			else
			{
					times++;

					if (times % 200 == 0) printf("请输入数据,以回车键结束\r\n");

					HAL_Delay(10);
			}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

http://www.kler.cn/a/507090.html

相关文章:

  • 怎么用python写个唤醒睡眠电脑的脚本?
  • Git学习笔记
  • 《鸿蒙Next微内核:解锁人工智能决策树并行计算的加速密码》
  • 【redis】键的全局命令
  • 《小迪安全》学习笔记05
  • React 中hooks之useLayoutEffect 用法总结以及与useEffect的区别
  • NVIDIA视频编解码
  • 无法联网怎么在docker中安装Ribbitmq
  • 25/1/15 嵌入式笔记 初学STM32F108
  • 基于空气动力学原理提升无人机效率的策略探究
  • 《自动驾驶与机器人中的SLAM技术》ch4:预积分学
  • SSE部署后无法连接问题解决
  • ubuntu20.04 docker安装
  • 算法——归并排序(基本思想、java实现、实现图解)
  • 使用hutools 生成excel
  • Python学习(三)基础入门(数据类型、变量、条件判断、模式匹配、循环)
  • keepalived双机热备(LVS+keepalived)实验笔记
  • 联通用户管理系统(一)
  • LeetCode 1773. 统计匹配检索规则的物品数量
  • 【docker踩坑记录】
  • @Scope(“prototype“)
  • 网络安全面试题汇总(个人经验)
  • 安装 Docker GPU 版本的过程及遇到的坑
  • ubuntu开机自启某个应用
  • 《机器学习》自然语言处理之TF-IDF
  • 实力认证 | 海云安入选《信创安全产品及服务购买决策参考》