wellhope 发表于 2025-5-20 11:27:04

请教AI8051U串口打印乱码是什么原因造成的。

抄AI8051U手册中的串口打印RTC时钟范例,可串口打出来的都是乱码,请问一下这是哪没有设置好?


#include "intrins.h"
#include "stdio.h"

#define MAIN_Fosc                                 22118400L
#define Baudrate                                        115200L
#define TM                                                                (65536 - (MAIN_Fosc / Baudrate + 2 / 4))

void UartInit(void)
{
        SCON = (SCON & 0x3F) | 0x40;
T2L = TM;
        T2H = TM >> 8;
        S1BRT = 1;
        T2x12 = 1;
        T2R = 1;
}

void UartPutc(unsigned char dat)
{
        SBUF = dat;
        while(TI == 0);
        TI = 0;
}

char putchar(char c)
{
        UartPutc(c);
        return c;
}

void main()
{
        EAXFR                        = 1;       
        WTST                         = 0;
        CKCON                        = 0;       
        P3M1 = 0;
        P3M0 = 0;
        EA = 1;
        UartInit();
        printf("Uart Test !\r\n");
        while(1)
        {
                printf("AABBCCDDEEFF !\r\n");
        }
}


国芯人工智能 发表于 2025-5-20 11:28:00

在AI8051U串口的打印过程中,乱码的原因可能与串口的参数设置不正确有关。根据AI8051U串口的Uart手册,串口的参数设置是一个关键因素。以下是详细的解释:

1. UartPutc函数的参数设置
在UartPutc函数中,参数接收的是一个字节(0-255),而打印乱码可能是因为这个字节的值与期望值不匹配。具体来说,当打印乱码时,可能是因为字节的高位或低位被错误地转换或显示。

例如,假设打印乱码是因为打印函数没有正确处理字节的位数或颜色编码。例如,打印字节的高四位可能被错误地转换为十六进制值,导致显示为乱码。

2. 正确设置RI参数
为了确保打印的字符正确显示,需要正确设置RI(时间钟)参数。RI参数的设置应该与打印字符的十六进制值一致。

例如,假设打印乱码是因为打印函数没有正确设置RI参数为1(即打印状态为打印状态),那么打印的字符可能无法正确显示。正确的RI参数设置应为:
RI = 1

3. 如何在开发板中实现
在开发板的串口模块中,需要在UI的设置中正确设置RI参数。例如,设置为:
RI = 1
或者在代码中定义RI参数:
#define RI 1
然后在UartPutc函数中使用RI来控制打印状态。

4. 总结
乱码的原因可能是UartPutc函数的参数设置不正确,导致打印字符的十六进制值与预期值不匹配。正确的设置应确保RI参数为1,并正确处理字符的十六进制值。通过正确设置这些参数,打印的字符可以正确显示。

希望以上解释能帮助您理解乱码的原因,并指导如何在开发板中正确设置参数,以避免打印乱码。

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-5-20 11:28:00

根据你的问题,我们首先需要理解AI8051U串口的结构和功能。AI8051U是一种可编程串口单元,主要用于数字通信和数据传输。其内部的串口部分由多个控制信号和输出信号组成,包括C0R、C0L、C1R、C1L、C2R、C2L等信号,这些信号用于控制串口的同步和数据传输。

在串口的 printing 模块中,通常会定义一个函数 putChar,该函数接收一个字符并将其编码输出到串口。如果打印出乱码,可能的原因包括以下几种:

1. 串口同步信号未正确设置:如果串口的同步信号(例如 C0R 或 C2R)没有正确设置,可能导致数据传输不正常,进而影响打印字符的编码。

2. 控制信号未正确设置:串口的控制信号(例如 C0L 或 C2L)可能未正确设置,导致数据传输不正常,进而影响打印字符的编码。

3. 输出编码问题:打印时,输出的字符编码可能与串口的编码位(例如 EAXFR)不匹配,导致打印字符的编码错误。

4. 字符编码错误:打印时,输入的字符编码可能与串口的编码位不匹配,导致输出字符的编码错误。

为了进一步诊断问题,建议你:

1. 检查串口的控制信号和同步信号:确保串口的控制信号和同步信号(例如 C0R、C0L、C1R、C1L、C2R、C2L)都正确设置。

2. 检查打印函数:确保打印函数(例如 putChar)接收的字符编码与串口的编码位(例如 EAXFR)匹配。

3. 调试打印输出:在打印时,使用调试工具(例如 BitMask 或 Verilog Verifier)检查打印字符的编码是否正确。

4. 查看手册中的典型打印内容:根据手册中的典型打印内容(例如示例图),检查打印时的字符编码是否正确。

如果以上方法仍无法解决问题,建议你联系AI8051U的制造商或技术支持,获取更详细的指导。

希望这些建议对你有所帮助!

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-5-20 11:28:00

根据你的问题,AI8051U的串口打印乱码可能与位端设置有关。以下是针对这种情况的详细分析和建议:

位端设置导致的乱码问题

1. 位端设置的理解
AI8051U串口输出使用位端(Bit Extending)来显示字节。位端设置决定了输出的字节和符号位的显示方式。
位端为0时,输出为无符号字节显示,符号位为0时不显示符号位。
位端为1时,输出为有符号字节显示,符号位为1时会显示符号位。

2. 乱码的原因
如果位端设置为1,可能会导致输出为有符号字节,而用户预期显示的是无符号字节。
这种情况下,乱码可能出现在数字的最高位上,尤其是当字节的值为负时。

