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

专业图库网站 西安泗阳网站建设公司

专业图库网站 西安,泗阳网站建设公司,免费虚拟主机空间申请,上海工商网上注册大厅根据上节#xff0c;我们一已经完成了串口发送程序的代码#xff0c;并且深入的解析探索了串口的原理#xff0c;接下来#xff0c;Whappy小编将带领大家进入串口接收程序的探索与实验#xff0c;并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图…根据上节我们一已经完成了串口发送程序的代码并且深入的解析探索了串口的原理接下来Whappy小编将带领大家进入串口接收程序的探索与实验并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图为数据手册推荐的TX和RX的GPIO的配置模式 代码逐步解释 设置波特率 c 复制代码 USART1_InitStructure.USART_BaudRate 9600; 配置串口的通信速率为 9600 bps这决定了串口通信的速率。 硬件流控 c 复制代码 USART1_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; 不使用硬件流控制如 RTS 和 CTS 信号。默认只进行基本的 TX/RX 数据传输。 工作模式 c 复制代码 USART1_InitStructure.USART_Mode USART_Mode_Tx; 设置为发送模式Tx即该配置目前只支持数据发送不包括接收。 校验位设置 c 复制代码 USART1_InitStructure.USART_Parity USART_Parity_No; 不使用奇偶校验位。 停止位 c 复制代码 USART1_InitStructure.USART_StopBits USART_StopBits_1; 设置 1 个停止位。 字长设置 c 复制代码 USART1_InitStructure.USART_WordLength USART_WordLength_8b; 设置字长为 8 位不包括起始位、校验位和停止位。 初始化 USART1 c 复制代码 USART_Init(USART1, USART1_InitStructure); 调用库函数对 USART1 进行初始化应用上述配置。 使能 USART1 c 复制代码 USART_Cmd(USART1, ENABLE); 启用 USART1 外设。 如何添加接收功能 要使能接收功能需要将 USART_Mode 设置为接收模式或同时支持发送和接收模式并适配相应的 GPIO 引脚如 RX 引脚。 修改代码 c 复制代码 USART1_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx; 添加接收引脚的初始化 初始化 GPIOA 的 PA10USART1 RX为浮空输入或上拉输入模式 c 复制代码 GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(GPIOA, GPIO_InitStructure); 使用 USART 接收功能 接收数据可以通过轮询方式或中断方式读取数据。 轮询方式 使用 USART_ReceiveData 读取接收到的数据 c 复制代码 if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) SET) { uint8_t received_data USART_ReceiveData(USART1); // 读取数据 } 中断方式 使能 USART1 的接收中断 c 复制代码 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART1_IRQn); // 使能中断 在中断处理函数中读取数据 c 复制代码 void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) { uint8_t received_data USART_ReceiveData(USART1); // 读取接收到的数据 // 处理接收到的数据 } } 这个可以给大家说一下目前以及以前学的都是STM32内部集成的外设 在这里Whappy给大家整理一下也可以看对应的数据手册 以下是 STM32 内部外设整理的表格适合 A4 大小打印 分类外设名称功能描述备注通信外设USART/UART串口通信支持异步传输部分支持 LIN、IrDA、Modbus。常用作调试串口和外设通信。SPI全双工同步通信用于连接传感器、存储设备等。常用于高速短距离数据传输。I2C主从同步通信协议连接低速设备如 EEPROM、传感器。适用于多设备共享通信总线。CAN工业控制和汽车通信网络。适合实时和抗干扰场景。USB支持设备/主机/OTG 模式可实现与 PC 的通信。部分型号支持 USB 2.0。Ethernet网络通信接口用于数据网络传输。高性能型号支持。SDIO与 SD 卡或 MMC 卡通信。常用于外部存储扩展。定时器外设通用定时器TIMxPWM 生成、定时、中断产生、脉冲计数等。提供灵活的定时功能。高级定时器支持复杂 PWM适合电机控制场景。例如TIM1、TIM8。基础定时器用于简单的时间基准如滴答定时器。例如TIM6、TIM7。看门狗定时器独立看门狗和窗口看门狗用于提高系统容错性。防止程序跑飞。模拟外设ADC多通道模数转换通常为 12 位分辨率。部分型号支持 16 位高精度 ADC。DAC数模转换将数字信号输出为模拟电压。用于波形生成。比较器模拟信号比较可实现过零检测。多用于实时保护电路。运算放大器集成模拟放大电路便于信号处理。仅部分高端型号支持。存储外设闪存Flash Memory存储程序代码支持在线擦写。用于固件存储。SRAM数据存储静态随机存储器。易失性存储器。EEPROM保存配置数据非易失性存储器。部分型号支持内置。控制与管理外设DMA提高数据传输效率减少 CPU 干预。用于大数据量传输场景。RTC提供低功耗实时时钟支持日期和时间功能。适合低功耗应用。电源管理模块支持睡眠、停止、待机模式。降低能耗。PVD电源电压检测器用于检测异常电压。提供电源保护。GPIOGPIO通用输入输出接口支持输入/输出/模拟模式。可复用为外设功能引脚。安全外设CRC提供数据完整性校验。用于通信或存储校验。TRNG真随机数生成器用于加密。常见于安全应用。硬件加密引擎支持 AES、SHA 等硬件加速算法。提高加密运算效率。显示外设LCD 控制器驱动 LCD 显示屏支持多种接口标准。仅部分型号支持。FSMC/FMC支持连接外部存储器或显示屏。高性能型号提供支持。特殊外设触摸感应控制器支持触摸按键或触摸屏检测。用于人机交互设计。硬件 DIV/SQRT硬件实现除法与开方运算提高效率。部分型号支持。 不同 STM32 系列如 F1、F4、H7 等外设配置有所差异实际使用时需查阅对应芯片的参考手册 代码加入部分 配置接收部分只需另初始化一下GPIOA的PA10即可然后在初始化的串口模式配置中或上一个接收部分的模式即可 接收部分有查询和中断模式下面分别演示一下这个模式 在 STM32 或嵌入式开发中轮询方式和中断方式是两种常用的外设数据处理方式。两者的核心区别在于程序对外设事件的响应机制 1. 轮询方式 工作原理 程序不断检查某个标志位例如USART 的接收标志位 USART_FLAG_RXNE当标志位被设置时执行相应操作。轮询方式是同步的程序在等待某个事件发生时无法执行其他任务。 优点 实现简单不需要配置中断。不涉及中断优先级代码逻辑直观。 缺点 占用 CPU 时间程序不断地检查标志位会浪费大量 CPU 时间。不适合实时性高或需要处理多任务的场景。 void USART_PollingReceive(void) {uint8_t received_data;while (1) {// 检查 RXNE 标志位判断是否有数据可读if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) SET) {// 读取数据received_data USART_ReceiveData(USART1);// 处理接收到的数据printf(Received: %c\n, received_data);}} }执行流程 程序进入一个无限循环。持续检查 USART_FLAG_RXNE 是否置位。如果有数据则读取处理。 2. 中断方式 工作原理 程序无需主动检查某个标志位。外设事件发生例如 USART 接收到数据时自动触发中断CPU 跳转到中断服务程序执行预设操作。中断方式是异步的外设与主程序解耦CPU 能处理其他任务。 优点 高效CPU 只在外设有事件发生时响应不浪费时间。支持实时性要求高的场景。易于实现多任务系统的并行性。 缺点 实现较复杂需要配置中断向量表、优先级等。如果中断处理时间过长可能影响系统的实时性。 示例代码 以下是基于 USART 的中断接收数据的示例 void USART_InterruptInit(void) {// USART 初始化略同之前的代码// 启用 USART 接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 配置 NVIC中断控制器NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority 0;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_Init(NVIC_InitStructure); }void USART1_IRQHandler(void) {uint8_t received_data;// 检查是否是接收中断if (USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) {// 读取接收到的数据received_data USART_ReceiveData(USART1);// 处理接收到的数据printf(Interrupt Received: %c\n, received_data);// 清除中断标志位库函数自动完成} }执行流程 当 USART 接收到数据时硬件自动触发中断。CPU 跳转到 USART1_IRQHandler 中断服务函数执行处理。处理完成后CPU 返回主程序继续执行其他任务。 轮询模式   #include stm32f10x.h // Device header #include stdio.h #include stdarg.h #include Delay.hvoid Serial_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // 选择引脚13GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出模式GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速度GPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIO//串口发送初始化GPIO_InitTypeDef GPIO_InitStructrue;GPIO_InitStructrue.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出 串口发送的TXGPIO_InitStructrue.GPIO_Pin GPIO_Pin_9;GPIO_InitStructrue.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructrue);//串口接收GPIO初始化GPIO_InitStructrue.GPIO_Mode GPIO_Mode_IPU; //上拉输入GPIO_InitStructrue.GPIO_Pin GPIO_Pin_10; // GPIO_InitStructrue.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructrue);//内部外设USART1初始化USART_InitTypeDef USART1_InitStructure;USART1_InitStructure.USART_BaudRate 9600;USART1_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;USART1_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx;USART1_InitStructure.USART_Parity USART_Parity_No ;USART1_InitStructure.USART_StopBits USART_StopBits_1;USART1_InitStructure.USART_WordLength USART_WordLength_8b;USART_Init(USART1,USART1_InitStructure);USART_Cmd(USART1,ENABLE);}void Serial_SendByte(uint8_t Byte) {USART_SendData(USART1,Byte);while ((USART_GetFlagStatus(USART1,USART_FLAG_TXE) RESET)); }void Serial_SendArray(uint8_t* Array, uint8_t Lenght) {uint16_t i;for(i0; iLenght; i){Serial_SendByte(Array[i]);} }void Serial_SendString(char* String) {uint8_t i;for(i0; String[i] ! \0; i){Serial_SendByte(String[i]);} }uint32_t Result(uint32_t X, uint32_t Y) {uint8_t result 1;while(Y--){result result * X;}return result; }void Serial_SendNum(uint32_t Num, uint16_t Lenght) {uint16_t i;uint32_t ww;for(iLenght; i0; i--){ww Result(10,i-1);Serial_SendByte((Num/ww )% 10 0);}}int fputc(int ch, FILE* f) {Serial_SendByte(ch);return ch; }void Serial_Printf(char* format, ...) {char String[100];va_list arg;va_start(arg,format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String); }重定向C库函数printf()到串口重定向后可使用printf(); //int fputc(int ch,FILE *f) //{ // USART_SendData(USART1,(uint8_t)ch); // while(!(USART_GetFlagStatus(USART1,USART_FLAG_TC))); // return ch; //}void USART_PollingReceive(void) {uint8_t received_data;Serial_Printf(Please enter the book command: );while (1) {// 检查 RXNE 标志位判断是否有数据可读if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) SET) {// 读取数据received_data USART_ReceiveData(USART1);// 只有在接收到3时才处理接收的数据if (received_data 3) {// 点亮LEDGPIO_SetBits(GPIOA, GPIO_Pin_4); // 点亮LED// 处理接收到的数据printf(Received: %c\n, received_data);// 等待一段时间模拟LED点亮一段时间后熄灭可选Delay_ms(1000); // 延时1000ms具体延时函数需要根据你的环境定义// 熄灭LEDGPIO_ResetBits(GPIOA, GPIO_Pin_4); // 熄灭LED} else {// 如果接收到的不是3则继续等待printf(Invalid command received: %c\n, received_data);}}} }中断模式   #include stm32f10x.h // Device header #include stdio.h #include stdarg.h #include Delay.hvoid Serial_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // 选择引脚13GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽输出模式GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速度GPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIO//串口发送初始化GPIO_InitTypeDef GPIO_InitStructrue;GPIO_InitStructrue.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出 串口发送的TXGPIO_InitStructrue.GPIO_Pin GPIO_Pin_9;GPIO_InitStructrue.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructrue);//串口接收GPIO初始化GPIO_InitStructrue.GPIO_Mode GPIO_Mode_IPU; //上拉输入GPIO_InitStructrue.GPIO_Pin GPIO_Pin_10; // GPIO_InitStructrue.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructrue);//内部外设USART1初始化USART_InitTypeDef USART1_InitStructure;USART1_InitStructure.USART_BaudRate 9600;USART1_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;USART1_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx;USART1_InitStructure.USART_Parity USART_Parity_No ;USART1_InitStructure.USART_StopBits USART_StopBits_1;USART1_InitStructure.USART_WordLength USART_WordLength_8b;USART_Init(USART1,USART1_InitStructure);USART_Cmd(USART1,ENABLE);//开启中断USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC配置NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;NVIC_Init(NVIC_InitStructure);}void Serial_SendByte(uint8_t Byte) {USART_SendData(USART1,Byte);while ((USART_GetFlagStatus(USART1,USART_FLAG_TXE) RESET)); }void Serial_SendArray(uint8_t* Array, uint8_t Lenght) {uint16_t i;for(i0; iLenght; i){Serial_SendByte(Array[i]);} }void Serial_SendString(char* String) {uint8_t i;for(i0; String[i] ! \0; i){Serial_SendByte(String[i]);} }uint32_t Result(uint32_t X, uint32_t Y) {uint8_t result 1;while(Y--){result result * X;}return result; }void Serial_SendNum(uint32_t Num, uint16_t Lenght) {uint16_t i;uint32_t ww;for(iLenght; i0; i--){ww Result(10,i-1);Serial_SendByte((Num/ww )% 10 0);}}int fputc(int ch, FILE* f) {Serial_SendByte(ch);return ch; }void Serial_Printf(char* format, ...) {char String[100];va_list arg;va_start(arg,format);vsprintf(String, format, arg);va_end(arg);Serial_SendString(String); }重定向C库函数printf()到串口重定向后可使用printf(); //int fputc(int ch,FILE *f) //{ // USART_SendData(USART1,(uint8_t)ch); // while(!(USART_GetFlagStatus(USART1,USART_FLAG_TC))); // return ch; //}void USART_PollingReceive(void) {uint8_t received_data;Serial_Printf(Please enter the book command: );while (1) {// 检查 RXNE 标志位判断是否有数据可读if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) SET) {// 读取数据received_data USART_ReceiveData(USART1);// 只有在接收到3时才处理接收的数据if (received_data 3) {// 点亮LEDGPIO_SetBits(GPIOA, GPIO_Pin_4); // 点亮LED// 处理接收到的数据printf(Received: %c\n, received_data);// 等待一段时间模拟LED点亮一段时间后熄灭可选Delay_ms(1000); // 延时1000ms具体延时函数需要根据你的环境定义// 熄灭LEDGPIO_ResetBits(GPIOA, GPIO_Pin_4); // 熄灭LED} else {// 如果接收到的不是3则继续等待printf(Invalid command received: %c\n, received_data);}}} }//USART中断入口函数void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE)){uint16_t ReceiveData USART_ReceiveData(USART1); USART_SendData(USART1,ReceiveData);while (USART_GetFlagStatus(USART1,USART_FLAG_RXNE));USART_ClearITPendingBit(USART1, USART_IT_RXNE);} } 结尾了我要总结一下 串口USART通信是单片机中一种常用的通信方式主要用于设备之间的数据交换。它的特点是通过串行数据传输在硬件资源有限的情况下能够高效地进行数据传输。 典型应用场景 设备间通信 常见场景多个设备之间通过串口进行数据交换比如在嵌入式系统中多个传感器温湿度传感器、光传感器等通过串口将数据发送到主控单片机进行处理。实例假设你在一个温度监测系统中温度传感器通过串口向单片机发送温度数据单片机接收到数据后进行处理并根据温度值控制风扇的开关。 与计算机的通信 常见场景单片机通过串口与计算机进行通信通常用于调试、数据传输和控制。实例在开发过程中单片机通过串口向计算机发送调试信息例如温度、湿度数据或状态信息开发者通过计算机监控这些数据。这种方式在嵌入式系统开发时非常常见。 调试与诊断 常见场景在开发嵌入式系统时串口被广泛应用于调试信息的输出。通过串口输出数据或错误信息帮助开发者进行调试。实例开发过程中单片机通过串口发送错误代码或状态信息开发者通过串口终端查看这些信息帮助调试程序。 无线通信模块 常见场景串口可以与无线模块如蓝牙、Wi-Fi、Zigbee配合使用用于实现无线通信。实例一个常见的应用是蓝牙模块如HC-05它通过串口与单片机连接单片机通过串口接收来自手机的指令并进行相应操作。例如用户通过手机上的蓝牙应用向单片机发送指令控制家电如开启灯光、调节温度等。 外设控制 常见场景使用串口控制外部设备如液晶显示屏、步进电机等。实例在智能家居中单片机通过串口控制一个LCD显示屏显示实时温度、湿度等信息。用户通过串口发送命令控制显示的内容。 详细示例温湿度传感器通信 假设一个智能家居系统中有一个温湿度传感器如DHT11它通过串口USART与主控单片机例如STM32进行通信。工作流程如下 发送数据传感器通过串口发送温度和湿度数据。接收数据单片机接收传感器的数据通过串口的接收缓冲区存储。处理数据单片机将接收到的数据进行解析并根据预设的阈值执行相应操作比如调节空调、打开加湿器或关闭风扇。反馈单片机还可以通过串口将处理后的数据例如当前温度和湿度发送回控制系统或计算机便于远程监控。 总结 串口通信在嵌入式系统中的应用非常广泛不仅用于设备间的简单数据交换还能支持各种外设的控制与调试。通过适当的配置和使用串口通信可以实现有效的数据传输和设备控制。 例如 场景描述 在此应用中我们假设使用一个温度传感器例如DHT11或DHT22通过串口USART将温度数据发送到单片机。单片机根据接收到的温度值来控制风扇的状态。如果温度高于预设的阈值则风扇开启如果温度低于阈值则风扇关闭。   硬件连接 温湿度传感器DHT11/DHT22通过串口例如USART1与STM32单片机连接。风扇例如继电器控制的风扇由STM32单片机的GPIO引脚控制。   代码实现 初始化串口通信初始化STM32的USART用于接收温度传感器的数据。接收数据通过串口接收温度数据。处理数据根据接收到的温度值控制风扇的开关。风扇控制使用GPIO控制风扇。 #include stm32f10x.h #include stdio.h#define FAN_PIN GPIO_Pin_0 // 假设风扇连接在GPIOA的Pin 0 #define TEMP_THRESHOLD 30 // 设定的温度阈值单位摄氏度void USART_Init_Config(void); void GPIO_Init_Config(void); void USART_PollingReceive(void); void Fan_Control(uint8_t state);int main(void) {// 初始化串口和GPIOUSART_Init_Config();GPIO_Init_Config();// 无限循环定期检查接收到的数据while (1) {USART_PollingReceive(); // 等待并接收温度数据} }void USART_Init_Config(void) {// 初始化USART1RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; // USART1_TXGPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; // USART1_RXGPIO_Init(GPIOA, GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate 9600; // 波特率9600USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode USART_Mode_Tx | USART_Mode_Rx; // 发送和接收模式USART_InitStructure.USART_Parity USART_Parity_No;USART_InitStructure.USART_StopBits USART_StopBits_1;USART_InitStructure.USART_WordLength USART_WordLength_8b;USART_Init(USART1, USART_InitStructure);USART_Cmd(USART1, ENABLE); }void GPIO_Init_Config(void) {// 初始化风扇控制GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin FAN_PIN;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); }void USART_PollingReceive(void) {uint8_t received_data;// 检查RXNE标志位判断是否有数据可读if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) SET) {// 读取接收到的数据received_data USART_ReceiveData(USART1);// 打印接收到的数据printf(Received temperature: %c\n, received_data);// 判断温度数据并控制风扇if (received_data TEMP_THRESHOLD) {Fan_Control(1); // 温度超过阈值开启风扇} else {Fan_Control(0); // 温度低于阈值关闭风扇}} }void Fan_Control(uint8_t state) {// 控制风扇的开关if (state 1) {GPIO_SetBits(GPIOA, FAN_PIN); // 开启风扇} else {GPIO_ResetBits(GPIOA, FAN_PIN); // 关闭风扇} }代码解释 串口初始化USART_Init_Config 配置串口波特率为9600启用接收和发送模式并且没有硬件流控制。配置USART1的TX引脚PA9为推挽输出模式RX引脚PA10为浮空输入模式。 GPIO初始化GPIO_Init_Config 配置风扇控制引脚PA0为推挽输出模式用来控制风扇的开关。 串口接收数据USART_PollingReceive 通过轮询方式检查串口接收标志RXNE。如果接收到数据则读取数据并处理。假设温度传感器将数据以字符的形式发送例如字符 30 表示30°C。根据接收到的温度数据判断是否大于设定的阈值。如果温度超过阈值调用 Fan_Control(1) 开启风扇否则调用 Fan_Control(0) 关闭风扇。 风扇控制Fan_Control 控制风扇的开关。如果参数 state 为1开启风扇如果为0关闭风扇。   总结 该系统通过串口接收温度数据并根据数据控制风扇的开关属于典型的串口通信应用场景。通过串口通信单片机能够与外部温湿度传感器进行数据交换根据接收到的实时数据做出响应从而实现温控系统的自动化。 下一节我们将进行数据包以及多字节的数据发送与接收其中包括HEX数据包发送和文本格式数据包的发送与接收 期待
http://www.hkea.cn/news/14449201/

