用LPC2368的 UART2 接的一个千分表 接口的接口协议:
4800波特率,1位起始位,8位数据位,1位停止位,无校验。 千分表的数据以ASCII码发送,每个测量数据结束后以回车符结束,不间断主动发送,频率是3次/秒。
数据没有帧头,测量数据的ASCII码有10个字节,即开头是正号或负号,然后是七个数字、一个小数点及回车符,发送的字节是固定的。 一帧数据结束后是“回车符”的ASCII码。
★问题是:程序调试时,能接到10个字节,可是有的时候接收的字节顺序乱了.
比如说,现在测量的数据是0.034mm, 正常的数据传过来,接收后应该是 2B(+), 30(0), 30(0), 30(0), 30(0), 30(0),2E(.),30(0),33(3),34(4),0D(回车) 但有时候,就会出现代表 "+"号的0X2B,就不是第1个字节,等次序乱的情况
注释:括号内是为方便大家看,写的每个字节代表的含义
程序代码如下:
//接收数据的中断部分
void UART2Handler (void) __irq { static INT8U i; if ((U2IIR & 0x0F) == 0x04) // 设置接收到新的数据标志 // { if(i<10) { rcvbuf2 = U2RBR; // 读取FIFO的数据,并清除中断 // i+=1; if(i==10) { rcv_new = 1; i=0; }//针对i=10; } } VICVectAddr = 0x00; // 中断处理结束 // }
//初始化部分,波特率设置为4800 INT32U UART2Init( INT32U baudrate ) { INT32U Fdiv; PCONP |= 0x01000000; PINSEL0 =(PINSEL0&0xff0fffff )|0x00500000; /* RxD2 and TxD2 */
U2LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ Fdiv = ( Fpclk / 16 ) / baudrate ; /*baud rate */ U2DLM = Fdiv / 256; U2DLL = Fdiv % 256; U2LCR = 0x03; /* DLAB = 0 */ U2FCR = 0x07; /* Enable and reset TX and RX FIFO. */ if ( install_irq( UART2_INT, (void *)UART2Handler, HIGHEST_PRIORITY+1 ) == FALSE ) { return (FALSE); } U2IER=0x01;//2008年5月8号,中断使能由用到采集千分表时开启 return (TRUE); }
|