xunniqian 2026-02-06 14:48 采纳率: 0%
浏览 5

所有条件一致,同样的代码功能,为什么串口打印结果不同

这两段代码是一样的,为什么答应出来的结果不同?

img

左边的时第一段代码打印出来的结果,右边的是第二段代码打印出来的结果。


    // 定义调试标志
//#define DEBUG_PRINT_PROCESSED_DATA  1  // 设置为1启用调试打印,0禁用

///**
//  * @brief  处理所有通道数据
//  */
//void process_all_channels(void)
//{

//    
//    // 处理ADC0的数据
//    if (flag_ADC_DMA_REC2 == 1) {
//        // 分离前4000个点
//        separate_adc_channels(ADC_DMA_Data0, ADC_DMA_Data1, ADC_DMA_Data2, 
//                             Channel_Data, 0, SAMPLE_SIZE);
//        
//        // 处理每个通道
//        for (uint8_t ch = 0; ch < 3; ch++) {
//            estimate_and_fill_sine_wave(Channel_Data[ch], Process_Data[ch], ch);
//        }
//        
//        #if DEBUG_PRINT_PROCESSED_DATA
//        for (int i = 0; i < 4000; i++) {
//            printf("%d,%d\n", Process_Data[2][i], Channel_Data[2][i]+2000);
//        }
//        #endif

//    }
//    
//    if (flag_ADC_DMA_REC2 == 2) {
//        // 分离后4000个点
//        separate_adc_channels(ADC_DMA_Data0, ADC_DMA_Data1, ADC_DMA_Data2, 
//                             Channel_Data, 4000, SAMPLE_SIZE);
//        
//        // 处理每个通道
//        for (uint8_t ch = 0; ch < 3; ch++) {
//            estimate_and_fill_sine_wave(Channel_Data[ch], Process_Data[ch], ch);
//        }
//        
//        #if DEBUG_PRINT_PROCESSED_DATA
//        for (int i = 0; i < 4000; i++) {
//            printf("%d,%d\n", Process_Data[2][i], Channel_Data[2][i]-2000);
//        }
//        #endif

//    }
//            
//        // 清除标志
//    flag_ADC_DMA_REC2 = 0;
//    // 设置处理完成标志
//    flag_process_ready = 1;
//}

#define DEBUG_PRINT_PROCESSED_DATA  1  // 设置为1启用调试打印,0禁用

