找回密码
 立即注册
查看: 140|回复: 15

15W204S切换串口偶发数据异常

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-12 15:40:43 | 显示全部楼层 |阅读模式
1、P36、37接上位机通信
2、P30、P31接模块
3、上位机发送命令,执行P30、P31模块,中间需要切换uart1端口

处理主要代码:
  1. u8 send[20];
  2. void ExecIOIn()
  3. {
  4.         u8* s = send+1;
  5.         u32 curTime;
  6.         s[0]=0xCC;
  7.         s[1]=0x03;
  8.         s[2]=0x00;
  9.         s[3]=s[0]+s[1]+s[2];
  10.         s[4]=0xDD;
  11.         
  12.         // 切换P30、P31
  13.         UART1_SW(UART1_SW_P30_P31);
  14.         
  15.         COM1.RX_Cnt = 0;
  16.         COM1.RX_flag = 0;
  17.         
  18.         SendUart1(s, 5);
  19.         curTime=ticket_1ms;
  20.         while(ticket_1ms<curTime+50)
  21.         {
  22.                 if(COM1.RX_flag) break;
  23.         }
  24.         // 切换回来P36、P37
  25.         UART1_SW(UART1_SW_P36_P37);
  26.         
  27.         // 返回查询结果
  28.         s[0]=COM1.RX_Buffer[1];
  29.         s[1]=02;
  30.         s[3] = 0;
  31.         if(COM1.RX_flag)
  32.         {
  33.                 s[2]=0x00;
  34.                 s[3] = COM1.RX_Buffer[4];
  35.         }
  36.         else
  37.         {
  38.                 s[2]=0xF1;
  39.         }
  40.         SendHostData(4);
  41. }
复制代码


偶发出现上位机发送命令,返回的数据异常的情况,概率不大。

如下:
  1. 2025-08-12 14:12:43.446 > AA 03 00 AD BB
  2. 2025-08-12 14:12:43.498 < AA 03 03 02 00 03 B5 BB
  3. 2025-08-12 14:12:44.299 > AA 03 00 AD BB
  4. 2025-08-12 14:12:44.352 < AA 03 03 02 00 03 B5 BB
  5. 2025-08-12 14:12:45.153 > AA 03 00 AD BB
  6. 2025-08-12 14:12:45.205 < AA 03 03 02 00 03 B5 BB
  7. 2025-08-12 14:12:46.006 > AA 03 00 AD BB
  8. 2025-08-12 14:12:46.039 < A7 6D D0 20 A0 7C 80 A3
  9. 2025-08-12 14:12:46.840 > AA 03 00 AD BB
  10. 2025-08-12 14:12:46.893 < AA 03 03 02 00 03 B5 BB
  11. 2025-08-12 14:12:47.694 > AA 03 00 AD BB
  12. 2025-08-12 14:12:47.746 < AA 03 03 02 00 03 B5 BB
  13. 2025-08-12 14:12:48.547 > AA 03 00 AD BB
  14. 2025-08-12 14:12:48.600 < AA 03 03 02 00 03 B5 BB
  15. 2025-08-12 14:12:49.401 > AA 03 00 AD BB
  16. 2025-08-12 14:12:49.454 < AA 03 03 02 00 03 B5 BB
复制代码
目前2天出现2、3次,出现错误的数据是一样的。麻烦指导一下?
回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-8-12 15:43:00 | 显示全部楼层
尊敬的用户,您好:

感谢您对STC15W204S单片机在串口通信中偶发数据异常问题的关注。根据您提供的信息及代码片段,我们对该问题进行了初步分析,并结合相关技术原理提出以下专业建议与解决方案。

首先,针对您的使用场景:
P36、P37用于与上位机通信(UART1);
P30、P31用于连接模块,需在执行过程中切换UART1端口;
代码中通过UART1SW(UART1SWP30P31)实现端口切换;
发送命令后等待响应,但存在偶发数据异常现象。

一、可能存在的问题点

1. 端口切换时序不准确  
   UART1SW函数用于切换UART1的引脚配置,但若该操作未完成或未等待足够时间,可能导致通信中断或数据错位。特别是在发送指令后立即切换端口,可能造成数据未完全发送或接收缓冲区未清空,导致后续通信异常。

2. 通信协议未严格校验  
   您的代码中发送的数据格式为:AA 03 00 AD BB,但实际接收到的数据为AA 03 03 02 00 03 B5 BB,说明可能存在协议不一致或校验机制缺失。建议增加帧头、帧尾、校验码(如CRC)等机制以确保数据完整性。

3. 串口接收标志位处理不及时  
   在发送指令后,若未正确设置接收标志位(如COM1RXflag),或未等待足够时间接收完整数据,可能导致数据读取错误。建议在发送指令后添加适当的延时,并确保接收缓冲区被正确清空。

4. 多任务或中断冲突  
   若系统中存在其他中断服务程序或任务调度,可能影响UART1的正常通信。建议检查中断优先级设置,避免UART1通信被意外打断。

二、优化建议

1. 确保端口切换后通信稳定  
   在调用UART1SW之后,建议添加适当的延时(如5ms),确保硬件完成引脚切换并稳定工作,再进行数据发送和接收。

  
  1. c
  2.    UART1SW(UART1SWP30P31);
  3.    Delayms(5); // 延时5ms
复制代码

2. 完善通信协议与数据校验  
   建议在发送和接收数据时增加帧结构定义,例如:

  
  1. c
  2.    typedef struct {
  3.        u8 head;         // 帧头
  4.        u8 cmd;          // 命令字
  5.        u8 data[16];     // 数据域
  6.        u16 checksum;    // 校验码
  7.        u8 tail;         // 帧尾
  8.    } UARTFrame;
