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²âÊÔ
};
};
}
} 新人求指教!!! 1. 中断中少用 SendByte(chr);
2. 造成这种问题的可能性很多。 建议Debug 下, 立刻可以查出原因 在中断里一堆case、if的都是神人。 中断里面为什么用了SWITCH/CASE,还会有那么多RETURN呢? 也许换个姿势就正确了。有时候遇到的问题是编译器问题。这个只能看汇编找问题。 打赏!
庆祝论坛“打赏”功能实施, 现在开始发技术主题,可以获得打赏
https://www.amobbs.com/thread-5735948-1-1.html SendCommLenT为什么要加强转?你不是定义成u8 code数组吗? n0831 发表于 2020-7-15 11:36
也许换个姿势就正确了。有时候遇到的问题是编译器问题。这个只能看汇编找问题。 ...
不太懂汇编{:sweat:} 饭桶 发表于 2020-7-15 11:20
在中断里一堆case、if的都是神人。
有没有什么好办法呢? gonboy 发表于 2020-7-15 09:19
1. 中断中少用 SendByte(chr);
2. 造成这种问题的可能性很多。 建议Debug 下, 立刻可以查出原因 ...
debug时总是莫名其妙的断开 中断立标志后出去处理。 中断不要用using字段。
将程序简化,先调试好收发,再加入别的程序。
最好将串口收发做成底层,应用层处理数据。 小李非刀 发表于 2020-7-15 21:31
中断不要用using字段。
将程序简化,先调试好收发,再加入别的程序。
最好将串口收发做成底层,应用层处理 ...
恩,是的,去掉using 字段后就可以了!衷心的谢谢了!困扰了好久
页:
[1]