CC2530串口發送接收字串
實驗目的:利用串口除錯工具從PC端發送字串給CC2530,接收到完整的資料后D4燈切換狀態,并將資料發送回PC端,
涉及到的地方:串口通訊、燈的控制,
文章目錄
- CC2530串口發送接收字串
- 一、涉及到的暫存器
- PERCFG暫存器
- P0SEL暫存器
- U0BAUD暫存器
- U0GCR暫存器
- U0BUF暫存器
- U0CSR暫存器
- U0UCR暫存器
- IEN0暫存器
- 二、直接上代碼
- 三、代碼決議
- 串口接收中斷函式
- 四、設備玩法
- 設定串口除錯工具
- 設定接收區和發送區
- 輸入想發送的資料
一、涉及到的暫存器
PERCFG暫存器
用于選擇串口的引腳的位置,這里選擇UARST0備用位置1,RX:P0_2、TX:P0_3
UARST0備用位置2,RX:P1_4、TX:P1_5
UARST1備用位置1,RX:P1_5、TX:P1_4
UARST1備用位置2,RX:P1_7、TX:P1_6

P0SEL暫存器
設定串口為外設功能,否者無法使用串口,

U0BAUD暫存器
設定波特率小數部分的數值,必須和U0GCR一起使用,

可根據官方提供的常用波特率表來選擇對應的值,表放在最后,
U0GCR暫存器
設定波特率指數,必須和U0BAUD一起使用,

可根據官方提供的常用波特率表來選擇對應的值,表放在最后,
U0BUF暫存器
CC2530芯片會將接收和發送的資料全部存放到U0BUF暫存器中,所以只需對這個暫存器做發送資料和接收資料的操作即可,但ioCC2530.h的頭檔案中給U0BUF暫存器定義的名字為U0DBUF,所以在存取資料的時候要對U0DBUF操作,

U0CSR暫存器
設定USART的模式,和接收器使能,需要在UART完全初始化完之后在在對該暫存器操作,

U0UCR暫存器
清楚單元

IEN0暫存器
本代碼使用的串口方法是用接收到資料后產生中斷的方式來接收資料,所以需要對URX0IE中斷和EA總中斷是能,

二、直接上代碼
代碼如下(示例):
#include<iocc2530.h>
#define uint8_t unsigned char
#define uint32_t unsigned int
#define D4 P1_1
uint8_t UR0_Recv[32],URX_cnt=0;
void Init_Port() //初始化引腳
{
//D4燈初始化
P1SEL &= ~0x02;
P1DIR |= 0x02;
P1 &= ~0x02;
//使用外部晶振32Mhz
CLKCONCMD &= ~0x47;
while((CLKCONSTA & 0x40) == 0x40);
/*串口初始化
波特率:9600bps
單片機串口:USART0
資料位:8
校驗位:None
停止位:1
流 控:None
*/
PERCFG &= ~0x01; //設定USART0的I/O位置為備用位置1
P0SEL |= 0x0c; //對P0_2,P0_3設定為外設功能
U0BAUD = 59; //設定波特率為9600
U0GCR = 8;
U0UCR |= 0x80; //清空USART0單元
UTX0IF = 0; //清空USART0寫標志
URX0IF = 0; //清空USART0讀標志
URX0IE = 1; //USART0中斷使能
EA = 1; //總中斷使能
U0CSR |= 0xc0; //設定USART0為UART模式、開啟UART接收器使能
}
//串口發送位元組函式
void UR0_SendByte(uint8_t dat)
{
U0DBUF = dat;
while(!UTX0IF); //等待串口發送完畢
UTX0IF=0; //清楚中斷位
}
//串口發送字串函式
void UR0_SendString(uint8_t *str)
{
while(*str != '\0')
{
UR0_SendByte(*str++);
}
}
//串口接收中斷函式
#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR()
{
uint8_t dat;
dat = U0DBUF;
if(dat != '\0' || URX_cnt == 32-1)
{
UR0_Recv[URX_cnt++]=dat;
}
else
{
UR0_Recv[URX_cnt]=dat;
URX_cnt=0;
D4 = ~D4;
UR0_SendString(UR0_Recv);
}
}
void main()
{
Init_Port(); //初始化引腳
while(1)
{
;
}
}
三、代碼決議
串口接收中斷函式
#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR()
{
uint8_t dat;
dat = U0DBUF; //決議1
if(dat != '\0' || URX_cnt == 32-1)//決議2
{
UR0_Recv[URX_cnt++]=dat;
}
else
{ //決議3
UR0_Recv[URX_cnt]=dat;
URX_cnt=0;
D4 = ~D4;
UR0_SendString(UR0_Recv);
}
}
解釋1:把從串口發送過來的位元組存到dat變數里(注意這里只收到一個位元組的資料)
決議2:查看是否是字串‘\0’(字串以\0結尾),URX_cnt == 32-1 是判斷是否超出UR0_Recv的最大范圍,防止溢位,
決議3:說明已經字串結束,將資料發送回去,
四、設備玩法
設定串口除錯工具

設定接收區和發送區

輸入想發送的資料
輸入完資料后,再選中 發送設定–>HEX ,軟體會自動將字串轉換成ASCII碼

轉換后在ASCII碼后面加入00 后點發送,就完成了!!!

藍色的字為你發送的資料,綠色的字是從單片機上發送過來的資料,也支持漢字發送哦!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401471.html
標籤:其他
上一篇:【通信協議】一文搞懂SPI
