cdg 发表于 2025-8-12 15:40:43

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

1、P36、37接上位机通信
2、P30、P31接模块
3、上位机发送命令,执行P30、P31模块,中间需要切换uart1端口

处理主要代码:
u8 send;
void ExecIOIn()
{
      u8* s = send+1;
      u32 curTime;
      s=0xCC;
      s=0x03;
      s=0x00;
      s=s+s+s;
      s=0xDD;
      
      // 切换P30、P31
      UART1_SW(UART1_SW_P30_P31);
      
      COM1.RX_Cnt = 0;
      COM1.RX_flag = 0;
      
      SendUart1(s, 5);
      curTime=ticket_1ms;
      while(ticket_1ms<curTime+50)
      {
                if(COM1.RX_flag) break;
      }
      // 切换回来P36、P37
      UART1_SW(UART1_SW_P36_P37);
      
      // 返回查询结果
      s=COM1.RX_Buffer;
      s=02;
      s = 0;
      if(COM1.RX_flag)
      {
                s=0x00;
                s = COM1.RX_Buffer;
      }
      else
      {
                s=0xF1;
      }
      SendHostData(4);
}

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

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

国芯人工智能 发表于 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),确保硬件完成引脚切换并稳定工作,再进行数据发送和接收。

   c
   UART1SW(UART1SWP30P31);
   Delayms(5); // 延时5ms

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

   c
   typedef struct {
       u8 head;         // 帧头
       u8 cmd;          // 命令字
       u8 data;   // 数据域
       u16 checksum;    // 校验码
       u8 tail;         // 帧尾
   } UARTFrame;

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

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

   c
   COM1RXCnt = 0;
   COM1RXflag = 0;
   SendUart1(s, 5);
   
   while (!COM1RXflag && (ticket1ms - curTime < 100)) {
       // 等待接收完成
   }

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

三、总结

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

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

此致
敬礼!

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

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

cdg 发表于 2025-8-12 15:43:35

其中:2025-08-12 14:12:46.039 < A7 6D D0 20 A0 7C 80 A3 是错误的。

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

cdg 发表于 2025-8-12 15:50:28

国芯人工智能 发表于 2025-8-12 15:43
尊敬的用户,您好:

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

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

依然不知道具体原因,

cdg 发表于 2025-8-12 15:55:36

开始调节频率 ...                       
调节后的频率: 11.069MHz (0.087%)

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

更新后的硬件选项为:
. 下次冷启动后系统时钟源为内部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%

ercircle 发表于 2025-8-12 17:38:42

看代码和报文对不上呀,CC DD字节呢



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


硬件环境是怎样的,是否有外部干扰源呢?

cdg 发表于 2025-8-12 18:12:37

ercircle 发表于 2025-8-12 17:38
看代码和报文对不上呀,CC DD字节呢



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

cdg 发表于 2025-8-12 18:13:14

ercircle 发表于 2025-8-12 17:38
看代码和报文对不上呀,CC DD字节呢




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

ercircle 发表于 2025-8-12 18:58:17

cdg 发表于 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?



cdg 发表于 2025-8-13 09:14:13

ercircle 发表于 2025-8-12 18:58
1L的报文对应哪一行呢,还是和代码对不上,怎么感觉是上位机发送方报文出了问题




不好意思,代码我昨天修改了,之前的代码返回的多了一个字节03,我昨天去掉了。
页: [1] 2
查看完整版本: 15W204S切换串口偶发数据异常