gjbdthga 发表于 2026-3-17 19:25:08

字符串比较

u8 xdata RxBuf;

        if (!(strncmp(RxBuf,"12345678AABBCCDD", 16)))
        {        PrintString2("1---2---3---4---\n\r");
        }


执行不正确。不知道 问题出在哪里


高手给指点一下

神农鼎 发表于 2026-3-17 22:52:35


高手千问,豆包


问题分析

[*]strncmp 函数的特性:


[*]strncmp 是按字节比较字符串,要求被比较的内存区域必须是有效的 ASCII 字符(0x00-0x7F),且通常期望以 \0 结尾(虽然 strncmp 按长度比较,但数据异常仍会导致结果错误)。
[*]你的比较长度是 16,但如果 RxBuf 中实际接收的字节不是 12345678AABBCCDD 对应的 ASCII 码(比如是十六进制字节而非字符),比较结果必然不相等。
[*]示例:"A" 的 ASCII 码是 0x41,而如果 RxBuf 中存的是十六进制 0xAA(而非字符 'A'),两者完全不同。


[*]RxBuf 数据来源问题:


[*]你用的是 u8 xdata RxBuf(51 单片机的扩展 RAM 数组),串口接收的数据可能存在:
[*]接收字节数不足 16 个;
[*]数据包含不可见字符(如换行、空格、校验位);
[*]接收顺序错误或字节丢失;
[*]数据是十六进制字节(如 0x12、0x34)而非字符('1'、'2')。




[*]代码逻辑的潜在问题:


[*]缺少对 RxBuf 接收完成的判断(比如未检查接收长度是否为 16);
[*]没有排除接收过程中的干扰字节。



修正后的代码(可直接运行)
c









神农鼎 发表于 2026-3-17 22:53:59





神农鼎 发表于 2026-3-17 22:55:23

这 豆包 这么疯狂的回答,难怪 MEMORY 疯涨

自己问下 豆包, 为何你还是没搞定

lcwswust 发表于 2026-3-18 09:17:24

RxBuf的内容发到串口助手看看呗,“文本模式”、“HEX模式”都开启。
页: [1]
查看完整版本: 字符串比较