复制代码

   并在发送前计算校验码,接收后验证帧头、帧尾和校验码,确保数据准确性。

3. 优化接收逻辑  
   在发送指令后,应等待接收缓冲区数据完整后再读取,避免因数据未完全接收而造成解析错误。可采用超时机制或轮询方式确保接收完成。

  
  1. c
  2.    COM1RXCnt = 0;
  3.    COM1RXflag = 0;
  4.    SendUart1(s, 5);
  5.    
  6.    while (!COM1RXflag && (ticket1ms - curTime < 100)) {
  7.        // 等待接收完成
  8.    }
复制代码

4. 检查系统中断与任务调度  
   若系统中存在多个任务或中断源,建议检查UART1相关的中断优先级,确保其不会被其他高优先级中断抢占,从而影响通信稳定性。

三、总结

STC15W204S是一款性能稳定的增强型8位MCU,适用于多种工业控制与通信场景。在实际应用中,合理配置UART通信参数、优化通信协议、加强数据校验机制是保障通信稳定性的关键。若您能提供更详细的通信协议定义或调试日志,我们将进一步协助定位问题根源。

如有其他技术问题,欢迎随时联系国芯人工智能技术支持团队。

此致  
敬礼!

国芯人工智能技术团队  
2025年8月12日

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-12 15:43:35 | 显示全部楼层
其中:2025-08-12 14:12:46.039 < A7 6D D0 20 A0 7C 80 A3 是错误的。

上位机大约800ms查询一次。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-12 15:50:28 | 显示全部楼层
国芯人*** 发表于 2025-8-12 15:43
尊敬的用户,您好:

感谢您对STC15W204S单片机在串口通信中偶发数据异常问题的关注。根据您提供的信息及代 ...

1、可以确定端口由P36/P37 切换到P30/P31的时候,P36/P37 无收发数据,端口切换回来,也是程序主动发的数据,按说不应该出现未识别的数据
2、通信协议本身由求和校验,和校验无关
3、应该没什么关系
4、没有多任务,单循环操作

依然不知道具体原因,
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-12 15:55:36 | 显示全部楼层
开始调节频率 ...                        [0.781"]
调节后的频率: 11.069MHz (0.087%)

正在重新握手 ... 成功                        [0.140"]
当前的波特率: 115200
正在擦除目标区域 ... 完成 !                [0.422"]
正在下载用户代码 ... 完成 !                [0.985"]
正在设置硬件选项 ... 完成 !                [0.047"]

更新后的硬件选项为:
  . 下次冷启动后系统时钟源为内部IRC振荡器
  . 当前的振荡器的频率: 11.069MHz
  . P3.2和P3.3与下次下载无关
  . 上电复位时增加额外的复位延时
  . 复位引脚用作普通I/O口
  . 检测到低压时复位
  . 低压检测门槛电压 : 2.69 V
  . 低压时不能进行EEPROM操作
  . CPU-Core最高工作电压 : 2.74 V
  . 上电复位时,硬件不启动内部看门狗
  . 上电自动启动内部看门狗时的预分频数为 : 256
  . 空闲状态时看门狗定时器停止计数
  . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗
  . 下次下载用户程序时,不擦除用户EEPROM区
  . 下次下载用户程序时,没有相关的端口控制485
  . 下次下载时不需要校验下载口令
  . TXD与RXD为相互独立的IO
  . 芯片复位后,TXD脚为弱上拉双向口
  . 芯片复位后,P1.0输出高电平
  . 内部参考电压: 1249 mV (参考范围: 1150~1320mV)
芯片出厂序列号 : F514C5F6151459

  单片机型号: STC15W204S

  . 用户设定频率: 11.059MHz
  . 调节后的频率: 11.069MHz
  . 频率调节误差: 0.087%
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-12 17:38:42 | 显示全部楼层
看代码和报文对不上呀,CC DD字节呢



是否可上传复现问题的工程


硬件环境是怎样的,是否有外部干扰源呢?
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-12 18:12:37 | 显示全部楼层
erci*** 发表于 2025-8-12 17:38
看代码和报文对不上呀,CC DD字节呢

见附件,硬件简单,应该也没什么。不是我做的
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-12 18:13:14 | 显示全部楼层
erci*** 发表于 2025-8-12 17:38
看代码和报文对不上呀,CC DD字节呢

CC DD 是发给下面模块的,报文是上位机的

点评

1L的报文对应哪一行呢,还是和代码对不上,怎么感觉是上位机发送方报文出了问题 带AABB修饰的发报文函数SendHostData只有三处调用, 2,6,4发出来分别是5,9,7个字节 AA 03 03 02 00 03 B5 BB A7 6D D0 20 A0  详情 回复 发表于 2025-8-12 18:58
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-12 18:58:17 | 显示全部楼层
cd*** 发表于 2025-8-12 18:13
CC DD 是发给下面模块的,报文是上位机的

1L的报文对应哪一行呢,还是和代码对不上,怎么感觉是上位机发送方报文出了问题


带AABB修饰的发报文函数SendHostData只有三处调用,
2,6,4发出来分别是5,9,7个字节


AA 03 03 02 00 03 B5 BB
A7 6D D0 20 A0 7C 80 A3
你这是5+3,八字节~

能对得上的只有回复报文,AA 03 00 AD BB,ExecSetLed?


截图202508121854479068.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-08-15 09:54:35
已绑定手机

2

主题

12

回帖

46

积分

新手上路

积分
46
发表于 2025-8-13 09:14:13 | 显示全部楼层
erci*** 发表于 2025-8-12 18:58
1L的报文对应哪一行呢,还是和代码对不上,怎么感觉是上位机发送方报文出了问题

不好意思,代码我昨天修改了,之前的代码返回的多了一个字节03,我昨天去掉了。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-24 04:11 , Processed in 0.132492 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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