3. 如何解决位端问题
检查位端设置:在串口编程中,位端设置为0时,输出为无符号字节;设置为1时,输出为有符号字节。
尝试设置位端为0:在使用AI8051U的串口时,尝试将位端设置为0,观察输出是否正常。
验证输出结果:如果位端设置为0后,输出仍然不正常,可能需要检查其他配置,如数据类型或输入端口的设置。

具体步骤建议

1. 确认位端设置是否正确
在代码或编程中,确保位端设置为0,以确保输出为无符号字节。
比如,在代码中添加以下设置:
   c
   EAXFR = 1;
   WTST = 0;
   CKCON = 0;
   P3M1 = 0;
   P3M0 = 0;
   EA = 1;
   然后测试输出是否正常。

2. 测试输出
在代码中,使用 putchar或writechar函数测试输出。
例如:
   c
   char c = 0xFF;
   while (1) {
       putchar(c);
       delay(1);
   }
如果输出不正常,可能与位端设置有关。

3. 重新设置位端
如果位端设置为0后,输出仍然不正常,可以尝试将位端重新设置为0,直到输出正常。

4. 验证输出
如果位端设置为0后,输出仍然不正常,可以尝试在代码中添加位端设置为0的注释或注释,以确认设置是否正确。

5. 检查所有配置
确保没有其他配置影响输出,如数据类型、输入端口的配置或电源问题。
如果出现问题,需要进一步检查硬件和系统兼容性。

总结

位端设置是AI8051U串口输出显示乱码的重要因素。通过确认位端设置为0,测试输出,重新设置位端并验证输出,可以确定问题并解决问题。如果问题仍未解决,可能需要进一步检查其他方面,如硬件连接或电源问题。

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-5-20 11:28:00

根据您提供的代码和手册信息,您可能在UartUart的初始化参数设置上存在问题。以下是详细的分析和建议:

1. UartUart的初始化参数问题
在您提供的代码中,UartUart的初始化参数包括:
MAINFosc: 主频(22118400L)
Baudrate: 传输速率(115200L)
TM: 时钟周期(通过公式计算)
T2L: 时钟周期(T2L = TM)
T2H: 时钟数据端
S1BRT: 选择端
T2x12: 数据传输端
T2R: 共享端
EA: 选项

然而,您提供的代码中没有定义这些变量。因此,您在UartUart的初始化参数设置中可能存在问题。

2. 建议的UartUart初始化参数
根据AI8051UUart的标准初始化参数,建议您在UartUart的初始化时设置以下参数:
MAINFosc: 串口的主频(如22118400Hz)
Baudrate: 串口的传输速率(如115200bps)
T2L: 时钟周期(通过公式计算:T2L = TM)
T2H: 时钟数据端(如1)
S1BRT: 选择端(如1)
T2R: 共享端(如1)
EA: 选项(如0)

3. 代码示例
以下是您UartUart初始化的示例代码:

c
void UartInit(void) {
    SCON = (SCON & 0x3F) | 0x40; // 终点
    T2L = TM; // 时钟周期
    T2H = T2L >> 8; // 时钟数据端
    S1BRT = 1; // 选择端
    T2R = 1; // 共享端
}

void UartPutc(unsigned char dat) {
    BF = dat; // 字节数据
    while (TI == 0); // 循环读取
    TI = 0; // 读取结束标志
}

char putchar(char c) {
    UartPutc(c); // 输出
    return c;
}

void main() {
    EXF = 1; // 终点频率
    WTST = 0; // 终点状态
    CKCON = 0; // 初始配置
    P3M1 = 0; // 网络协议配置
    P3M0 = 0; // 网络协议配置
    EX = 1; // 终点选项
    UartInit();
    printf("Uart Test!\n");
    while (1) {
      printf("AABBCCDDEEFF!\n");
    }
}

4. 问题分析
您在UartUart的初始化时没有正确设置时钟参数,导致UartUart的时钟周期和数据端参数不正确。这可能导致UartUart无法正确显示字节,而是显示乱码。

5. 解决方案
建议您在UartUart的初始化时正确设置时钟参数,并确保时钟信号端设置为选择端(S1BRT = 1)。这样UartUart才能正确显示字节。

6. 调试建议
如果您在调试时发现UartUart的输出始终显示乱码,可以尝试以下方法:
打开调试工具(如IDE调试工具)并运行程序。
在main()函数中设置一个变量BF,并尝试通过调试工具查看UartPutc的输出。
检查UartUart的时钟参数是否正确,特别是主频和传输速率是否匹配。

7. 总结
您在UartUart的初始化时可能没有正确设置时钟参数,导致UartUart无法正确显示字节。建议您参考AI8051UUart的标准初始化参数,并调整时钟参数以确保UartUart输出正确字节。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-5-20 11:34:57


使用实验箱例程测试

https://www.stcaimcu.com/data/download/DemoCode/AI8051U-DEMO-CODE-V1.2.zip



DebugLab 发表于 2025-5-20 11:56:22

乱码检查时钟和波特率
程序中的和ISP软件中的

wellhope 发表于 2025-5-20 11:59:20

ercircle 发表于 2025-5-20 11:34
使用实验箱例程测试

https://www.stcaimcu.com/data/download/DemoCode/AI8051U-DEMO-CODE-V1.2.zip


用这个例程测试是可以的,谢谢!

jwd 发表于 2025-5-20 14:27:22

一般是波特率不对
页: [1]
查看完整版本: 请教AI8051U串口打印乱码是什么原因造成的。