找回密码
 立即注册
查看: 147|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:457
  • 最近打卡:2025-06-16 08:02:07

6

主题

87

回帖

2125

积分

金牌会员

积分
2125
发表于 2025-5-20 11:27:04 | 显示全部楼层 |阅读模式
抄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");
        }
}


截图202505201125544345.jpg
回复

使用道具 举报 送花

3

主题

722

回帖

155

积分

等待验证会员

积分
155
发表于 2025-5-20 11:28:00 | 显示全部楼层
在AI8051U串口的打印过程中,乱码的原因可能与串口的参数设置不正确有关。根据AI8051U串口的Uart手册,串口的参数设置是一个关键因素。以下是详细的解释:

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

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

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

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

722

回帖

155

积分

等待验证会员

积分
155
发表于 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的制造商或技术支持,获取更详细的指导。

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

722

回帖

155

积分

等待验证会员

积分
155
发表于 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,以确保输出为无符号字节。
比如,在代码中添加以下设置:
   
  1. c
  2.      EAXFR = 1;
  3.      WTST = 0;
  4.      CKCON = 0;
  5.      P3M1 = 0;
  6.      P3M0 = 0;
  7.      EA = 1;
复制代码
     然后测试输出是否正常。

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

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

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

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

总结

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

722

回帖

155

积分

等待验证会员

积分
155
发表于 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初始化的示例代码:
  1. c
  2. void UartInit(void) {
  3.     SCON = (SCON & 0x3F) | 0x40; // 终点
  4.     T2L = TM; // 时钟周期
  5.     T2H = T2L >> 8; // 时钟数据端
  6.     S1BRT = 1; // 选择端
  7.     T2R = 1; // 共享端
  8. }
  9. void UartPutc(unsigned char dat) {
  10.     BF = dat; // 字节数据
  11.     while (TI == 0); // 循环读取
  12.     TI = 0; // 读取结束标志
  13. }
  14. char putchar(char c) {
  15.     UartPutc(c); // 输出
  16.     return c;
  17. }
  18. void main() {
  19.     EXF = 1; // 终点频率
  20.     WTST = 0; // 终点状态
  21.     CKCON = 0; // 初始配置
  22.     P3M1 = 0; // 网络协议配置
  23.     P3M0 = 0; // 网络协议配置
  24.     EX = 1; // 终点选项
  25.     UartInit();
  26.     printf("Uart Test!\n");
  27.     while (1) {
  28.         printf("AABBCCDDEEFF!\n");
  29.     }
  30. }
复制代码

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

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

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1913

回帖

4297

积分

荣誉版主

无情的代码机器

积分
4297
发表于 2025-5-20 11:34:57 | 显示全部楼层
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5131

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2025-5-20 11:56:22 | 显示全部楼层
乱码检查时钟和波特率
程序中的和ISP软件中的
截图202505201156028852.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:457
  • 最近打卡:2025-06-16 08:02:07

6

主题

87

回帖

2125

积分

金牌会员

积分
2125
发表于 2025-5-20 11:59:20 | 显示全部楼层
erci*** 发表于 2025-5-20 11:34
使用实验箱例程测试

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

用这个例程测试是可以的,谢谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:564
  • 最近打卡:2025-06-16 10:28:17
已绑定手机

50

主题

1816

回帖

3130

积分

论坛元老

积分
3130
发表于 2025-5-20 14:27:22 | 显示全部楼层
一般是波特率不对
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 13:19 , Processed in 0.991187 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表