|
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例2.9.10)))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html
‘
關于本程序的詳細解說大家可以下載電子書點擊上圖即可
原書一共有2個程序
程序1發送:
程序2接受:
- #include <msp430x42x.h>
- #define RXBUF_SIZE 32 /*接收FIFO的最大容量*/
- unsigned char RX_BUFF[RXBUF_SIZE]; /*接收FIFO緩沖區數組*/
- unsigned int UART_InpLen=0; /*接收FIFO內待讀取的字節數*/
- unsigned int RX_IndexR=0; /*接收FIFO的讀指針*/
- unsigned int RX_IndexW=0; /*接收FIFO的寫指針*/
- /*****************************************************************
- * 名 稱:UART0_GetChar()
- * 功 能:從串口讀取1字節數據(從緩沖隊列內讀取1字節已接收的數據)
- * 入口參數:*Chr:讀取數據所存放的地址指針
- * 出口參數:返回1表示讀取成功,返回0表示讀取失敗。
- * 說 明: 讀取過程中,不阻塞CPU運行
- *****************************************************************/
- char UART0_GetChar(unsigned char *Chr)
- {
- if(UART_InpLen==0) return(0); // 如果FIFO內無數據,返回0
- _DINT(); // 涉及FIFO操作時不允許中斷,以免指針錯亂
- UART_InpLen--; // 待讀取數據字節數減1
- *Chr=RX_BUFF[RX_IndexR]; // 從尾指針讀取一個字節作為返回值
- if (++RX_IndexR >= RXBUF_SIZE) // 讀指針遞增,且判斷是否下標越界
- {
- RX_IndexR = 0; // 如果越界則寫指針歸零(循環隊列)
- }
- _EINT(); // FIFO操作完畢,恢復中斷允許
- return (1); // 返回發送成功標志
- }
- /*****************************************************************
- * 名 稱:UART0_GetCharsInRxBuf()
- * 功 能:獲取FIFO內已接收的數據字節數
- * 入口參數:無
- * 出口參數:待讀取的字節數
- *****************************************************************/
- unsigned int UART0_GetCharsInRxBuf()
- {
- return (UART_InpLen); // 返回FIFO內數據的字節數
- }
- /*****************************************************************
- * 名 稱:UART0_ClrRxBuf()
- * 功 能:清除接收FIFO區
- * 入口參數:無
- * 出口參數:無
- *****************************************************************/
- void UART0_ClrRxBuf()
- {
- _DINT(); // 涉及FIFO操作時不允許中斷,以免指針錯亂
- UART_InpLen=0; // 接收的數據清空
- RX_IndexR=0;
- RX_IndexW=0; // 頭尾指針復位
- _EINT();
- }
- #pragma vector=UART0RX_VECTOR
- __interrupt void UART0_RX (void) // 串口接收中斷
- {
- UART_InpLen++; // 接收字節計數加1
- RX_BUFF[RX_IndexW] =U0RXBUF; // 串口接收數據通過寫指針寫入FIFO
- if (++RX_IndexW >= RXBUF_SIZE) // 寫指針遞增,且判斷是否下標越界
- {
- RX_IndexW = 0; // 如果越界則寫指針歸零(循環隊列)
- }
- }
- void main( void )
- {
- unsigned char RxDataBuff[8];
- unsigned char Addr;
- unsigned char Func;
- int i;
- WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
- FLL_CTL0 |= XCAP18PF; // 配置晶振負載電容
- U0CTL = CHAR; // 異步通訊模式,8位數據,無校驗,1位停止位。
- ME1 |= UTXE0 + URXE0; // 開啟串口0收發模塊
- U0TCTL |= SSEL0; // 選擇ACLK作為串口波特率時鐘源。
- U0BR1 = 0; //
- U0BR0 = 13; // 分頻系數整數部分=13
- U0MCTL = 0x6B; // 分頻系數小數部分調制=5/8。(2400bps)
- P2SEL |= BIT4 + BIT5; // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
- IE1 |= URXIE0; // 開啟UART0的接收中斷,在中斷內接收數據
- _EINT(); // 總中斷允許
- while(1)
- {
- __delay_cycles(1000000);//模擬一個長耗時的程序,使CPU暫時不能讀取串口
- if(UART0_GetCharsInRxBuf()>=10) //每收到10字節數據
- {
- UART0_GetChar(&Addr); //讀取第1字節
- UART0_GetChar(&Func); //讀取第2字節
- for(i=0;i<8;i++) UART0_GetChar(RxDataBuff+i); //依次讀取后8字節
- }
- }
- }
復制代碼
|
|