找回密码
 立即注册
查看: 58|回复: 5

大佬们这个编译怎么一直报错呢

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-09 17:40:24
已绑定手机

9

主题

34

回帖

187

积分

注册会员

积分
187
发表于 3 天前 | 显示全部楼层 |阅读模式

#include "config.h"
#define unsigned char U8
U8 rec_Dat[60];
U8 rec_num = 0;

BOOL fPrintfBusy;

// 串口1中断服务程序
void UART1_ISR(void) interrupt UART1_VECTOR
{
    if (UART1_CheckTxFlag())            // 判断串口发送中断
    {
        UART1_ClearTxFlag();            // 清除串口发送中断标志
        fPrintfBusy = 0;                // 清除printf发送忙标志
    }

    if (UART1_CheckRxFlag())            // 判断串口接收中断
    {
        UART1_ClearRxFlag();            // 清除串口接收中断标志
        if (rec_num < sizeof(rec_Dat))  // 检查数组是否已满
        {
            rec_Dat[rec_num++] = UART1_ReceiveData(); // 接收数据并存储
        }
        else
        {
            // 错误处理:接收缓冲区已满
            rec_num = 0; // 或者根据需要采取其他措施
        }
    }
}

// 串口1初始化函数
void UART1_Init(void)
{
    UART1_SwitchP3637();                // 设置串口数据端口: RxD (P3.6), TxD (P3.7)
    UART1_Timer2BRT();                  // 选择定时器2作为串口1波特率发生器
    UART1_EnableRx();                   // 使能串口1接收数据
    UART1_Mode1();                      // 设置串口1为模式1 (8位数据可变波特率)
    UART1_SetIntPriority(0);            // 设置中断为最低优先级
    UART1_EnableInt();                  // 使能串口1中断

    fPrintfBusy = 0;                    // 清除发送数据忙标志
}

// 重写printf字符发送重定向函数
char putchar(char dat)                 // 将串口1和printf函数绑定
{
    while (fPrintfBusy);                // 等待发送完成
    UART1_SendData(dat);
    fPrintfBusy = 1;

    return dat;
}

// 处理接收到的数据
void usart1_RunTask(void)
{
    if (rec_num >= 6)
    {
        if ((rec_Dat[rec_num - 1] == '\n') && (rec_Dat[rec_num - 2] == '\r'))
        {
            if ((rec_Dat[rec_num - 3] == 'O') && (rec_Dat[rec_num - 4] == 'P') &&
                (rec_Dat[rec_num - 5] == 'E') && (rec_Dat[rec_num - 6] == 'N'))
            {
                P0 = 0X20; // 设置P0的值
            }
        }
        rec_num = 0; // 处理完数据后重置计数器
    }
}
  1. #include "config.h"
  2. #define unsigned char U8
  3. U8 rec_Dat[60];
  4. U8 rec_num = 0;
  5. BOOL fPrintfBusy;
  6. // 串口1中断服务程序
  7. void UART1_ISR(void) interrupt UART1_VECTOR
  8. {
  9.     if (UART1_CheckTxFlag())            // 判断串口发送中断
  10.     {
  11.         UART1_ClearTxFlag();            // 清除串口发送中断标志
  12.         fPrintfBusy = 0;                // 清除printf发送忙标志
  13.     }
  14.     if (UART1_CheckRxFlag())            // 判断串口接收中断
  15.     {
  16.         UART1_ClearRxFlag();            // 清除串口接收中断标志
  17.         if (rec_num < sizeof(rec_Dat))  // 检查数组是否已满
  18.         {
  19.             rec_Dat[rec_num++] = UART1_ReceiveData(); // 接收数据并存储
  20.         }
  21.         else
  22.         {
  23.             // 错误处理:接收缓冲区已满
  24.             rec_num = 0; // 或者根据需要采取其他措施
  25.         }
  26.     }
  27. }
  28. // 串口1初始化函数
  29. void UART1_Init(void)
  30. {
  31.     UART1_SwitchP3637();                // 设置串口数据端口: RxD (P3.6), TxD (P3.7)
  32.     UART1_Timer2BRT();                  // 选择定时器2作为串口1波特率发生器
  33.     UART1_EnableRx();                   // 使能串口1接收数据
  34.     UART1_Mode1();                      // 设置串口1为模式1 (8位数据可变波特率)
  35.     UART1_SetIntPriority(0);            // 设置中断为最低优先级
  36.     UART1_EnableInt();                  // 使能串口1中断
  37.     fPrintfBusy = 0;                    // 清除发送数据忙标志
  38. }
  39. // 重写printf字符发送重定向函数
  40. char putchar(char dat)                 // 将串口1和printf函数绑定
  41. {
  42.     while (fPrintfBusy);                // 等待发送完成
  43.     UART1_SendData(dat);
  44.     fPrintfBusy = 1;
  45.     return dat;
  46. }
  47. // 处理接收到的数据
  48. void usart1_RunTask(void)
  49. {
  50.     if (rec_num >= 6)
  51.     {
  52.         if ((rec_Dat[rec_num - 1] == '\n') && (rec_Dat[rec_num - 2] == '\r'))
  53.         {
  54.             if ((rec_Dat[rec_num - 3] == 'O') && (rec_Dat[rec_num - 4] == 'P') &&
  55.                 (rec_Dat[rec_num - 5] == 'E') && (rec_Dat[rec_num - 6] == 'N'))
  56.             {
  57.                 P0 = 0X20; // 设置P0的值
  58.             }
  59.         }
  60.         rec_num = 0; // 处理完数据后重置计数器
  61.     }
  62. }
