///***************************************************************************** //下面是test.c裏面的函數 ///***************************************************************************** //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //串口獵人用的程序 ////////// //值得說明的是,CRC協議一樣適用於串口獵人適用,也就是」協議」是通用的 //////// // USART1->DR=num; //////// //串口獵人只能發送hex值,即只能發送16進制的數據,才能顯示出波形 ///////// // while((USART1->SR&0X40)==0); //////// // delay_ms(500); //////// // num-=1; //////// // if(num==0x00) //////// // num=0xff; /////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //值得說明的是,CRC協議一樣適用於串口獵人適用,也就是」協議」是通用的 //////// //串口助手用的程序 //////// // printf("%d ",0XA5); //////// // printf("%d ",t); //////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Visualscope串口示波器的程序 //////// //////// for(i=0;i<4;i++)//先裝載數據 //////// { //////// OutData[i]= num; //////// num-=70; //////// } //////// num=0xff; //////// OutPut_Data();//調用主函數 //////// delay_ms(10);//定義發送頻率 //////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///***************************************************************************** //下面是USART.H裏面的函數 ///***************************************************************************** //串口示波器的變量 extern float OutData[4];//這是全局變量 unsigned short CRC_CHECK(unsigned short *Buf, unsigned short CRC_CNT); void voTxIsr(void); void OutPut_Data(); ///*****************************************************************************//下面的是USART.C裏面的文件 //這裏用到了串口接收數據中斷函數,因此須要把原先的數據串口中斷函數屏蔽了 ///***************************************************************************** //the following is MCU code for CRC16 ,please refer. //------------------------------------------------------------------------------------------- #define ULONG unsigned long #define RxCountMax 18 //float OutData[4]; 這個是全局變量,在main函數和USART.H中都有定義 unsigned short TxBuf[10]; unsigned short RxBuf[RxCountMax]; unsigned short RxCnt; unsigned short TxCnt; unsigned short Rx50msCnt; unsigned long pAddr1,pAddr2,pAddr3,pAddr4; //CRC16校驗算法 unsigned short CRC_CHECK(unsigned short *Buf, unsigned short CRC_CNT) { unsigned short CRC_Temp; unsigned char i,j; CRC_Temp = 0xffff; for (i=0;i<CRC_CNT; i++){ CRC_Temp ^= Buf[i]; for (j=0;j<8;j++) { if (CRC_Temp & 0x01) CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001; else CRC_Temp = CRC_Temp >> 1; } } return(CRC_Temp); } //Receive interrupt routine 串口接收中斷函數 void USART1_IRQHandler(void) { unsigned short i,CRC_RX,CRC_Tmp; RxBuf[RxCnt] = USART1->DR; //acquire data 接收數據 RxCnt++; if(RxCnt == RxCountMax) { CRC_Tmp = CRC_CHECK(RxBuf,16); //CRC Calculation 計算接收到的數據的CRC校驗值 CRC_RX = ((unsigned short)RxBuf[RxCountMax-1]<<8) + RxBuf[RxCountMax-2]; //接收的數據中的最後兩位就是CRC校驗值 if(CRC_Tmp == CRC_RX){ //比較兩個校驗值是否相同 LED0=~LED0; //這裏是我作的一個現象,通訊成功就亮/滅一下燈 pAddr1 = ((ULONG)(RxBuf[0x3])<<24)|((ULONG)(RxBuf[0x2])<<16)|((ULONG)(RxBuf[0x1])<<8)|RxBuf[0x0]; //而後把數據保存起來 pAddr2 = ((ULONG)(RxBuf[0x7])<<24)|((ULONG)(RxBuf[0x6])<<16)|((ULONG)(RxBuf[0x5])<<8)|RxBuf[0x4]; pAddr3 = ((ULONG)(RxBuf[0xB])<<24)|((ULONG)(RxBuf[0xA])<<16)|((ULONG)(RxBuf[0x9])<<8)|RxBuf[0x8]; pAddr4 = ((ULONG)(RxBuf[0xF])<<24)|((ULONG)(RxBuf[0xE])<<16)|((ULONG)(RxBuf[0xD])<<8)|RxBuf[0xC]; } RxCnt = 0; } Rx50msCnt = 0; //to add--Clear Receive Data Register Fll flag; // USART1->DR=res; // while((USART1->SR&0X40)==0);// } //Transfer interrupt routine 串口發送數據函數 void voTxIsr(void) { if(TxCnt <= 9) { USART1->DR = TxBuf[TxCnt]; //Clear Tx interrupt flag TxCnt++; if(TxCnt >= 10) { //send interrupt disable TxCnt=0; } } } //------------------------------------------------------------------------------------------- //Monitor routine Execute every T Period time 應用函數,在主函數中直接調用這個就能夠了 void OutPut_Data() { int temp[4] = {0}; unsigned int temp1[4] = {0}; unsigned short databuf[10] = {0}; unsigned char i; unsigned short CRC16 = 0; for(i=0;i<4;i++) { temp[i] = (u16)OutData[i]; //把要發送的數據傳過來 temp1[i] = (u16)temp[i]; //並複製一份數據,進行下面的處理 } for(i=0;i<4;i++) { databuf[i*2] = (u8)(temp1[i]%256); //高低位處理 databuf[i*2+1] = (u8)(temp1[i]/256); } CRC16 = CRC_CHECK(databuf,8); //計算要發送數據的CRC16校驗值 databuf[8] = CRC16%256; //並保存在databuf的8 9裏面 databuf[9] = CRC16/256; for(i=0;i<10;i++)//把數據和校驗位一塊兒發送出去 { // voTxIsr(); if(TxCnt <= 9) { USART1->DR = databuf[TxCnt];//發送數據給寄存器 while((USART1->SR&0X40)==0);//直到發送完成才結束髮送 TxCnt++; if(TxCnt >= 10) { TxCnt=0; //準備下次發送數據 } } } }