找回密码
 立即注册
查看: 189|回复: 6

串口问题 请假大哥

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-06-16 10:35:34
已绑定手机

12

主题

65

回帖

330

积分

中级会员

积分
330
发表于 2025-5-11 22:48:29 | 显示全部楼层 |阅读模式
  1. 发送数据给单片机没反应  
  2. #include "config.h"
  3. #include "uart.h"
  4. #define U8 unsigned char
  5. U8 rec_Dat[60];
  6. U8 rec_num = 0;
  7. //<<AICUBE_USER_INCLUDE_BEGIN>>
  8. // 在此添加用户头文件包含
  9. //<<AICUBE_USER_INCLUDE_END>>
  10. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  11. // 在此添加用户全局变量定义、用户宏定义以及函数声明
  12. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  13. ////////////////////////////////////////
  14. // 串口2中断服务程序
  15. // 入口参数: 无
  16. // 函数返回: 无
  17. ////////////////////////////////////////
  18. void UART2_ISR(void) interrupt UART2_VECTOR
  19. {
  20.     //<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>>
  21.     // 在此添加中断函数用户代码
  22.     if (UART2_CheckTxFlag())            //判断串口发送中断
  23.     {
  24.         UART2_ClearTxFlag();            //清除串口发送中断标志
  25.     }
  26.     if (UART2_CheckRxFlag())            //判断串口接收中断
  27.     {
  28.         UART2_ClearRxFlag();            //清除串口接收中断标志
  29.                 rec_Dat[rec_num++] = S2BUF;     //接收数据
  30.     }
  31.     //<<AICUBE_USER_UART2_ISR_CODE1_END>>
  32. }
  33. ////////////////////////////////////////
  34. // 串口2初始化函数
  35. // 入口参数: 无
  36. // 函数返回: 无
  37. ////////////////////////////////////////
  38. void UART2_Init(void)
  39. {
  40. #ifdef BAUDRATE
  41. #undef BAUDRATE
  42. #endif
  43. #define BAUDRATE        (9600)
  44. #define T2_RELOAD       (65536 - (SYSCLK / BAUDRATE + 2) / 4)
  45.     UART2_SwitchP4243();                //设置串口数据端口: RxD2 (P4.2), TxD2 (P4.3)
  46. //  UART2_Timer2BRT();                  //串口2固定选择定时器2作为波特率发生器
  47.     TIMER2_TimerMode();                 //设置定时器2为定时模式
  48.     TIMER2_1TMode();                    //设置定时器2为1T模式
  49.     TIMER2_SetPrescale(0);              //设置定时器2的8位预分频
  50.     TIMER2_SetReload16(T2_RELOAD);      //设置定时器2的16位重载值
  51.     TIMER2_Run();                       //定时器2开始运行
  52.     UART2_EnableRx();                   //使能串口2接收数据
  53.     UART2_Mode1();                      //设置串口2为模式1 (8位数据可变波特率)
  54.     UART2_SetIntPriority(0);            //设置中断为最低优先级
  55.     UART2_EnableInt();                  //使能串口2中断
  56.      rec_num = 0;
  57.      }
  58.      void Usart2_RunTask(void)
  59.      {
  60.          if(rec_num >= 6)
  61.      {
  62.          // 检测帧尾\r\n
  63.          if( (rec_Dat[rec_num - 1] == '\n') &&
  64.              (rec_Dat[rec_num - 2] == '\r') )
  65.          {
  66.              // 检测命令"OPEN" (假设起始位置偏移)
  67.              // 示例帧: [O][P][E][N][\r][\n]
  68.              if( (rec_Dat[rec_num - 6] == 'O') &&
  69.                  (rec_Dat[rec_num - 5] == 'P') &&
  70.                  (rec_Dat[rec_num - 4] == 'E') &&
  71.                  (rec_Dat[rec_num - 3] == 'N') )
  72.              {
  73.                 P20 = 0;                                  // 执行操作
  74.                      }
  75.                          rec_num = 0;  // 正确重置位置
  76.                  return;      // 退出避免重复处理
  77.              }
  78.          }
  79.          
  80.          // 未匹配时处理(可选部分保留)
  81.          // 根据协议可能需要清除无效数据
  82.          rec_num = 0;
  83.      }
复制代码


回复

使用道具 举报 送花

3

主题

717

回帖

145

积分

等待验证会员

积分
145
发表于 2025-5-11 22:53:00 | 显示全部楼层
针对您提供的串口通信问题,以下是系统化的分析与解决方案建议:

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

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

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

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

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

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

三、调试建议
1. 最小系统验证
编写基础回环测试代码,验证硬件通路:
  1. c
  2. void main() {
  3.     UART2Init();
  4.     EA = 1;
  5.     while(1) {
  6.         if(recnum > 0) {
  7.             UART2SendByte(recDat[0]); // 回传首字节
  8.             recnum = 0;
  9.         }
  10.     }
  11. }
复制代码

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

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-06-16 10:35:34
已绑定手机

12

主题

65

回帖

330

积分

中级会员

积分
330
发表于 2025-5-11 23:40:45 | 显示全部楼层

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

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

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

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:267
  • 最近打卡:2025-06-16 06:00:40

61

主题

830

回帖

1545

积分

金牌会员

积分
1545
发表于 2025-5-12 07:02:36 | 显示全部楼层
把错别字改了吧  兄弟
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1919

回帖

4309

积分

荣誉版主

无情的代码机器

积分
4309
发表于 2025-5-12 08:45:48 | 显示全部楼层

截图202505120845091371.jpg
测试通过的工程参考:
temp.zip (254.11 KB, 下载次数: 5)
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-06-16 10:35:34
已绑定手机

12

主题

65

回帖

330

积分

中级会员

积分
330
发表于 2025-5-12 11:11:41 | 显示全部楼层
zha*** 发表于 2025-5-12 07:02
把错别字改了吧  兄弟

没注意看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-06-16 10:35:34
已绑定手机

12

主题

65

回帖

330

积分

中级会员

积分
330
发表于 2025-5-12 11:11:58 | 显示全部楼层

谢谢提醒
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 18:11 , Processed in 0.160179 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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