找回密码
 立即注册
查看: 1284|回复: 8

遇到一个串口2和串口1互相影响的问题【已解决】

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-12-14 11:04:05

4

主题

10

回帖

186

积分

注册会员

积分
186
发表于 2024-4-11 09:46:50 | 显示全部楼层 |阅读模式
本帖最后由 STCAI-32位8051 于 2024-4-12 14:36 编辑

我使用的单片机是STC8H1K08
内存编译后情况如下
Program Size: data=9.2 xdata=606 const=0 code=6498

我的代码基本功能就是接受串口2的数据,然后进行和校验,校验通过后通过串口1输出数据
代码如下


  1. u8 Co2Analysis(void)
  2. {
  3.   u8 i,check;
  4.   u16 CO2_PPM;
  5.       
  6.   if(COM2.RX_TimeOut > 0)                //超时计数
  7.   {
  8.     if(--COM2.RX_TimeOut == 0)
  9.     {
  10.       if(COM2.RX_Cnt > 0)
  11.       {
  12.          check = FunCheckSum(RX2_Buffer,9); //收到的数据进行校验
  13.          
  14.          
  15.          if(check == RX2_Buffer[8])//如果校验通过就通过串口1 输出数据
  16.          {
  17.             CO2_PPM = RX2_Buffer[4]*256+RX2_Buffer[5];
  18.             /**/
  19.             RS485_MODE_TX;
  20.             RX1_Buffer[0] = CO2_PPM>>8;
  21.             RX1_Buffer[1] = CO2_PPM&0xFF;
  22.             for(i=0; i<2; i++)      
  23.             {
  24.                     TX1_write2buff(RX1_Buffer[i]);        //使用串口1发送数据
  25.             }
  26.             delay_ms(100);
  27.             /**/
  28.          }
  29.          /**问题代码块**/
  30.                                 //使用串口2发送数据
  31. //      for(i=0; i<COM2.RX_Cnt; i++)        
  32. //      {        
  33. //          TX2_write2buff(RX2_Buffer[i]);        //收到的数据原样返回
  34. //     }
  35.         /**问题代码块**/        
  36.           }
  37.           COM2.RX_Cnt = 0;
  38.     }
  39.   }
  40.   return 0;
  41. }
复制代码

现在遇到的问题就是,
1、如果屏蔽掉问题代码块,那么串口1就不会有数据输出
2、如果不屏蔽问题代码块,即使进行和校验判断,那么串口1也会正常输出数据
3、如果屏蔽掉问题代码块,也屏蔽掉“if(check == RX2_Buffer[8])//如果校验通过就通过串口1 输出数据”,这个和校验判断,串口1也会正常输出数据
问题代码块也就是一个串口2的数据输出,似乎影响到了RX2_Buffer里面的数据,
现在搞不明白,请大家指导


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-05-27 09:25:30

20

主题

68

回帖

252

积分

等待验证会员

积分
252
发表于 2024-4-11 10:55:26 | 显示全部楼层
先调整一下代码:TXx_write2buff(RXx_Buffer);加一个下标TXx_write2buff(RXx_Buffer[i]);然后再调试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-12-14 11:04:05

4

主题

10

回帖

186

积分

注册会员

积分
186
发表于 2024-4-11 11:25:03 | 显示全部楼层
本帖最后由 Dwyer 于 2024-4-11 11:27 编辑
5533*** 发表于 2024-4-11 10:55
先调整一下代码:TXx_write2buff(RXx_Buffer);加一个下标TXx_write2buff(RXx_Buffer);然后再调试 ...

这个应该是有的
TX1_write2buff(RX1_Buffer);        //使用串口1发送数据
编辑状态下有,发送出来就没有了,应该是网站问题

我重新用代码的模块编辑了一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-07-01 09:57:15

31

主题

1214

回帖

2669

积分

超级版主

积分
2669
发表于 2024-4-11 13:11:00 | 显示全部楼层
本帖最后由 STCAI-32位8051 于 2024-4-11 13:13 编辑

用STC8H串口例程测试下


截图202404111310565662.jpg

STC8H系列-串口相关程序.rar

342.35 KB, 下载次数: 82

STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-12-14 11:04:05

4

主题

10

回帖

186

积分

注册会员

积分
186
发表于 2024-4-11 13:29:02 | 显示全部楼层
本帖最后由 Dwyer 于 2024-4-11 14:56 编辑
STCAI-32*** 发表于 2024-4-11 13:11
用STC8H串口例程测试下

版主你好,感谢回复,我用例程跑过,串口1和2全部正常,现在我是删除了一些其他功能的代码,只跑串口那部分,也不正常,我想请问代码量的多少会影响程序导致一些意外状况吗?目前我串口用的是库函数的那个例程去写的。
删减后的代码,编译大小是
Program Size: data=9.2 xdata=558 const=0 code=4141

更正一下,删减程序后还是不正常

点评

异常的情况就放慢速度,加几个nop  详情 回复 发表于 2024-4-11 14:22
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:193
  • 最近打卡:2025-06-28 08:36:03
已绑定手机

95

主题

990

回帖

2541

积分

超级版主

积分
2541
QQ
发表于 2024-4-11 14:22:31 | 显示全部楼层
Dwy*** 发表于 2024-4-11 13:29
版主你好,感谢回复,我用例程跑过,串口1和2全部正常,现在我是删除了一些其他功能的代码,只跑串口那部 ...

异常的情况就放慢速度,加几个nop
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-12-14 11:04:05

4

主题

10

回帖

186

积分

注册会员

积分
186
发表于 2024-4-11 14:49:28 | 显示全部楼层
国学*** 发表于 2024-4-11 14:22
异常的情况就放慢速度,加几个nop

nop 是要加在哪个地方?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-07-01 05:07:17
已绑定手机

17

主题

713

回帖

1399

积分

金牌会员

积分
1399
发表于 2024-4-11 16:24:21 | 显示全部楼层
仿真一下看看,应该是软件问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-12-14 11:04:05

4

主题

10

回帖

186

积分

注册会员

积分
186
发表于 2024-4-12 14:04:33 | 显示全部楼层
原因已经查明,是因为没有加延时,我再回头看官方的例程时发现在while(1)循环中有个1ms的延时,所以我在程序中加上这个延时就OK了,
但是我还是觉得官方的例程应该对这个1ms的延时要做一下解释,难道是因为数据没有发送完毕就执行了下一段程序导致了错误?
附上官方例程的代码
  1. void main(void)
  2. {
  3.         u8        i;
  4.         EAXSFR();                /* 扩展寄存器访问使能 */
  5.         GPIO_config();
  6.         UART_config();
  7.         EA = 1;
  8.         PrintString2("STC8 UART2 Test Programme!\r\n");        //UART2发送一个字符串
  9.         while (1)
  10.         {
  11.                 delay_ms(1);
  12.                 if(COM2.RX_TimeOut > 0)                //超时计数
  13.                 {
  14.                         if(--COM2.RX_TimeOut == 0)
  15.                         {
  16.                                 if(COM2.RX_Cnt > 0)
  17.                                 {
  18.                                         for(i=0; i<COM2.RX_Cnt; i++)        TX2_write2buff(RX2_Buffer[i]);        //收到的数据原样返回
  19.                                 }
  20.                                 COM2.RX_Cnt = 0;
  21.                         }
  22.                 }
  23.         }
  24. }
复制代码


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-1 19:37 , Processed in 0.122557 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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