CC2530串口發送接收字符串



CC2530串口發送接收字符串

實驗目的:利用串口調試工具從PC端發送字符串給CC2530,接收到完整的數據后D4燈切換狀態,並將數據發送回PC端。
涉及到的地方:串口通訊、燈的控制。


一、涉及到的寄存器

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
PERCFG--外設控制寄存器

P0SEL寄存器

設置串口為外設功能,否者無法使用串口。
P0SEL寄存器

U0BAUD寄存器

設置波特率小數部分的數值,必須和U0GCR一起使用。

U0BAUD寄存器
可根據官方提供的常用波特率表來選擇對應的值,表放在最后。

U0GCR寄存器

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

U0BUF寄存器

CC2530芯片會將接收和發送的數據全部存放到U0BUF寄存器中,所以只需對這個寄存器做發送數據和接收數據的操作即可。但ioCC2530.h的頭文件中給U0BUF寄存器定義的名字為U0DBUF,所以在存取數據的時候要對U0DBUF操作。
U0BUF寄存器

U0CSR寄存器

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

U0UCR寄存器

清楚單元
U0UCR寄存器

IEN0寄存器

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

二、直接上代碼

代碼如下(示例):

#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 后點發送,就完成了!!!
發送的ASCII數據
藍色的字為你發送的數據,綠色的字是從單片機上發送過來的數據,也支持漢字發送哦!!結果

本文轉自 link,如有侵權,請聯系刪除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM