陈北 发表于 7 天前

debug调试界面问题,求解!!

void Receive_Sixteenbit()
{       
        uchar i;
        for(i = 0;i < 16;i ++)
        {
                Sixteen_bit |= ((uint)Receive_1bit() << i);        //低位在前,高位在后       
        }
        Receive_Parity = Receive_1bit();//接收的校验位
        Receive_Ready = 1;
        Data1 = Sixteen_bit & 0xFF;
        Data2 = (Sixteen_bit >> 8) & 0xFF;
}我在此已将Data1和Data2申明为外部可调用

void main()
{
        Delay_Ms(7);
       
        GPIO_Init();
       
        ADC_Init();
       
        Uart1_Init();
        while(1)
        {
                Send_DKdata(0x00,0x01);        //发送数据       
                Delay_Ms(1);               
                Receive_Sixteenbit();                //接收数据
                Send_Byte(Data1);             //串口发送
                Send_Byte(Data2);                //串口发送
                Delay_Ms(8);
                Send_DKdata(0x10,0x01);               
                Delay_Ms(1);               
                Receive_Sixteenbit();               
                Send_Byte(Data1);
                Send_Byte(Data2);               
                Delay_Ms(8);       
        }
}
在debug界面,Data1和Data2的值始终是0,但通过串口发送Data1和Data2,又是有数据的,并且数据与协议对的上,这是为什么,请求大佬解答


国芯人工智能 发表于 7 天前

根据您提供的代码,问题可能出在 ReceiveSixteenbit() 函数的实现上。当前函数中对 Sixteenbit 的赋值逻辑存在明显错误,导致 Data1 和 Data2 无法正确获取接收到的数据,从而在调试界面显示为 0。

问题分析

c
void ReceiveSixteenbit()
{
    uchar i;
    for(i = 0; i < 16; i++)
    {
      Sixteenbit |= ((uint)Receive1bit() > 8) & 0xFF;
    }
}

该函数的问题在于:

1. Receive1bit() 返回值处理不当
   Receive1bit() 应返回一个位(0 或 1),但代码中将其转换为 uint 后与 > 8 进行比较,这显然是不合理的。Receive1bit() 的返回值应为 0 或 1,因此 (uint)Receive1bit() > 8 永远为 false,即 0,最终结果始终为 0。

2. Sixteenbit 赋值逻辑错误
   该函数试图通过逐位读取 16 位数据并拼接成一个 16 位整数,但当前逻辑是将每一位的结果与 0xFF 做按位或操作,这会导致 Sixteenbit 只能保存低 8 位数据,且每次循环都会覆盖高位,最终结果不准确。

3. 未对 Data1 和 Data2 正确赋值
   您提到 Data1 和 Data2 是外部可调用变量,但在当前代码中并未看到它们被赋值。如果 Data1 和 Data2 是从 Sixteenbit 中提取的高 8 位和低 8 位,则需要明确地进行拆分。

推荐修复方案

1. 修正 ReceiveSixteenbit() 函数

假设 Receive1bit() 返回的是单个位(0 或 1),则应逐位构建 16 位数据:

c
void ReceiveSixteenbit()
{
    uint sixteenbit = 0;
    uchar i;
    for(i = 0; i < 16; i++)
    {
      sixteenbit8);// 高 8 位
    Data2 = (uchar)sixteenbit;         // 低 8 位
}
注意:此版本假设 Data1 和 Data2 是全局变量,并且已正确定义为 uchar 类型。

2. 确保 Data1 和 Data2 已定义

请确认以下内容是否已在代码中定义:

c
extern uchar Data1;
extern uchar Data2;

或者在文件顶部声明:

c
uchar Data1, Data2;

3. 检查 Receive1bit() 实现

确保 Receive1bit() 正确读取一位数据,例如:

c
uchar Receive1bit()
{
    // 示例:读取串口的一位数据
    return (Uart1GetByte() >> 7) & 0x01; // 假设高位为有效数据
}

总结

您的 ReceiveSixteenbit() 函数中存在关键逻辑错误,导致 Data1 和 Data2 始终为 0。建议按照上述方式修正函数逻辑,并确保 Data1 和 Data2 正确定义和赋值。若仍有问题,请提供 Receive1bit() 的实现代码以进一步排查。

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: debug调试界面问题,求解!!