ena 发表于 2020-7-14 21:49:30

STC在实际调试过程中,实际传入的参数值和形参不一样

例如下面这个函数,在中断中使用时,传进来的值应为0x0f,而实际在运行过程中时,通过串口往外发时确实0x0e。试了下其他值也是0x0e.但这个函数在main函数中使用时是正常的。这会使什么原因?堆栈的问题吗,刚开始使用的时STC15W408AS,ram只有512Byte,刚开始以为时堆栈的问题,后面换了stc8F2K08S2,还是一样的效果{:sad:}


调用函数:
u8 SearchTable(u8 code *Table,u8 chr)       //²é±í³ÌÐò,²éÕÒ¶þά±íÖÐÓëÖ¸¶¨×Ö½Ú¶ÔÓ¦µÄ×Ö½ÚºóÒ»×Ö½Ú
{
        //chr=PcComDat.Rx_TxBuffer;
        SendByte(chr);
        while (1)
        {
                if ( * Table == NO_COMM )                                                //NO_COMM                        0xff                //²»´æÔÚµÄÃüÁî
                        return ( * Table );
                else
                        if ( * Table == chr )
                                return * ( Table + 1 );
                        else
                                Table += 2;
        };
}

中断函数:
void SerialSer(void) interrupt 4using 2        //´®¿ÚÖжÏ,¼Ä´æÆ÷×é2
{
        u8 temp1,temp;
        if (RI)
        {                        //½ÓÊÕÖжÏ
                RI = 0;
                ACC = SBUF;
                temp = ACC ;
                if ((P && RB8) || (!P && !RB8))        //УÑéλ
                {
                        if (ReceComplete)
                                return;
                        //SendByte(temp);
                        switch (HeadSt)
                        {
                                        case 0:
                                                if (temp == HEADER1)        //µÚÒ»¸öͬ²½Í·´¦Àí
                                                        HeadSt = 1;
                                                return;
                                                break;
                                        case 1:
                                                if(temp == HEADER1)        //µÚ¶þ¸öͬ²½Í·
                                                {
                                                        HeadSt = 2;
                                                        PcComDat.ReceLen = 0;
                                                        ReceComplete = 0;
                                                }
                                                else
                                                        HeadSt = 0;                          //µÚ¶þ¸öͬ²½Í·´íÎó
                                                return;
                                                break;
                                        case 2:
                                                if(temp==HEADER1)
                                                {
                                                        HeadSt = 3;
                                                        PcComDat.ReceLen = 0;
                                                        ReceComplete = 0;
                                                }
                                                return;
                                                break;
                                        case 3:
                                                temp1 = SearchTable( (u8 code * )SendCommLenT,0x0f);
                                                if (temp1 == NO_COMM)                               //ÃüÁî´í
                                                        InitS();
                                                else
                                                {
                                                        HeadSt = 4;
                                                        PcComDat.Rx_TxBuffer = temp;                                   //½ÓÊÕÃüÁî×Ö
                                                        PcComDat.ReceLen = 1;
                                                        ReceComplete = 0;
                                                };
                                                return;
                                                break;
                                        case 4:
                                                HeadSt = 5;
                                                PcComDat.Rx_TxBuffer = temp;                        //½ÓÊÕǹºÅ
                                                PcComDat.ReceLen++;
                                                ReceComplete = 0;
                                                return;
                                                break;
                                        case 5:
                                                PcComDat.Rx_TxBuffer = temp;                        //½ÓÊÕÊý¾Ý
                                                PcComDat.ReceLen++;
                                          //SendByte(PcComDat.Rx_TxBuffer);
                                                temp1 = SearchTable( (u8 code * )SendCommLenT,PcComDat.Rx_TxBuffer);
                                                //temp1 = SearchTable( (u8 code * )SendCommLenT,temp);
                                                //SendByte(temp1);
                                                //temp1 = SearchTable( (u8 code * )ReceCommLenT,PcComDat.Rx_TxBuffer);
                                          //NrfComDat.NrfSendLen=temp1+3;
                                                if ( ( temp1 == NO_COMM ) || ( temp1 < ( PcComDat.ReceLen - 3 ) ) )        //ÃüÁî´í»ò½ÓÊÕÊý¾Ý³¤¶È³¬³¤
                                                        InitS();
                                                else if ( temp1 == ( PcComDat.ReceLen - 3 ) )
                                                {
                                                          //SendByte(Current_Mode);
                                                                rectime=0;
                                                                ReceComplete = 1;
                                                                PcComDat.ReceLen = 0;
                                                                HeadSt = 0;
                                                }
                                                else
                                                                ReceComplete = 0;
                                                return;
                                                break;
                                        case 6:
                                                PcComDat.Rx_TxBuffer = temp;                        //½ÓÊÕÊý¾Ý
                                                PcComDat.ReceLen++;
                                                temp1 = SearchTable( (u8 code * )CerCommRecLenT,PcComDat.Rx_TxBuffer);
                                                if ( ( temp1 == NO_COMM ) || ( temp1 < ( PcComDat.ReceLen - 1 ) ) )        //ÃüÁî´í»ò½ÓÊÕÊý¾Ý³¤¶È³¬³¤
                                                        InitS();
                                                else if ( temp1 == ( PcComDat.ReceLen - 1 ) )
                                                {
                                                        rectime=0;
                                                        ReceComplete = 1;
                                                        PcComDat.ReceLen = 0;
                                                        HeadSt = 0;
                                                       
                                                }
                                                else
                                                        ReceComplete = 0;
                                                return;
                                                break;
                                        default:
                                                InitS();
                                                return;
                                                break;
                        }
                }                                                       
        }
        else                                //·¢ËÍÖжÏ
        {
                if(TI)
                {
                        TI = 0;
                        if ( SendLen >= PcComDat.SendStrLen )       
                        {
                                memset(PcComDat.Rx_TxBuffer,0,MAX_REC_LEN);
                                PcComDat.SendStrLen = 0;
                                SendLen = 0;
                        }
                        else
                        {
                                SendLen ++;
                                SendByte(PcComDat.Rx_TxBuffer);                //160625²âÊÔ
                        };
                };
        }
}

