串口输出的三种方式

目录

一、输入输出重定向

   二、使用sprintf的Usart_SendString

三、封装sprintf


一、输入输出重定向

        这个是使用输入输出重定向,将输出的内容使用scanf()getchar() 从写入,使用printf的格式打印出来。使用这个输出重定向和输出重定向的时候需要使用头文件

        输入重定向中只能通过使用这个函数是让 scanf()getchar() 从串口读取一个字符。

/*     这个是输出重定向     */
int fputc(int ch, FILE *f)
{
    /* 发送一个字节数据到串口 */
    USART_SendData(USARTx, (uint8_t) ch);

    /* 等待发送完毕 */
    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

    return ch;
}

/*    fputc,但它每次只能发送一个字符(char),而不是字符串(string)    */
/*    如果打印字符串,可以联合下面的使用                                */
/*    方法一                                                          */
void Usart_SendString(const char* str)
{
    while (*str != '\0') {
        fputc(*str, NULL);  // 或者直接调用 USART_SendData
        str++;
    }
}
/*    方法二                                                            */
void Usart_SendString(const char* str)
{
    while (*str) {
        USART_SendData(USARTx, (uint8_t)*str);
        while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
        str++;
    }
}






/ * 这个是补充内容,是输入重定向 */
int fgetc(FILE *f)
{
    /* 等待串口输入数据 */
    while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);

    return (int)USART_ReceiveData(USARTx);
}

/*    fgetc一次只能读取一个字节                           */
/*    如何读取一个完整的字符串,可以通过下面的伪代码实现    */
/ * 读取一个字符串 */
char* Usart_ReadString(char *str, int max_len)
{
    int i = 0;
    char c;

    while (i < max_len - 1) {
        c = getchar();      // 会调用你重写的 fgetc()
        if (c == '\r' || c == '\n') break;  // 遇到换行就结束

        str[i++] = c;
    }

    str[i] = '\0';  // 添加字符串结束符
    return str;
}


/* 主函数中调用 */
char buffer[128];
printf("请输入字符串:");
Usart_ReadString(buffer, sizeof(buffer));
printf("你输入的是:%s\n", buffer);

   二、使用sprintf的Usart_SendString

        sprintf的头文件是

char Str[128];
sprintf(Str, "变量”);
Usart_SendString(Usart1, Str);

三、封装sprintf

        C 可变参数 | 菜鸟教程

        头文件是

void Serial_Printf(char *format, ...)
{
	char String[100];				//定义字符数组
	va_list arg;					//定义可变参数列表数据类型的变量arg
	va_start(arg, format);			//从format开始,接收参数列表到arg变量
	vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组中
	va_end(arg);					//结束变量arg
	Serial_SendString(String);		//串口发送字符数组(字符串)
}

        串口打印出去会乱码的原因,输出使用的是UTF-8,但是接收串口助手没有适合用UTF-8。就是Keil和串口调试助手要保持同一个编码格式。对已经有的工程,可以使用转码软件。

        如果在代码中写入中文会出现报错,可以写入 --no-multibyte-chars

串口输出的三种方式_第1张图片

你可能感兴趣的:(STM32学习笔记,linux,运维,服务器)