void process_all_channels(void)
{
    if (flag_ADC_DMA_REC2 == 1){
            separate_adc_channels(ADC_DMA_Data0, ADC_DMA_Data1, ADC_DMA_Data2, 
                             Channel_Data, 0, SAMPLE_SIZE);
                // 处理每个通道
                for (uint8_t ch = 0; ch < 3; ch++) {
                        estimate_and_fill_sine_wave(Channel_Data[ch], Process_Data[ch], ch);
                }
                
                #if DEBUG_PRINT_PROCESSED_DATA
                                for (int i = 0; i < 4000; i++) {
                                        printf("%d,%d\n ", Process_Data[2][i],Channel_Data[2][i]+2000);
                                }

                #endif
        }
        
        if (flag_ADC_DMA_REC2 == 2){
                separate_adc_channels(ADC_DMA_Data0, ADC_DMA_Data1, ADC_DMA_Data2, 
                             Channel_Data, 4000, SAMPLE_SIZE);
                // 处理每个通道
                for (uint8_t ch = 0; ch < 3; ch++) {
                        estimate_and_fill_sine_wave(Channel_Data[ch], Process_Data[ch], ch);
                }
                
                #if DEBUG_PRINT_PROCESSED_DATA
                                for (int i = 0; i < 4000; i++) {
                                        printf("%d,%d\n ", Process_Data[2][i],Channel_Data[2][i]-2000);
                                }

                #endif
        }
    
    // 设置处理完成标志
    flag_process_ready = 1;
    flag_ADC_DMA_REC2 = 0;

}
  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-02-06 14:49
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提到的两段代码在功能上是相同的,但串口打印结果不同。这可能是由于以下几个原因导致的:


    1. 代码逻辑不完全一致

    虽然你认为两段代码是一样的,但实际上它们可能在细节上存在差异,例如:

    • flag_ADC_DMA_REC2 的值是否相同?
    • 是否有其他变量或函数调用影响了数据处理?

    ✅ 解决方案:

    • 检查 flag_ADC_DMA_REC2 的值是否一致:确保两个版本中该标志位在进入 process_all_channels() 函数时的状态相同。
    • 对比两段代码的完整逻辑:确认 estimate_and_fill_sine_wave()separate_adc_channels() 的行为是否一致。

    2. 打印语句格式不同

    从你提供的代码片段可以看出,第一段代码的打印语句为:

    printf("%d,%d\n", Process_Data[2][i], Channel_Data[2][i]+2000);
    

    第二段代码的打印语句为:

    printf("%d,%d\n ", Process_Data[2][i], Channel_Data[2][i]-2000);
    

    注意以下几点:

    • 第二段代码中 printf 的格式字符串多了一个空格(%d\n)。
    • 第二段代码中对 Channel_Data[2][i] 做了 -2000 操作,而第一段是 +2000

    ✅ 修改建议(如果希望保持一致性):

    如果你希望两段代码输出相同的结果,请统一 printf 格式和数值操作。

    修改后的代码示例:

    // 统一打印格式
    #if DEBUG_PRINT_PROCESSED_DATA
        for (int i = 0; i < 4000; i++) {
            printf("%d,%d\n", Process_Data[2][i], Channel_Data[2][i] + 2000);
        }
    #endif
    

    或者:

    #if DEBUG_PRINT_PROCESSED_DATA
        for (int i = 0; i < 4000; i++) {
            printf("%d,%d\n", Process_Data[2][i], Channel_Data[2][i] - 2000);
        }
    #endif
    

    3. 数据处理顺序或内容不一致

    即使代码结构一样,数据来源(如 ADC_DMA_Data0、ADC_DMA_Data1、ADC_DMA_Data2)也可能存在差异,导致 Channel_DataProcess_Data 不同。

    ✅ 解决方案:

    • 检查 ADC 数据是否一致:确保两个版本中的 ADC 数据源相同。
    • 调试中间变量:在 process_all_channels() 中添加调试打印,查看 Channel_DataProcess_Data 的内容是否一致。

    4. 多线程/中断干扰

    如果这段代码运行在多线程中断服务程序中,可能会出现并发问题,比如:

    • 数据未被正确同步。
    • 变量被其他任务修改。

    ✅ 解决方案:

    • 检查是否有中断或任务调度影响数据
    • 使用临界区保护:确保关键代码段不会被中断打断。

    5. 编译配置或宏定义不一致

    你提到第一段代码中 DEBUG_PRINT_PROCESSED_DATA 被注释掉了,而第二段代码中启用。这会导致打印行为不同。

    ✅ 解决方案:

    • 确保 DEBUG 宏定义一致:两段代码应使用相同的调试宏定义。
    • 统一编译配置:确保两个版本的编译器、优化级别、头文件等一致。

    ✅ 总结:可能导致串口打印不同的原因

    | 原因 | 说明 | |------|------| | 打印语句格式不同 | 第一段和第二段代码中 printf 的格式和数值运算不同。 | | 数据源不一致 | ADC 数据或通道数据可能被不同处理。 | | 调试宏定义不一致 | 一个启用了调试打印,另一个没有。 | | 变量状态不一致 | flag_ADC_DMA_REC2 状态可能不同,导致分支执行不同。 | | 并发或中断干扰 | 多线程环境下数据可能被修改。 |


    ✅ 推荐步骤(按优先级排序)

    1. 检查 flag_ADC_DMA_REC2 的值是否一致
    2. 统一 printf 格式和数值运算(如 +2000 vs -2000)。
    3. 检查 ADC 数据是否一致
    4. 确保 DEBUG 宏定义一致
    5. 排查多线程或中断干扰

    如果你能提供更完整的代码或调试信息(如 ADC_DMA_Data0ADC_DMA_Data2 的数据),我可以进一步帮助你定位问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月6日