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次,出现错误的数据是一样的。麻烦指导一下?
尊敬的用户,您好:
感谢您对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日
[本文内容由国芯人工智能辅助生成,仅供参考] 其中:2025-08-12 14:12:46.039 < A7 6D D0 20 A0 7C 80 A3 是错误的。
上位机大约800ms查询一次。 国芯人工智能 发表于 2025-8-12 15:43
尊敬的用户,您好:
感谢您对STC15W204S单片机在串口通信中偶发数据异常问题的关注。根据您提供的信息及代 ...
1、可以确定端口由P36/P37 切换到P30/P31的时候,P36/P37 无收发数据,端口切换回来,也是程序主动发的数据,按说不应该出现未识别的数据
2、通信协议本身由求和校验,和校验无关
3、应该没什么关系
4、没有多任务,单循环操作
依然不知道具体原因, 开始调节频率 ...
调节后的频率: 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% 看代码和报文对不上呀,CC DD字节呢
是否可上传复现问题的工程
硬件环境是怎样的,是否有外部干扰源呢?
ercircle 发表于 2025-8-12 17:38
看代码和报文对不上呀,CC DD字节呢
见附件,硬件简单,应该也没什么。不是我做的
ercircle 发表于 2025-8-12 17:38
看代码和报文对不上呀,CC DD字节呢
CC DD 是发给下面模块的,报文是上位机的 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?
ercircle 发表于 2025-8-12 18:58
1L的报文对应哪一行呢,还是和代码对不上,怎么感觉是上位机发送方报文出了问题
不好意思,代码我昨天修改了,之前的代码返回的多了一个字节03,我昨天去掉了。
页:
[1]
2