uart通信判断数据接收完成方法——超时检测法

之前一直在想串口中断函数里面怎么判断接收的数据是否收完,其中一种方法可以规定好接收回来的数据的数据格式,比方说固定以换行字符作为结束符号,但是这个方法的问题在于有时候不一定规定得了,换句话说假如单片机和某个芯片模块进行通信,而那个模块发送的数据字节我们则是没办法规定它是以什么结束的,如果是单片机和单片机通信的话就可以。而我后来网上查找资料发现还有一种方法就是超时检测法。


超时检测法其实原理也很简单,就是用定时器去定时扫描,比如:定义一个变量,给这个变量赋一个初值,然后每当进入定时器中断里面,则该变量减一;在串口中断方面,每当进入串口中断,则重新给这个变量赋最初的那个初值。也就是说,如果数据发送完了,那么就不会进入串口中断,因此,当该变量减到为0的时候,我们就可以认为数据已经接收完了。


下面是具体的用STM32写的程序:

1.首先是定时器部分

/******************************************************************************
* 函数原型:void Timer_Init(void)
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 功能描述:用来初始化定时器3
* 备    注:无
******************************************************************************/
void Timer_Init(u32 arr,u32 ps
### STM32 使用 WiFi 数据传输的方法 #### 方法概述 STM32 可以通过外接 WiFi 模块(如 ESP8266 或其他支持 UART 接口的模块)来实现数据传输功能。WiFi 数据传输通常依赖于串口通信接口(UART),将 STM32 的 TX 和 RX 引脚分别连接到 WiFi 模块的 RX 和 TX 引脚[^3]。 为了完成数据传输,需要配置 STM32 的 UART 外设并编写相应的初始化代码。此外,还需要设置 WiFi 模块的工作模式(AP、Station 或 Station+AP)、网络参数以及透传模式下的协议类型(TCP 或 UDP)。以下是具体方法: --- #### 配置 STM32 的 UART 通信 在 STM32 中启用 UART 功能用于与 WiFi 模块通信。以下是一个简单的 UART 初始化函数示例: ```c #include "stm32f1xx_hal.h" void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; // 波特率设置为 115200 bps huart1.Init.WordLength = UART_WORDLENGTH_8B; // 字符长度为 8 位 huart1.Init.StopBits = UART_STOPBITS_1; // 停止位为 1 huart1.Init.Parity = UART_PARITY_NONE; // 无校验 huart1.Init.Mode = UART_MODE_TX_RX; // 同时使能发送和接收 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 不使用硬件流控制 HAL_UART_Init(&huart1); // 初始化 UART } ``` 上述代码实现了 STM32 的 UART1 初步配置,波特率为 `115200`,这是大多数 WiFi 模块默认使用的速率。 --- #### 设置 WiFi 模块工作模式 WiFi 模块可以通过 AT 指令集进行配置。例如,对于 ESP8266 模块,可以执行以下命令将其切换至 Station 模式并连接到指定 Wi-Fi 网络: ```plaintext AT+CWMODE=1 // 设置为 Station 模式 AT+CWJAP="SSID","PASSWORD" // 连接到特定 SSID 和密码的 Wi-Fi 网络 ``` 如果希望进入 AP 模式,则可运行如下指令: ```plaintext AT+CWMODE=2 // 设置为 Access Point (AP) 模式 AT+CWSAP="My_AP","password",1,3 // 创建名为 My_AP 的热点,密码为 password ``` 这些操作可通过 STM32 发送字符串给 WiFi 模块完成[^4]。 --- #### 实现数据传输逻辑 当 WiFi 模块成功接入互联网后,即可利用其透传功能进行数据收发。透传模式允许设备间直接传递二进制数据而无需额外解析协议头信息[^5]。下面展示一段完整的程序框架,演示如何向远程服务器发送浮点数并通过 WiFi 返回结果。 ##### 主循环部分 ```c float temperature = 25.5; // 测量得到的一个温度值 uint32_t temp_u32 = *(uint32_t*)&temperature; // 将 float 转换为 uint32_t 类型 uint8_t data_to_send[4]; memcpy(data_to_send, &temp_u32, sizeof(temp_u32)); // 把 u32 打包成字节数组形式准备发送出去 HAL_UART_Transmit(&huart1, data_to_send, sizeof(data_to_send), HAL_MAX_DELAY); // 上述语句会把打包好的四个字节依次经由 UART 输出送给 WIFI 模块处理。 ``` 同样地,在接收到外部反馈回来的信息之后也需要经历类似的逆过程——先读取原始 byte 数组再还原回对应的数值表示法。 --- #### 注意事项 - **错误检测机制**:实际应用中应加入超时判断及时发现异常状况; - **缓冲区管理**:合理分配内存空间防止溢出现象发生; - **安全性考量**:加密敏感资料避免泄露风险; ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值