Dwyer 发表于 2024-4-11 09:46:50

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

本帖最后由 STCAI-32位8051 于 2024-4-12 14:36 编辑

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

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


u8 Co2Analysis(void)
{
u8 i,check;
u16 CO2_PPM;
      
if(COM2.RX_TimeOut > 0)                //超时计数
{
    if(--COM2.RX_TimeOut == 0)
    {
      if(COM2.RX_Cnt > 0)
      {
         check = FunCheckSum(RX2_Buffer,9); //收到的数据进行校验
         
         
         if(check == RX2_Buffer)//如果校验通过就通过串口1 输出数据
         {
            CO2_PPM = RX2_Buffer*256+RX2_Buffer;
            /**/
            RS485_MODE_TX;
            RX1_Buffer = CO2_PPM>>8;
            RX1_Buffer = CO2_PPM&0xFF;
            for(i=0; i<2; i++)      
            {
                  TX1_write2buff(RX1_Buffer);      //使用串口1发送数据
            }
            delay_ms(100);
            /**/
         }
         /**问题代码块**/
                              //使用串口2发送数据
//      for(i=0; i<COM2.RX_Cnt; i++)      
//      {      
//          TX2_write2buff(RX2_Buffer);      //收到的数据原样返回
//   }
      /**问题代码块**/      
          }
          COM2.RX_Cnt = 0;
    }
}
return 0;
}
现在遇到的问题就是,
1、如果屏蔽掉问题代码块,那么串口1就不会有数据输出
2、如果不屏蔽问题代码块,即使进行和校验判断,那么串口1也会正常输出数据
3、如果屏蔽掉问题代码块,也屏蔽掉“if(check == RX2_Buffer)//如果校验通过就通过串口1 输出数据”,这个和校验判断,串口1也会正常输出数据
问题代码块也就是一个串口2的数据输出,似乎影响到了RX2_Buffer里面的数据,
现在搞不明白,请大家指导


55337575 发表于 2024-4-11 10:55:26

先调整一下代码:TXx_write2buff(RXx_Buffer);加一个下标TXx_write2buff(RXx_Buffer);然后再调试

Dwyer 发表于 2024-4-11 11:25:03

本帖最后由 Dwyer 于 2024-4-11 11:27 编辑

55337575 发表于 2024-4-11 10:55
先调整一下代码:TXx_write2buff(RXx_Buffer);加一个下标TXx_write2buff(RXx_Buffer);然后再调试 ...
这个应该是有的
TX1_write2buff(RX1_Buffer);      //使用串口1发送数据
编辑状态下有,发送出来就没有了,应该是网站问题

我重新用代码的模块编辑了一下

AI-32位8051 发表于 2024-4-11 13:11:00

本帖最后由 STCAI-32位8051 于 2024-4-11 13:13 编辑

用STC8H串口例程测试下


Dwyer 发表于 2024-4-11 13:29:02

本帖最后由 Dwyer 于 2024-4-11 14:56 编辑

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

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

国学芯用 发表于 2024-4-11 14:22:31

Dwyer 发表于 2024-4-11 13:29
版主你好,感谢回复,我用例程跑过,串口1和2全部正常,现在我是删除了一些其他功能的代码,只跑串口那部 ...

异常的情况就放慢速度,加几个nop

Dwyer 发表于 2024-4-11 14:49:28

国学芯用 发表于 2024-4-11 14:22
异常的情况就放慢速度,加几个nop

nop 是要加在哪个地方?

小飞侠 发表于 2024-4-11 16:24:21

仿真一下看看,应该是软件问题

Dwyer 发表于 2024-4-12 14:04:33

原因已经查明,是因为没有加延时,我再回头看官方的例程时发现在while(1)循环中有个1ms的延时,所以我在程序中加上这个延时就OK了,
但是我还是觉得官方的例程应该对这个1ms的延时要做一下解释,难道是因为数据没有发送完毕就执行了下一段程序导致了错误?
附上官方例程的代码
void main(void)
{
        u8        i;

        EAXSFR();                /* 扩展寄存器访问使能 */
        GPIO_config();
        UART_config();
        EA = 1;

        PrintString2("STC8 UART2 Test Programme!\r\n");        //UART2发送一个字符串

        while (1)
        {
                delay_ms(1);
                if(COM2.RX_TimeOut > 0)                //超时计数
                {
                        if(--COM2.RX_TimeOut == 0)
                        {
                                if(COM2.RX_Cnt > 0)
                                {
                                        for(i=0; i<COM2.RX_Cnt; i++)        TX2_write2buff(RX2_Buffer);        //收到的数据原样返回
                                }
                                COM2.RX_Cnt = 0;
                        }
                }
        }
}


页: [1]
查看完整版本: 遇到一个串口2和串口1互相影响的问题【已解决】