清风迎明月 发表于 2024-5-4 09:14:17

51和32位51 使用 多串口 printf 函数 的例子

求:51和32位51 使用 多串口 printf 函数 的例子

==============================================
串口3能用printf函数吗?

问个串口3通信,使用printf函数的问题
主要是对printf函数不熟悉

用串口1没问题能通信



我现在想用STC8H8K单片机的串口3通信,
包含了头文件“stdio.h”
设置了串口3,用T2做波特率发生器
是不是串口3初始化后,如下重写就可以使用printf函数了?

void UartPutc(unsigned char dat)       //使用printf时需重写{    S3BUF =dat;   while(TI==0);    TI = 0;}char putchar(char c){   UartPutc(c);    return c;}



乘风飞扬 发表于 2024-9-9 15:29:29

本帖最后由 乘风飞扬 于 2024-9-10 09:05 编辑

51和32位51 使用 多串口 printf 函数 的例子
串口1使用 printf 函数
串口2使用 printf 函数
串口3使用 printf 函数
串口4使用 printf 函数
附件例程多串口使用printf函数进行打印,
但是要使用不同的函数名
    UART1_printf("STC32G UART1 printf Test.\r\n");
    UART2_printf("STC32G UART2 printf Test.\r\n");
    UART3_printf("STC32G UART3 printf Test.\r\n");
    UART4_printf("STC32G UART4 printf Test.\r\n");

bianpin 发表于 2024-5-4 12:44:28

你查询和清除的发送标志位仍旧是串口1的TI,要改成串口3的。

jwd 发表于 2024-5-4 13:51:47

如楼上所言,修改要改全套{:4_165:}

清风迎明月 发表于 2024-5-5 19:06:28

明白了,感谢楼上两位

ningsane 发表于 2024-9-9 14:51:45

本帖最后由 ningsane 于 2024-9-9 14:56 编辑

请问楼上各位,如果串口1,串口2,串口3都需要同时使用,如何修改printf函数让3个串口同时正确使用?

梁工 发表于 2024-9-9 15:25:54

ningsane 发表于 2024-9-9 14:51
请问楼上各位,如果串口1,串口2,串口3都需要同时使用,如何修改printf函数让3个串口同时正确使用? ...

编译器提供的printf函数只能用一个串口。

梁工 发表于 2024-9-9 15:50:48

使用putchar函数重映射到需要的串口。

串口1不开中断:
char putchar(char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
    return c;
}

串口1开中断:
char putchar(char c)
{
    B_TX1_Busy = 1;
    SBUF = c;
    while(B_TX1_Busy);
    return c;
}
void UART1_ISR (void) interrupt UART1_VECTOR
{
        if(RI)
        {
                RI = 0;
        }

        if(TI)
        {
                TI = 0;
                B_TX1_Busy = 0;
        }
}

串口2不开中断:
char putchar(char c)
{
    S2BUF = c;
    while((S2CON & 2)==0);
    S2CON &= ~2;
    return c;
}

串口2开中断:
char putchar(char c)
{
    B_TX2_Busy = 1;
    S2BUF = c;
    while(B_TX2_Busy);
    return c;
}
void UART2_ISR (void) interrupt UART2_VECTOR
{
        if((S2CON & 1) != 0)
        {
                S2CON &= ~1;
        }

        if((S2CON & 2) != 0)
        {
                S2CON &= ~2;
                B_TX2_Busy = 0;
        }
}

串口3不开中断:
char putchar(char c)
{
    S3BUF = c;
    while((S3CON & 2)==0);
    S3CON &= ~2;
    return c;
}

串口3开中断:
char putchar(char c)
{
    B_TX3_Busy = 1;
    S3BUF = c;
    while(B_TX3_Busy);
    return c;
}
void UART3_ISR (void) interrupt UART3_VECTOR
{
        if((S3CON & 1) != 0)
        {
                S3CON &= ~1;
        }

        if((S3CON & 2) != 0)
        {
                S3CON &= ~2;
                B_TX3_Busy = 0;
        }
}

串口4不开中断:
char putchar(char c)
{
    S4BUF = c;
    while((S4CON & 2)==0);
    S4CON &= ~2;
    return c;
}

串口4开中断:
char putchar(char c)
{
    B_TX4_Busy = 1;
    S4BUF = c;
    while(B_TX4_Busy);
    return c;
}
void UART4_ISR (void) interrupt UART4_VECTOR
{
        if((S4CON & 1) != 0)
        {
                S4CON &= ~1;
        }

        if((S4CON & 2) != 0)
        {
                S4CON &= ~2;
                B_TX4_Busy = 0;
        }
}

ningsane 发表于 2024-9-9 16:06:41

乘风飞扬 发表于 2024-9-9 15:29
附件例程多串口使用printf函数进行打印,但是要使用不同的函数名

这个例子使用的是C251的编译器,重写的printf函数里边有多个未知变量和函数在C51编译器里边无法识别。是不是使用这个例子的函数,必须得更换到C251编译器里边?在keil C51编译器里边能不能修改这个printf函数,达到同时使用多个串口的目的?

乘风飞扬 发表于 2024-9-9 17:29:46

ningsane 发表于 2024-9-9 16:06
这个例子使用的是C251的编译器,重写的printf函数里边有多个未知变量和函数在C51编译器里边无法识别。是 ...

7楼增加了51芯片使用多串口printf函数的例子,供参考。
页: [1] 2
查看完整版本: 51和32位51 使用 多串口 printf 函数 的例子