Matrix 发表于 2026-2-20 20:48:10

已解决 | STC8H4K64TL串口接收数截取加CRC 校验出现的奇怪问题

大神们帮忙分析一下,谢谢。

问题情况,在接收到数据后截取程序,然后进行CRC计算导致接收数据都不正确。
分3种情况:
1、在接收数据不转存时,计算的CRC有时正确有时不正确。


2、在接收数据转存后,不进行CRC计算,直接输出正确。



3、在接收数据转存后,进行CRC计算,接收到的数据输出错误。







Matrix 发表于 2026-2-20 21:00:22

                if(Flag_GetData == 1)
                {
                        for(i=0; i<Uart1_Getlen; i++)        Uart1_SendChar(Uart1_Get);        //收到的数据原样返回       
//                        CRC16_result = MODBUS_CRC16(Uart1_Get, Uart1_Getlen-2);
////                        CRC16_result = MODBUS_CRC16(frame, 6);
//                        CRC16_H = CRC16_result / 256;
//                        CRC16_L = CRC16_result % 256;       
//                        Uart1_SendChar(CRC16_H);
//                        Uart1_SendChar(CRC16_L);
                       
                        if(MODBUS_CRC16(Uart1_Get, Uart1_Getlen) == 0)        //首先判断CRC16是否正确, 不正确则忽略, 不处理也不返回信息
                        {
                                Uart1_SendChar('A');
                        }
                        else
                                Uart1_SendChar('B');
                       
                        Flag_GetData = 0;
                        for(i=0; i<COM_RX1_Length; i++)                Uart1_Get = '\0';
                }

改成这样数据就错了,为什么呢?

Matrix 发表于 2026-2-20 21:19:34

Matrix 发表于 2026-2-20 21:00
if(Flag_GetData == 1)
                {
                        for(i=0; i

为什么在这里插了4个0x42呢?应该有一个在最后啊?插入4个造成CRC计算错误。什么原因呢?

Matrix 发表于 2026-2-21 07:32:41

问题解决,判断接收数据结束间隔不正确,时间太短,没有接收结束就进行处理。
页: [1]
查看完整版本: 已解决 | STC8H4K64TL串口接收数截取加CRC 校验出现的奇怪问题