一、承上啟下
在無線傳感網絡中,CC2430需要將采集到的數據發(fā)送給上位機(即PC)處理,同時上位機需要向CC2430發(fā)送控制信息。這一切都離不開兩者之間的信息傳遞。這一節(jié),我們就來學習如何實現(xiàn)PC機與CC2430之間的串口通信。
CC2430包括2個串行通信接口 USART0 與 USART1,每個串口包括兩個模式:UART(異步)模式、SPI(同步)模式,本節(jié)僅涉及UART模式)。
二、串口通信實驗
?。?)實驗簡介
實現(xiàn)開發(fā)板與PC機的通信:PC向CC2430發(fā)送某一字符串,CC2430收到后返回此此字符串給PC。
?。?)實驗準備
開始編寫代碼之前,需要搭建好硬件設施:正確連線 + 安裝USB轉串的驅動。
硬件連線需要兩條:
CC2430開發(fā)板的JTAG口 → 調試器 → PC的USB口(用于程序的調試、下載)
CC2430開發(fā)板的串口 → PC的USB口(用于PC與CC2430的數據通信)
然后需要安裝USB轉串口的驅動(下載地址)
為了向串口發(fā)送數據,還需要一個串口調試工具(下載地址)。
?。?)程序流程圖
?。?)實驗源碼及剖析
/*
實驗說明:UART0,波特率115200bps,PC機向CC2430送字符串(以@字符結束),CC2430收到后返回該字符串
*/
#include
unsigned char recv_buf[300] = {0};
unsigned char recv_count = 0;
/*系統(tǒng)時鐘初始化
-------------------------------------------------------*/
void xtal_init(void)
{
SLEEP &= ~0x04; //都上電
while(!(SLEEP & 0x40)); //晶體振蕩器開啟且穩(wěn)定
CLKCON &= ~0x47; //選擇32MHz 晶體振蕩器
SLEEP |= 0x04;
}
/*UART0通信初始化
-------------------------------------------------------*/
void Uart0Init(unsigned char StopBits,unsigned char Parity)
{
PERCFG&= ~0x01; //選擇UART0為可選位置一,即RXD接P0.2,TXD接P0.3
P0SEL |= 0x0C; //初始化UART0端口,設置P0.2與P0.3為外部設備IO口
U0CSR = 0xC0; //設置為UART模式,并使能接收器
U0GCR = 216;
U0BAUD = 11; //設置UART0波特率為115200bps,至于為何是216和11,可查閱CC2430中文手冊
U0UCR |= StopBits|Parity; //設置停止位與奇偶校驗
}
/*UART0發(fā)送數據
-------------------------------------------------------*/
void Uart0Send(unsigned char data)
{
while(U0CSR&0x01); //等待UART空閑時發(fā)送數據
U0DBUF = data;
}
/*UART0發(fā)送字符串
-------------------------------------------------------*/
void Uart0SendString(unsigned char *s)
{
while(*s != 0) //依次發(fā)送字符串s中的每個字符
Uart0Send(*s++);
}
/*UART0接受數據
-------------------------------------------------------*/
unsigned char Uart0Receive(void)
{
unsigned char data;
while(!(U0CSR&0x04)); //查詢是否收到數據,否則繼續(xù)等待
data=U0DBUF; //提取接收到的數據
return data;
}
/*主函數
-------------------------------------------------------*/
void main(void)
{
unsigned char i,b;
xtal_init();
Uart0Init(0x00,0x00); //初始化UART0,設置1個停止位,無奇偶校驗
Uart0SendString("Please Input string ended with '@'!\r\n");
recv_count = 0;
while(1)
{
while(1)
{
b = Uart0Receive();UART
if(b=='@')break; //若接收到'@',則跳出循環(huán),輸出字符串
recv_buf[recv_count] = b; //若不是'@',則繼續(xù)向字符數組recv_buf[]添加字符
recv_count++;
}
for(i=0; i
Uart0Send(recv_buf[i]);
Uart0SendString("\n");
recv_count =0; //重置
}
}