找回密码
 立即注册
查看: 20|回复: 10

疑似bug: ISP "设置RTC"按键,会截断接收缓冲器的输出

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-07-21 11:04:54
已绑定手机

6

主题

14

回帖

58

积分

注册会员

积分
58
发表于 昨天 13:44 | 显示全部楼层 |阅读模式
我在做单片机接收RTC对时数据的功能,我原本想做的功能是,如果单片机接收到RTC对时数据(11个字节),就用串口发送一条消息,表示单片机对时成功。
程序写好后,调试过程中,我发现,我一点"设置RTC"按钮,原本该正常打印的字符串,被截断了。串口助手只输出,字符串的前半部分。
发生频率大概是:我点10次"设置RTC"按钮,有大约2次的输出被截断了。
下面是输出截图:

我点了3次"设置RTC"按钮, 前两次的输出被截断了,第3次是正常的。




还有几个发现:
- 我用逻辑分析仪,抓串口输出的数据,发现输出的字符串是完整的,但是,串口助手的显示被截断了。
- 如果我用串口助手的发送功能,模拟发送11个字节,输出是完全正常的。
- 我用双串口的串口2接收,(串口1发送RTC数据,串口2接收),输出是完全正常的。
疑似是,“设置RTC”按钮的响应函数里面有bug,导致了输出的截断。

下面是测试代码,我用的单片机型号,是STC32G12K128,可复现。

  1. #include "stc32g.h"
  2. typedef unsigned char uint8_t;
  3. typedef long int32_t;
  4. // 串口1初始化
  5. void Uart1Init() {
  6.   int32_t T2value;
  7.   SM0 = 0;
  8.   SM1 = 1;   // 串口1: 8位可变波特率
  9.   REN = 1;   // 允许串口1接收数据  
  10.   TI = 0;    // 清除中断标志位
  11.   RI = 0;    // 清除中断标志位
  12.   // 定时器2设置
  13.   T2x12 = 1; // 0表示定时器2处于12T模式 ; 1表示定时器2处于1T模式
  14.   // T2 = 65536 - SYSclk / 4 / 波特率
  15.   T2value = (int32_t)(65536 - 12000000L / 4 / 115200);  // MAIN_Fosc = 12MHz
  16.   T2L = T2value & 0xFF;   
  17.   T2H = T2value >> 8;  
  18.   T2R = 1;      // 定时器2开始计数  
  19.   ES = 1;       // 允许串口1中断
  20. }
  21. uint8_t cnt = 0;   // 接收到的数据个数
  22. uint8_t recvBuf[11]; // 接收到的数据
  23. // 串口1接受数据
  24. void Uart1Recv_isr() interrupt 4 {
  25.   if(RI) {
  26.     RI = 0;   
  27.     // 从SBUF读取数据   
  28.     recvBuf[cnt] = SBUF;
  29.     cnt++;
  30.   }
  31. }
  32. // 串口1发送数据
  33. void Uart1Send(uint8_t dat) {
  34.   SBUF = dat;
  35.   while(!TI);
  36.   TI = 0;
  37. }
  38. void main() {
  39.     uint8_t i;
  40.     char * msg = "RTC message: RTC set time finished! Congradulation!\n"; // 规律是,字符串越长,bug越容易出现
  41.    
  42.     P54RST = 1;
  43.     EAXFR = 1; // 允许访问XFR存储区
  44.     CKCON = 0; // 访问外设等待时间
  45.     WTST = 0;  // 每次读取FLASH存储区的等待时间   
  46.     EA = 1;
  47.    
  48.     Uart1Init();
  49.     while(1) {
  50.         // 每接收到11个数据,就发送成功消息
  51.         if(cnt >= 11) {
  52.             cnt = 0;
  53.             // 发送成功消息
  54.             for(i = 0; msg[i]; i++) {
  55.                 Uart1Send(msg[i]);
  56.             }   
  57.         }
  58.     }
  59. }
复制代码


ScreenShot_2026-07-21_132329_112.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2026-07-21 09:39:09

83

主题

7972

回帖

1万

积分

超级版主

