/*******************************************************************************************<br />函数原形:void Uart1_Init_Rec(int pclk,int baud)<br />功能描述:当工作在接收模式下时,初始化UART1(485)<br />参 数:无 <br />*******************************************************************************************/<br />void Uart1_Init_Rec(int pclk,int baud)<br />{<br /> int i;<br /> if (pclk == 0)<br /> pclk = PCLK;<br /><br /> rUFCON1=0x0; //FIFO disable<br /> rUMCON1=0x0; //AFC disable<br /><br /> rULCON1=0x33; //8位数据,1位停止位,第9位(奇偶位)强制为1 <br /> rUCON1=0x105; //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling<br /> <br /> rUBRDIV1=( (int)(pclk/16./baud) -1 );//bps = 38400<br /> <br /> pISR_UART1=(unsigned)Uart1_RXInt_LT1200;<br /> rSRCPND=BIT_UART1;<br /> rINTPND=BIT_UART1;<br /> rSUBSRCPND=BIT_SUB_RXD1;//清除RXD1,ERR1中断挂起标志位<br /><br /> rINTMSK &=~(BIT_UART1); //去除UART中断屏蔽<br /> rINTSUBMSK &=~(BIT_SUB_RXD1);//去除子中断屏蔽<br /> for(i=0;i<100;i++);<br />}<br /><br />/*******************************************************************************************<br />函数原形:void __irq Uart0_RXInt_LT1200(void)<br />功能描述:LT1200 485接收中断处理程序<br />参 数:无 <br />*******************************************************************************************/<br />void __irq Uart1_RXInt_LT1200(void)<br />{<br /> char buffer[6]={2,4,0,0,0,0};<br /> unsigned short JoinNum,Value,i;<br /> if (((rUTRSTAT1&0x1)>0) && (rUERSTAT1==0))<br /> {<br /> ch=~rURXH1;<br /> if(_9bit==0)<br /> {//Parity Check as 0<br /> if(ch==0x00) //分隔符<br /> {//Next Command Start<br /> gState=0xfe;//ff:no active ,fe:active,fd:got id,00~f0:get how many receive buf<br /> }<br /> }<br /> else<br /> {<br /> if(gState==0xfe)<br /> {//接收的第一个字符<br /> gReceiveID=ch;<br /> if(ch==0xff)<br /> {//接收到复位指令(FF 02 03 00) 或查询网络型号指令(FF 02 03 01 ID 00)<br /> gState=0xfc;<br /> gReceiveLen=0;<br /> }<br /> else<br /> {//接收到ID,<br /> gState--;//gState = fd<br /> }<br /> }<br /> else if(gState==0xfd)//ID XX<br /> {<br /> if(ch==00)<br /> {//ID 00 主机空闲<br /> gState=0xfe;<br /> if(gReceiveID==h_config->NetID) //just search me to input<br /> {<br /> gMyTimeOut=0;<br /> gReceive00Time=0; //the pgm2 have searched me ,so I work properly.<br /> if(pSendHead!=pSendTail)<br /> {<br /> buffer[2]=(unsigned char)pSendHead->JoinNum;<br /> buffer[3]=(unsigned char)(pSendHead->JoinNum>>8);<br /> buffer[4]=(unsigned char)pSendHead->Value;<br /> buffer[5]=(unsigned char)(pSendHead->Value>>8);<br /> if(++pSendHead==(Sendbuf+50))pSendHead=Sendbuf;<br /> Send_485(buffer,6);<br /> }<br /> else Send_485("x2x0",2);<br /> }<br /> }<br /> else<br /> {//接收到信息,ID LEN<br /> gReceiveLen=ch;<br /> gState=0;<br /> }<br /> }<br /> else if(gState==0xfc)//接收到复位指令(FF 02 03 00) 或查询网络型号指令(FF 02 03 01 ID 00)<br /> {<br /> switch(gReceiveLen)<br /> {<br /> case 0:<br /> if(ch==0x02) gReceiveLen++;//FF 02<br /> else gState=0xff;//错误无效<br /> break;<br /> case 1:<br /> if(ch==0x03) gReceiveLen++;//FF 02 03<br /> else gState=0xff;<br /> break;<br /> case 2:<br /> if(ch==0x01) gReceiveLen++;//FF 02 03 01<br /> else if(ch==0x00) //FF 02 03 00 = 复位<br /> {<br /> // HardReset();//接收到主机的复位指令(FF 02 03 00)<br /> // Uart_Printf("
Receive = FF 02 03 00");<br /> // Uart_Printf("
Reset");<br /> } //reset<br /> else gState=0xff;<br /> break;<br /> case 3:<br /> gReceiveID=ch; //FF 02 03 01 ID<br /> gReceiveLen++;<br /> break;<br /> case 4:<br /> if(ch==00) //FF 02 03 01 ID 00<br /> {//查询网络型号指令(FF 02 03 01 ID 00) <br /> gMyTimeOut=0; <br /> gState=0xfe; //search net device<br /> if(gReceiveID==h_config->NetID)<br /> {<br /> // Delay(1);<br /> Send_485(SERIES,14);<br /> }<br /> }<br /> else gState=0xff;<br /> break;<br /> }<br /> }<br /> else if(gState!=0xff)//ID LEN Value<br /> {//接收到信息<br /> gMyTimeOut=0;//when geting long data ,ignore the time out.<br /> ReceiveBuffer[gState++]=ch;<br /> if(gReceiveLen==gState)<br /> {<br />// rULCON1=0x3b; //reset to get 00;//Parity forced as 0,Command end<br /> if(gReceiveID==h_config->NetID) //control me<br /> {<br /> gState=0xfe;<br /> JoinNum=ReceiveBuffer[1];<br /> JoinNum<<=8;<br /> JoinNum+=ReceiveBuffer[0];<br /> pTaskTail->JoinNum=JoinNum;<br /> if(JoinNum>1999)<br /> {<br /> Uart_SendByte(JoinNum);<br /> pTaskTail->Value=gReceiveLen-2;<br /> pTaskTail->pBuf=pStringBuf;<br /> for(i=0;i<gReceiveLen;i++)<br /> {<br /> *pStringBuf=ReceiveBuffer[i+2];<br /> if(++pStringBuf==(StringBuf+1024))pStringBuf=StringBuf;<br /> }<br /> }<br /> else if(JoinNum>999)<br /> {<br /> Value=ReceiveBuffer[3];<br /> Value<<=8;<br /> Value+=ReceiveBuffer[2];<br /> pTaskTail->Value=Value;<br /> }<br /> else<br /> {<br /> Uart_SendByte(JoinNum);<br /> if(ReceiveBuffer[2]==0x00)Value=1;<br /> else Value=0;<br /> pTaskTail->Value=Value;<br /> }<br /> if(++pTaskTail==(Taskbuf+50))pTaskTail=Taskbuf;<br />// TestVal[2] = executeevent.animatedTimer - TestVal[0];<br /> }<br /> }<br /> }<br /> }<br /> }<br /> rSRCPND=BIT_UART1;<br /> rINTPND=BIT_UART1;<br /> rSUBSRCPND=BIT_SUB_RXD1;//清除RXD1,ERR1中断挂起标志位<br />}
|