stm32F103C8T6标准库串口发送之发送字符串与printf4

发布时间:2026/7/21 9:20:50
stm32F103C8T6标准库串口发送之发送字符串与printf4 目录1.ASCII对照表2. 发送单个字符3. 发送字符串4. printf的使用4. printf的使用——打印中文5. 使用%d、%x方式打印6. 核心代码理解1.ASCII对照表可以看到十六进制30到39对应的ASCII码是0-9当我代码发送十六进制30-37时候对应的PC端接收的ASCII码对应的是0-7/** * brief 按键 任务 * param 无 * retval 无 */voidKey_Task(void){if(key_task.flag1){KEY_Evnet current_event;current_eventKEY_SystickScan(key1_info);/* 短按*/if(current_eventEVENT_SHORT_RELEASE){uint8_tarray[]{0x30,0x31,0x32,0x33,0x34,0x35};USART_SenArray(USART1,array,6);USART_SenByte(USART1,0x36);USART_SenByte(USART1,0x37);}Key_TaskReset();}}PC端接收到的ASCII值可以看到用HEX模式接收的是对应的16进制 30-37然后改成ASCII码模式接收后对应的是0-7。2. 发送单个字符比如说我要字母A对应的16进制是41我就发送0X41就会得到字母A代码发送端发送数据PC端接收数据可以看到我先发送十六进制0X41得到A还发送了一个字符A得到A3. 发送字符串/** * brief 发送字符串函数 * param pUSARTxUSARTx(X1,23)/UARTx(x4,5) * param str要发送的字符串 * note * retval 无 */voidUSART_SenString(USART_TypeDef*pUSARTx,char*str){uint32_tk0;/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)RESET);do{/*发送一字节数据到pUSARTx*/USART_SendData(pUSARTx,*(strk));k;/* 等待发送数据寄存器为空 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)RESET);}while(*(strk)!\0);}可以看到将字符串\nyehuo发送出去在PC端看到了yehuo前面\n是换行字符。4. printf的使用intfputc(intch,FILE*f)这个函数需要添加头文件#include stdio.h才能使用函数原型在这个头文件如下它有两个参数参数1是int参数2是文件型指针 FILE*返回值是int所以需要使用该函数的时候就按照函数原型保持一致返回值参数类型。/** * brief 将一个字符写入到文件中重定向C库函数printf到串口重定向后可使用printf函数 * param ch:要写入的字符 * param f:指向FILE结构的指针 * note 无 * retval 成功返回该字符 */intfputc(intch,FILE*f){/* 等待发送完成 */while(USART_GetFlagStatus(USART1,USART_FLAG_TC)RESET);/*发送一字节数据到pUSARTx*/USART_SendData(USART1,ch);/* 等待发送数据寄存器为空 */while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);returnch;}可以看到当使用printf发送字符串123456789可以在PC端接收到字符串123456789。4. printf的使用——打印中文点击编码设置UTF-8可以看到PC端显示中文5. 使用%d、%x方式打印可以看到可以通过%d十进制打印做加法、减法也可以打印大写的16进制小写的16进制。6. 核心代码理解voidUSART_SenByte(USART_TypeDef*pUSARTx,uint8_tch){/* 等待发送完成 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)RESET);/*发送一字节数据到pUSARTx*/USART_SendData(pUSARTx,ch);/* 等待发送数据寄存器为空 */while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)RESET);}发送数据流程发送数据0X310X31进入到数据寄存器存储-从数据寄存器到移位寄存器-从移位寄存器到-PA9TXD-PC端显示发送一个数据流程代码推理例如发送一个数据0X31先执行第一个while用来检测TXD是否发送到PC端完成由于是第一次所以默认返回值置1第一个while跳过接着开始执行发送接着执行第二个while等待数据寄存器里面的0X31数据值全部发送到移位寄存器完成如果将数据寄存器里面的0X31值完全发送到移位寄存器完成后此时第二个while置1不成立。最后从移位寄存器的值0X31发送到PC显示出来发送两个数据流程代码推理发送数据0X310x41先执行第一个while由于是第一次TXD没有要发送的数据所以默认是置1的第一个while跳过然后执行发送的语句接着执行第二个while此时等待数据寄存器里面的0X31数据发送到移位寄存器里面去当完全发送完成跳过第二个while最后移位寄存器发送到TXD上当此时我现在发送0x41第二个数据的时候先执行第一个while此时需要等待第一个数据0x31完全从TXD发送到PC端完成才会跳出第一个while当第一个0x31数据从TXD发送到PC端完成后此时执行发送的语句发送0x41然后执行第二个while等待数据寄存器里面的0x41发送到移位寄存器里面去当完全发送到移位寄存器里面去后此时会跳出第二个while最后只需要默认等待TC置1标志着第二个数据0X41也完全从TXD发送到PC上了。