/*------------------------------------------------------------------------<br /> GPS串口2接收中断服务程序(接收GPS数据)<br />菜农HotPower之PIC24菜鸟毕业留念 2007.12.20 2:40 于菜地留念 <br />-------------------------------------------------------------------------*/<br />void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt( void )<br />{<br />static unsigned char cData = 0, cPosition;<br />unsigned char ch;<br /> if (IFS1bits.U2RXIF)//确实是GPS串口2接收中断<br /> {<br /> if (IEC1bits.U2RXIE)//GPS串口2接收中断已被允许<br /> {<br /> ch = U2RXREG;//读取串口GPS数据<br /> if (ch == '$')//是GPS引导字符<br /> {<br /> cData = ch;//记录引导字符<br /> cPosition = GPSRxWriteCount;//引导字符位置记录<br /> GPSRxBuffers[GPSRxWriteCount ++] = ch;//存入数据<br /> }<br /> else if (cData == '$')//收到引导字符 <br /> { <br /> if (ch >= ' ')//可能是有效数据<br /> {<br /> GPSRxBuffers[GPSRxWriteCount ++] = ch;//存入数据<br /> }<br /> else if (ch == '*')//GPS校验引导字符<br /> {<br /> GPSRxBuffers[GPSRxWriteCount ++] = ch;//存入数据<br /> }<br /> else if ((ch == '\r') && (GPSRxBuffers[GPSRxWriteCount - 3] == '*'))//回车字符校验<br /> {<br /> GPSRxBuffers[GPSRxWriteCount ++] = ch;//存入数据<br /> }<br /> else<br /> { <br /> if ((ch == '\n') && (GPSRxBuffers[GPSRxWriteCount - 1] == '\r'))//换行字符校验<br /> {//只取GPRMC语句<br /> if (GPSGPRMCTest((char *)&GPSRxBuffers[cPosition + 1]))<br /> {<br /> GPSRxBuffers[GPSRxWriteCount ++] = ch;//存入数据<br /> GPSbits.RXFlag = 1;//激活GPS接收成功解码程序(在“零耗时键盘OS”的空闲任务内细加工处理)<br /> }<br /> }<br /> cData = 0;//结束或出错<br /> }<br /> }<br /> else<br /> {<br /> cData = 0;//出错 <br /> }<br /> }<br /> }<br /> IFS1bits.U2RXIF = 0;//清除RX2中断标志<br />}<br /><br /><br />/*------------------------------------------------------------------------<br /> GPS串口2初始化程序<br />-------------------------------------------------------------------------*/<br />void Uart2Init(void)<br />{<br /> TRIS_TX2 = PORTOUTMODE;//设置TX2为输出IO<br /> TRIS_RX2 = PORTINPUTMODE;//设置RX2为输入IO<br /> U2MODE = 0;<br />// U2MODEbits.STSEL = 0;// 1-stop bit<br />// U2MODEbits.PDSEL = 0;// No Parity, 8-data bits<br />// U2MODEbits.ABAUD = 0;// Autobaud Disabled<br /> U2STA = 0;<br />// U2STAbits.UTXISEL0 = 0; // Interrupt after one Tx character is transmitted<br />// U2STAbits.UTXISEL1 = 0; <br />// U2STAbits.URXISEL = 3; // Interrupt after one RX character is received<br /> U2BRG = BRGVAL2;//BAUD Rate Setting for 19200<br /> U2MODEbits.WAKE = 1;//启动位时唤醒使能位<br /> U2MODEbits.UARTEN = 1; // Enable UART<br /> U2STAbits.UTXEN = 1; // Enable UART Tx<br />/*------------------------------------------------------------------------<br /> 定义GPS串口2中断优先级位1111)<br />-------------------------------------------------------------------------*/<br /> IPC7bits.U2RXIP0 = 1;<br /> IPC7bits.U2RXIP1 = 1;<br /> IPC7bits.U2RXIP2 = 1;<br /> IEC1bits.U2RXIE = 1;<br /> IFS1bits.U2RXIF = 0;//清除RX1中断标志<br /> IEC1bits.U2TXIE = 1;<br /> IFS1bits.U2TXIF = 0;//清除TX1中断标志<br />}<br /> |
|