公司动态

嵌入式,串行通信代码逻辑及思路

📅 2026/7/19 3:19:17
嵌入式,串行通信代码逻辑及思路
开时钟1.首先确定要用usart1去收发数据那么我们先找到他挂在哪个总线上确定他在apb2上然后要看usart1的TXRX在哪个引脚上相连这些引脚属于哪个GPIO因为USART 内部 TX 移位寄存器 → 片内复用选择器 → GPIO 引脚 → 外部硬件外部电平 → GPIO 引脚 → 复用选择器 → USART 内部 RX 接收移位寄存器我们由图已知tx与p9相连rx与p10相连2.所以我们接下来要把p9与p10进行初始化例创建一个名叫 S1 的结构体变量专门存 USART1 要用的 GPIO 配置信息。GPIO_InitTypeDef S1然后引用这个创建的S1对引脚的功能模式输出类型配置引脚进行完善S1.GPIO_ModeGPIO_Mode_AF;S1.GPIO_OTypeGPIO_OType_PP;S1.GPIO_PinGPIO_Pin_9;GPIO_Init(GPIOA,S1);然后同理对p10进行初始化3.现在只是对引脚进行初始化我们要让对应的引脚与对应的tx,rx相接我们用函数GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);第一个参数 GPIOA操作 A 端口第二个 GPIO_PinSource9针对第 9 号引脚第三个 GPIO_AF_USART1把这个引脚的复用通道绑定给 USART1 外设p10同理4.配置串口USART_InitTypeDef S3;S3.USART_BaudRate115200;//波特率S3.USART_HardwareFlowControlUSART_HardwareFlowControl_None;//硬件流控S3.USART_ModeUSART_Mode_Rx|USART_Mode_Tx;//收发模式S3.USART_ParityUSART_Parity_No;//校验S3.USART_StopBitsUSART_StopBits_1;S3.USART_WordLengthUSART_WordLength_8b;USART_Init(USART1,S3);5.串口向pc发数据分为两种方式printf重定向senddata函数printf重定向int fputc(int ch,FILE *f){while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE )0); USART_SendData(USART1,ch);}printf 底层会循环调用 fputc 输出单个字符改写这个函数就能把打印内容转到串口。USART_GetFlagStatus(USART1 ,USART_FLAG_TXE )0)用来判断状态寄存器中的TXE的值从而判断发送寄存器是否为空USART_SendData(USART1,ch);标准库中有不用自己写sendstring函数void SendString(char * string){while(*string ! \0){ while(USART_GetFlagStatus(USART1 ,USART_FLAG_TXE )0); USART_SendData(USART1,*string ); }}6.主函数中写接收数据 用while循环别的也可以此文章以本人代码为例 其中你首先要判断接收寄存器中是否为空如果不为空那你就一个一个读出来这里可增加如果内容为open就打出open涉及字符串相比 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2f6a671c85af4cd4b5ab8fc7e3c5cad8.png)