找回密码
 立即注册
查看: 36|回复: 1

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-08-28 14:45:51
已绑定手机

4

主题

11

回帖

80

积分

注册会员

积分
80
发表于 7 天前 | 显示全部楼层 |阅读模式
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,又是有数据的,并且数据与协议对的上,这是为什么,请求大佬解答


debug

debug

串口

串口
回复

使用道具 举报 送花

3

主题

2001

回帖

850

积分

等待验证会员

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

问题分析
  1. c
  2. void ReceiveSixteenbit()
  3. {
  4.     uchar i;
  5.     for(i = 0; i < 16; i++)
  6.     {
  7.         Sixteenbit |= ((uint)Receive1bit() > 8) & 0xFF;
  8.     }
  9. }
复制代码

该函数的问题在于:

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 位数据:
  1. c
  2. void ReceiveSixteenbit()
  3. {
  4.     uint sixteenbit = 0;
  5.     uchar i;
  6.     for(i = 0; i < 16; i++)
  7.     {
  8.         sixteenbit  8);  // 高 8 位
  9.     Data2 = (uchar)sixteenbit;         // 低 8 位
  10. }
复制代码
注意:此版本假设 Data1 和 Data2 是全局变量,并且已正确定义为 uchar 类型。

2. 确保 Data1 和 Data2 已定义

请确认以下内容是否已在代码中定义:
  1. c
  2. extern uchar Data1;
  3. extern uchar Data2;
复制代码

或者在文件顶部声明:
  1. c
  2. uchar Data1, Data2;
复制代码

3. 检查 Receive1bit() 实现

确保 Receive1bit() 正确读取一位数据,例如:
  1. c
  2. uchar Receive1bit()
  3. {
  4.     // 示例:读取串口的一位数据
  5.     return (Uart1GetByte() >> 7) & 0x01; // 假设高位为有效数据
  6. }
复制代码

总结

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

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

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-3 12:01 , Processed in 0.120582 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表