相关文章:

  • 如何线上推广自己产品公司优化网站的案例
  • 类似源码之家的网站wordpress页面属性模板怎么添加
  • 域名注册哪个最好关键词优化外包服务
  • 淘宝联盟 网站备案上传网站的软件
  • 校园网站建设方向做网站用到的工具
  • 东莞销售网站建设adsl做网站
  • 宜昌外贸网站建设优化推广网站电脑端和手机端
  • 公司网站制作注意什么百度网站关键词
  • 潍坊网站建设一品网络小程序中国优化网
  • 网站注册主机餐饮行业做网站的好处
  • h5网站不利于优化吗免费网站自助建站系统
  • 张北网站建设wordpress 添加外链
  • 贵州微网站建设公司人才共享网站的建设方案怎么写
  • 网站底部备案号自己做第一个网站
  • 广西钦州有做网站的公司吗php二次网站开发步骤
  • 河南省南水北调建设管理局网站太原优化型网站建设
  • qq整人网站怎么做建站公司学习
  • 三门峡网站制作公司网站开发强制开启浏览器极速模式
  • 做请柬网站东莞市住房建设部网站
  • wordpress主页打不开网站seo查询
  • 网站开发端兰山区网站建设推广
  • 比较多人用什么网站做推广山西教育学会的网站建设
  • 贵阳网站排名优化网站建设简运维 简历
  • 网站开发需要什么人员甘肃住房和城乡建设厅网站首页
  • 外贸推广是做什么的seo 整站优化
  • 安监网站如何做紧急预案备案涿州市住房和城乡建设局网站
  • 制作网站建设拓扑图软件海外推广引流
  • 厦门集团网站设计公司wordpress如何添加备案信息
  • 口碑好网站建设莱芜杂谈话题
  • 搭建网站做淘宝客wordpress编辑器段间距