本帖最后由 jill0630 于 2015-4-13 14:03 编辑
求助:串口只能收到第一个数据,第二个怎么都收不到,查了中断与定时器也没有找到问题,希望大神来帮忙,主要程序如下:
void Comm_Init(void)////初始化串口
{
SCON = 0xD0; // 串口工作于9位可变波特率方式,
PCON &= 0x3F; //工作于非FE (帧错误检测)模式
ES = 1; //允许串口中断
AUXR =0X01; //禁止ALE信号
TMOD |= 0X20; //,定时器2 baudrate 发生器
PCON |= 0x80;//波特率加倍
TH1 = 0XFD;//115200;//0xDC 9600;
TR1 = 1;
ET2 = 1; //允许 timer2 中断
RCAP2L= TIMER_LOW;
RCAP2H= TIMER_HIGHT;
TR2 =1;//启动Timer 2
ReceveCount=0;
Frame_Len=0;
EA=1;
BL_Timer = BL_DELAY;
}
void commProc() interrupt 4 //发送接收中断
{
char a,b;
checkoutError = 0; //通讯校验错误位
if(TI) //发送中断标志,发送完置1
{
TI = 0;
if(sendPosi < SendCount)
{
sendPosi++;
ACC = SendData[sendPosi];
if(P==1) //A中1的个数为奇数
SCON|=0x08; //串口控制寄存器
else
SCON&=~0x08; //加上校验位
SBUF = SendData[sendPosi];
}
}
if(RI)
{
RI = 0;
Frame_timer = TIMEOUT;
ReceveData[ReceveCount] = SBUF;
ACC = ReceveData[ReceveCount];
a=SCON;
b=P;
if(((b==1)&&((a&0x04)==0x00))||((b==0)&&((a&0x04)==0x04)))
checkoutError = 2;
if(ReceveCount<79)
ReceveCount++
}
}
void Timer2_Proc() interrupt 5//定时器2中断服务程
{
TF2 =0; //T2的溢出标志位
if(Frame_timer>0)
{
if((--Frame_timer) == 0)
{
Frame_Len = ReceveCount; //帧的长度
ReceveCount = 0;
}
}
void main()
{
unsigned char temp[80]
EA=1; //Interurupt Enabled
RST_Port =0;
RST_Port =1;
Ini();
DisDotsA(0,0);//lcd clear
Comm_Init();
while (1)
{
uint va,vb,vc;
va=(uint)ReceveData[0];
vb=(uint)ReceveData[1];
vc=222;
sprintf(temp,"电压(V) Va=%03u Vb=%03u, Vc=%03u ",va,vb,vc);
DisGBStr(temp);//display in the screen
}
}
va,vb的数据是电脑从串口发送到单片机,再在lcd屏幕上显示,可是只有va是正确的,vb没有变化,如果连续发送,则与va相同,这是怎么回事,哪位大神指点下?
|