复制代码



回复

使用道具 举报 送花

3

主题

1102

回帖

915

积分

等待验证会员

积分
915
发表于 3 天前 | 显示全部楼层
针对您提供的代码片段,结合C51架构嵌入式开发的常见编译问题,笔者分析可能存在以下技术问题需要排查:

一、宏定义语法错误
  1. c
  2. define unsigned char U8
复制代码
此处的宏定义语法存在逻辑倒置,正确形式应为:
  1. c
  2. define U8 unsigned char
复制代码
当前错误写法会导致编译器将U8识别为未定义标识符,引发后续变量声明错误(如U8 recDat[60])。这是代码中最直接的语法错误来源。

二、BOOL类型未定义
  1. c
  2. BOOL fPrintfBusy;
复制代码
标准C语言未定义BOOL类型,需通过以下方式之一进行补充:
1. 包含C99标准头文件(推荐):
  
  1. c
  2.    #include
复制代码
2. 自定义类型定义(需在头文件中声明):
  
  1. c
  2.    typedef enum {FALSE = 0, TRUE = !FALSE} BOOL;
复制代码

三、中断服务函数语法规范
  1. c
  2. void UART1ISR(void) interrupt UART1VECTOR
复制代码
该语法在Keil C51中不完整,正确的中断函数声明需包含中断号或寄存器组标识。根据常见实现方式,建议修改为:
  1. c
  2. void UART1ISR(void) interrupt 4 using 1  // UART1中断号为4,使用寄存器组1
复制代码
或通过宏定义方式增强可读性:
  1. c
  2. define UART1VECTOR 4
  3. void UART1ISR(void) interrupt UART1VECTOR using 1
复制代码
需根据具体芯片手册确认中断向量号,部分国产芯片可能采用interrupt等扩展关键字。

四、函数体闭合与逻辑完整性
当前代码片段中UART1ISR函数体未闭合,中断标志判断后缺少执行逻辑:
  1. c
  2. if (UART1CheckTxFlag())            // 判断串口发送中断
  3. {
  4.     // 缺少中断处理逻辑及括号闭合
  5. }
复制代码
需补充中断处理代码并确保大括号闭合,例如:
  1. c
  2. if (UART1CheckTxFlag())
  3. {
  4.     UART1ClearTxFlag();        // 清除发送中断标志
  5.     fPrintfBusy = FALSE;        // 释放打印资源
  6. }
复制代码

五、依赖函数声明缺失
函数UART1CheckTxFlag()未在代码中显式声明,需确保以下两点:
1. 包含芯片外设库头文件(例如#include "CHIPUART.h")
2. 检查链接库配置,确保编译时能正确关联到外设驱动库

六、工程配置建议
1. 头文件路径检查  
   确认configh文件实际存在且路径正确(注意文件名拼写是否应为config.h)
2. 编译器兼容性  
   若使用SDCC等开源工具链,需注意interrupt关键字的扩展语法差异
3. 启动文件配置  
   验证中断向量表是否正确定义了UART1VECTOR的入口地址

修正后的参考代码
  1. c
  2. include "config.h"             // 修正可能的头文件名称
  3. include             // 补充BOOL类型支持
  4. define U8 unsigned char        // 修正宏定义顺序
  5. U8 recDat[60];
  6. U8 recnum = 0;
  7. bool fPrintfBusy;               // 使用标准bool类型
  8. // 串口1中断服务程序(Keil C51语法)
  9. void UART1ISR(void) interrupt 4 using 1
  10. {
  11.     if (UART1CheckTxFlag())    // 判断串口发送中断
  12.     {
  13.         UART1ClearTxFlag();    // 清除中断标志
  14.         fPrintfBusy = false;    // 更新状态机
  15.     }
  16. }
复制代码

扩展排查建议
若修正上述问题后仍存在编译错误,建议通过以下方式进一步诊断:
1. 查看编译器报错信息  
   定位具体错误行号及描述(例如未定义符号、语法错误类型)
2. 最小化测试工程  
   剥离非核心代码,逐步验证基础功能模块
3. 数据手册对照  
   核对芯片手册中的中断向量号、寄存器操作函数命名
4. 工具链验证  
   创建空白工程测试编译环境是否正常

如需提供更精确的解决方案,请补充完整的错误日志及芯片型号信息。

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:170
  • 最近打卡:2025-05-09 07:56:57
已绑定手机

58

主题

1369

回帖

3056

积分

荣誉版主

无情的代码机器

积分
3056
发表于 3 天前 | 显示全部楼层
楼上分析了一些代码问题哦。建议上传完整工程及报错截图
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2025-05-09 08:02:13
已绑定手机

48

主题

1755

回帖

2750

积分

金牌会员

积分
2750
发表于 3 天前 | 显示全部楼层
看看你的编译错误在哪里
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-09 17:40:24
已绑定手机

9

主题

34

回帖

187

积分

注册会员

积分
187
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-5-7 20:37
楼上分析了一些代码问题哦。建议上传完整工程及报错截图

嗯嗯  我从新整理了一下 现在已经可以了 谢谢大家
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-05-09 17:40:24
已绑定手机

9

主题

34

回帖

187

积分

注册会员

积分
187
发表于 3 天前 | 显示全部楼层
jw*** 发表于 2025-5-7 20:52
看看你的编译错误在哪里

我重新整理了一遍  你们用自动生成代码那个AIcube 好用吗  谢谢
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-10 02:50 , Processed in 0.126564 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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