ena 发表于 2020-7-14 21:52:39

新人求指教!!!

gonboy 发表于 2020-7-15 09:19:03

1. 中断中少用 SendByte(chr);
2. 造成这种问题的可能性很多。 建议Debug 下, 立刻可以查出原因

饭桶 发表于 2020-7-15 11:20:11

在中断里一堆case、if的都是神人。

makesoft 发表于 2020-7-15 11:27:39

中断里面为什么用了SWITCH/CASE,还会有那么多RETURN呢?

n0831 发表于 2020-7-15 11:36:58

也许换个姿势就正确了。有时候遇到的问题是编译器问题。这个只能看汇编找问题。

armok. 发表于 2020-7-15 13:11:55

打赏!

庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html

lusson 发表于 2020-7-15 13:32:26

SendCommLenT为什么要加强转?你不是定义成u8 code数组吗?

ena 发表于 2020-7-15 19:10:09

n0831 发表于 2020-7-15 11:36
也许换个姿势就正确了。有时候遇到的问题是编译器问题。这个只能看汇编找问题。 ...

不太懂汇编{:sweat:}

ena 发表于 2020-7-15 19:10:36

饭桶 发表于 2020-7-15 11:20
在中断里一堆case、if的都是神人。

有没有什么好办法呢?

ena 发表于 2020-7-15 19:11:11

gonboy 发表于 2020-7-15 09:19
1. 中断中少用 SendByte(chr);
2. 造成这种问题的可能性很多。 建议Debug 下, 立刻可以查出原因 ...

debug时总是莫名其妙的断开

饭桶 发表于 2020-7-15 19:19:44

中断立标志后出去处理。

小李非刀 发表于 2020-7-15 21:31:48

中断不要用using字段。
将程序简化,先调试好收发,再加入别的程序。
最好将串口收发做成底层,应用层处理数据。

ena 发表于 2020-7-15 22:47:18

小李非刀 发表于 2020-7-15 21:31
中断不要用using字段。
将程序简化,先调试好收发,再加入别的程序。
最好将串口收发做成底层,应用层处理 ...

恩,是的,去掉using 字段后就可以了!衷心的谢谢了!困扰了好久
页: [1]
查看完整版本: STC在实际调试过程中,实际传入的参数值和形参不一样