积分
17025
发表于 昨天 13:53 | 显示全部楼层
这种情况一定要从自己的程序里找原因,串口只负责收或发一个字节,别的功能都是程序的事。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:724
  • 最近打卡:2026-07-21 09:03:11
已绑定手机

51

主题

2710

回帖

9433

积分

论坛元老

积分
9433
发表于 昨天 14:12 | 显示全部楼层
主循环里发送指令再改改:
  1. for(i = 0; msg; i++) {
  2.     Uart1Send(msg);
  3. }
复制代码


例如改成:
  1. for(i = 0; i<52; i++) {
  2.     Uart1Send(msg[i]);
  3. }
复制代码

点评

真怪了事了,我代码复制到论坛上的时候,里面的[i], 都没了。  发表于 昨天 15:38
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-07-21 14:44:21
已绑定手机

5

主题

356

回帖

6446

积分

论坛元老

积分
6446
发表于 昨天 14:44 | 显示全部楼层
用这个插入代码,否则会显示不完整
傲游截图20260721144331.jpg

点评

感谢。刚发现还有个插入代码的按钮。  发表于 昨天 15:30
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-07-21 11:04:54
已绑定手机

6

主题

14

回帖

58

积分

注册会员

积分
58
发表于 昨天 15:29 | 显示全部楼层
乘风*** 发表于 2026-7-21 14:12
主循环里发送指令再改改:

哎呀 刚发现,刚才往论坛上贴代码的时候,复制错了。。。。
  1. for(i = 0; msg[i]; i++) {
  2.                 Uart1Send(msg[i]);
  3. }  
复制代码
我用上面这段代码测试的,我点了设置RTC按钮,输出仍然是截断的。可是,逻辑分析仪,已经捕获了完整的字符串,但是,串口助手被截断了。
比较.png
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-07-21 14:44:21
已绑定手机

5

主题

356

回帖

6446

积分

论坛元老

积分
6446
发表于 昨天 15:48 | 显示全部楼层
这段代码存在数组越界的可能,越界的后果可能会严重。
建议先限制cnt,再存入数组。如这样:u8 d;d=SBUF;if(cnt<11){recvBuf[cnt]=d;cnt++;}

  1. // 串口1接受数据
  2. void Uart1Recv_isr() interrupt 4 {
  3.   if(RI) {
  4.     RI = 0;   
  5.     // 从SBUF读取数据   
  6.     recvBuf[cnt] = SBUF;
  7.     cnt++;
  8.   }
  9. }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-07-21 11:04:54
已绑定手机

6

主题

14

回帖

58

积分

注册会员

积分
58
发表于 昨天 16:13 | 显示全部楼层
lcws*** 发表于 2026-7-21 15:48
这段代码存在数组越界的可能,越界的后果可能会严重。
建议先限制cnt,再存入数组。如这样:u8 d;d=SBUF;if ...
串口发送的是完整的字符串,已经被逻辑分析仪验证过了,说明问题不在程序。问题是,串口助手显示的是截断的。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:153
  • 最近打卡:2026-07-21 14:44:21
已绑定手机

5

主题

356

回帖

6446

积分

论坛元老

积分
6446
发表于 昨天 16:22 | 显示全部楼层
12771*** 发表于 2026-7-21 16:13
串口发送的是完整的字符串,已经被逻辑分析仪验证过了,说明问题不在程序。问题是,串口助手显示的是截断的 ...

如果确定发送没问题,那问题可能出在USB转串口或串口助手,换一种USB转串口线(如CH340)、换一种串口助手(如sscom5.13.1.exe)试试。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-07-21 11:04:54
已绑定手机

6

主题

14

回帖

58

积分

注册会员

积分
58
发表于 昨天 16:39 | 显示全部楼层
lcws*** 发表于 2026-7-21 16:22
如果确定发送没问题,那问题可能出在USB转串口或串口助手,换一种USB转串口线(如CH340)、换一种串口助 ...

都试了。我用ISP的串口助手,直接发送11个字节的数据,没问题。换成CH340,发送11个字节的数据,也没有问题。但是,就是用RTC对时模块,实际上,也是发送了11个字节的数据,就有问题了。 所以, 问题  就是出在RTC对时模块的"设置RTC"按钮上。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 07:49 , Processed in 0.078079 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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