小熊熊 发表于 2025-5-11 22:48:29

串口问题 请假大哥

发送数据给单片机没反应
#include "config.h"
#include "uart.h"
#define U8 unsigned char
U8 rec_Dat;
U8 rec_num = 0;

//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>


//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>



////////////////////////////////////////
// 串口2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_ISR(void) interrupt UART2_VECTOR
{
    //<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
    if (UART2_CheckTxFlag())            //判断串口发送中断
    {
      UART2_ClearTxFlag();            //清除串口发送中断标志
    }

    if (UART2_CheckRxFlag())            //判断串口接收中断
    {
      UART2_ClearRxFlag();            //清除串口接收中断标志
                rec_Dat = S2BUF;   //接收数据
    }
    //<<AICUBE_USER_UART2_ISR_CODE1_END>>
}

////////////////////////////////////////
// 串口2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_Init(void)
{
#ifdef BAUDRATE
#undef BAUDRATE
#endif
#define BAUDRATE      (9600)
#define T2_RELOAD       (65536 - (SYSCLK / BAUDRATE + 2) / 4)

    UART2_SwitchP4243();                //设置串口数据端口: RxD2 (P4.2), TxD2 (P4.3)

//UART2_Timer2BRT();                  //串口2固定选择定时器2作为波特率发生器
    TIMER2_TimerMode();               //设置定时器2为定时模式
    TIMER2_1TMode();                  //设置定时器2为1T模式
    TIMER2_SetPrescale(0);            //设置定时器2的8位预分频
    TIMER2_SetReload16(T2_RELOAD);      //设置定时器2的16位重载值
    TIMER2_Run();                     //定时器2开始运行

    UART2_EnableRx();                   //使能串口2接收数据
    UART2_Mode1();                      //设置串口2为模式1 (8位数据可变波特率)
    UART2_SetIntPriority(0);            //设置中断为最低优先级
    UART2_EnableInt();                  //使能串口2中断
   rec_num = 0;
   }
   void Usart2_RunTask(void)
   {
         if(rec_num >= 6)
   {
         // 检测帧尾\r\n
         if( (rec_Dat == '\n') &&
             (rec_Dat == '\r') )
         {
             // 检测命令"OPEN" (假设起始位置偏移)
             // 示例帧: [\r][\n]
             if( (rec_Dat == 'O') &&
               (rec_Dat == 'P') &&
               (rec_Dat == 'E') &&
               (rec_Dat == 'N') )
             {
                P20 = 0;                                // 执行操作
                     }
                       rec_num = 0;// 正确重置位置
               return;      // 退出避免重复处理
             }
         }
         
         // 未匹配时处理(可选部分保留)
         // 根据协议可能需要清除无效数据
         rec_num = 0;
   }


国芯人工智能 发表于 2025-5-11 22:53:00

针对您提供的串口通信问题,以下是系统化的分析与解决方案建议:

一、代码问题分析
1. 中断服务程序缺陷
接收中断中缺少缓冲区溢出保护机制,当接收数据量超过recDat容量时会导致内存越界:
c
if (UART2CheckRxFlag())
{
    UART2ClearRxFlag();
    if (recnum < sizeof(recDat)) { // 添加溢出保护
      recDat = S2BUF;
    }
}

2. 发送逻辑缺失
当前代码仅处理了发送中断标志的清除,未实现数据发送逻辑:
未启用发送缓冲区空中断(通常为TI标志)
主程序中缺少主动调用发送函数的代码(如UART2SendByte())

3. 全局中断未开启
若未在主函数初始化阶段启用全局中断,所有中断服务程序均无法触发:
c
EA = 1; // 需在main()初始化代码中添加

二、硬件配置排查
1. 引脚复用配置
确认UART2对应的GPIO引脚已设置为复用功能模式。例如:
P1.0作为TXD2需配置为推挽输出
P1.1作为RXD2需配置为高阻输入

2. 波特率误差校验
检查波特率计算是否符合系统时钟频率。假设主频为12MHz,9600波特率的典型配置为:
波特率重载值 = 256 - (Fosc / (波特率3212))
         = 256 - 12,000,000/(9600384) ≈ 253 (0xFD)
需核对UART2InitConfig()函数参数是否匹配实际时钟。

3. 电平转换电路
确认RS232/TTL电平转换芯片(如MAX3232)工作正常,建议:
测量TXD引脚电压:空闲时应为高电平(3.3V或5V)
使用示波器捕捉发送波形,验证数据格式

三、调试建议
1. 最小系统验证
编写基础回环测试代码,验证硬件通路:
c
void main() {
    UART2Init();
    EA = 1;
    while(1) {
      if(recnum > 0) {
            UART2SendByte(recDat); // 回传首字节
            recnum = 0;
      }
    }
}

2. 状态寄存器监控
通过调试器读取关键寄存器值:
SCON2:确认SM0/SM1模式位
T2CON:检查波特率发生器使能位
IE/IP:中断优先级配置

3. 协议分析仪抓包
使用逻辑分析仪或专用串口工具,捕获物理层信号:
检查起始位、数据位、停止位完整性
验证波特率实际值与理论值误差(应

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

小熊熊 发表于 2025-5-11 23:40:45


3
主题       
1098
回帖       
907
积分
等待验证会员
积分907
沙发
发表于 半小时前 | 只看该作者
针对您提供的串口通信问题,以下是系统化的分析与解决方案建议:

一、代码问题分析
1. 中断服务程序缺陷
接收中断中缺少缓冲区溢出保护机制,当接收数据量超过recDat容量时会导致内存越界:
c
if (UART2CheckRxFlag())
{
    UART2ClearRxFlag();
    if (recnum < sizeof(recDat)) { // 添加溢出保护
        recDat = S2BUF;
    }
}
复制代码

2. 发送逻辑缺失
当前代码仅处理了发送中断标志的清除,未实现数据发送逻辑:
未启用发送缓冲区空中断(通常为TI标志)
主程序中缺少主动调用发送函数的代码(如UART2SendByte())

3. 全局中断未开启
若未在主函数初始化阶段启用全局中断,所有中断服务程序均无法触发:
c
EA = 1; // 需在main()初始化代码中添加
复制代码

二、硬件配置排查
1. 引脚复用配置
确认UART2对应的GPIO引脚已设置为复用功能模式。例如:
P1.0作为TXD2需配置为推挽输出
P1.1作为RXD2需配置为高阻输入需要这样配置吗

zhange 发表于 2025-5-12 07:02:36

把错别字改了吧{:4_168:}{:4_168:}兄弟

ercircle 发表于 2025-5-12 08:45:48



测试通过的工程参考:

小熊熊 发表于 2025-5-12 11:11:41

zhange 发表于 2025-5-12 07:02
把错别字改了吧兄弟

没注意看{:ciya:}

小熊熊 发表于 2025-5-12 11:11:58

小熊熊 发表于 2025-5-12 11:11
没注意看

谢谢提醒
页: [1]
查看完整版本: 串口问题 请假大哥