CC2530:串口通讯

串口通讯:发送字符串

#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int  uint;
#define TX_SIZE    20

#define TX_STRING  "Hello Zigbee  "

char TxData[TX_SIZE];        //存储发送字符串

void DelayMS(uint msec)
{  
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<1070; j++);
}

void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART O 的 IO 位置:0 为 PO 口位置 1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0XC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
}

void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}


void main(void)
{	
    CLKCONCMD &= ~0x40;               //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);          //等待晶振稳定为32M
    CLKCONCMD &= ~0x47;               //设置系统主时钟频率为 32MHZ   
      
    InitUart();                       //调置串口相关寄存器
    memset(TxData, 0, TX_SIZE);       //数据清0
    memcpy(TxData, TX_STRING, sizeof(TX_STRING)); //复制发送字符串到 TxData
        
    while(1)
    {
        UartSendString(TxData, sizeof(TX_STRING)); //串口发送数据
        DelayMS(1000);                 //延时 1秒
    }
}

UartSendString

功能: 串口发送函数

入口参数: Data:发送缓冲区,len:发送长度

串口通讯:收发字符串

#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define UART0_RX    1
#define UART0_TX    2
#define SIZE       51

char RxBuf;
char UartState;
uchar count;
char RxData[SIZE];        //存储发送字符串


void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<1070; j++);
}


void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0
    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收
    IEN0 |= 0x84;            //开总中断允许接收中断 
}

void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}

#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 
{ 
    URX0IF = 0;      
    RxBuf = U0DBUF;                           
}


void main(void)
{	
    CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                   //等待晶振稳定为 32M
    CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为 32MHZ   
   
    InitUart();                                //调用串口初始化函数   
    UartState = UART0_RX;                      //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
        if(UartState == UART0_RX)              //接收状态
        { 
            if(RxBuf != 0) 
            {                 
                if((RxBuf != '#')&&(count < 50))//以’#’为结束符,一次最多接收 50 个字符          
                    RxData[count++] = RxBuf; 
                else
                {
                    if(count >= 50)             //判断数据合法性,防止溢出
                    {
                        count = 0;              //计数清0
                        memset(RxData, 0, SIZE);//清空接收缓冲区
                    }
                    else
                        UartState = UART0_TX;  //进入发送状态
                }
                RxBuf  = 0;
            }
        }
        
        if(UartState == UART0_TX)              //发送状态
        {                         
            U0CSR &= ~0x40;                    //禁止接收
            UartSendString(RxData, count);     //发送已记录的字符串
            U0CSR |= 0x40;                     //允许接收 
            UartState = UART0_RX;              //恢复到接收状态 
            count = 0;                         //计数清0
            memset(RxData, 0, SIZE);           //清空接收缓冲区
        }    
    }
}

串口通讯:串口控制LED

#include <ioCC2530.h>
#include <string.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define UART0_RX    1
#define UART0_TX    2
#define CONTROL_LED 3
#define SIZE        4
#define ON          0
#define OFF         1
#define LED1        P1_0   //定义 P1.0 口为 LED1 控制端
#define LED2        P1_1   //定义 P1.1 口为 LED2 控制端

char RxBuf;
char UartState;
uchar count;
char RxData[SIZE];         //储存发送字符串


void DelayMS(uint msec)
{ 
    uint i,j;
    
    for (i=0; i<msec; i++)
        for (j=0; j<1070; j++);
}


void InitLed(void)
{
    P1DIR |= 0x03;               //P1.0 和 P1.1 定义为输出口
}


void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0位置1 
    P0SEL = 0x0c;            //P0_2,P0_3用作串口 (外设功能)
    P2DIR &= ~0xC0;          //P0优先作为 UART0
    
    U0CSR |= 0x80;           //设置为UART 方式
    U0GCR |= 11;				       
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位 0
    U0CSR |= 0x40;           //允许接收
    IEN0 |= 0x84;            //开总中断允许接收中断 
}


void UartSendString(char *Data, int len)
{
    uint i;
    
    for(i=0; i<len; i++)
    {
        U0DBUF = *Data++;
        while(UTX0IF == 0);
        UTX0IF = 0;
    }
}


#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 
{ 
    URX0IF = 0;      
    RxBuf = U0DBUF;                           
}


void main(void)
{	
    CLKCONCMD &= ~0x40;                        
    while(CLKCONSTA & 0x40);                   
    CLKCONCMD &= ~0x47;                        
    
    InitLed();                                 
    InitUart();                                 
    UartState = UART0_RX;                     //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
        if(UartState == UART0_RX)              
        { 
            if(RxBuf != 0) 
            {                 
                if((RxBuf != '#')&&(count < 3))       
                    RxData[count++] = RxBuf; 
                else
                {
                    if(count >= 3)             
                    {
                        count = 0;              
                        memset(RxData, 0, SIZE);
                    }
                    else
                        UartState = CONTROL_LED;
                }
                RxBuf  = 0;
            }
        }
        
        if(UartState == CONTROL_LED)           
        {
            //判断接收的数据合法性
            if((RxData[0]=='d'||RxData[0]=='D')&&(RxData[1]=='1'||RxData[1]=='2'))
            {
                if(RxData[1]=='1')
                    LED1 = ~LED1;              //低电平点亮
                else
                    LED2 = ~LED2;
            }
            else if((RxData[0]=='a'||RxData[0]=='A')&&(RxData[1]=='0'||RxData[1]=='1'))
            {
                if(RxData[1]=='0')
                {
                    LED1 = ON;
                    LED2 = ON;
                }
                else
                {
                    LED1 = OFF;
                    LED2 = OFF;
                }
            }
            
            UartState = UART0_RX;
            count = 0;               
            memset(RxData, 0, SIZE);          
        }
    }
}

UARTO ISR(void) 串口中断处理函数

描述: 当串口 0 产生接收中断,将收到的数据保存在 RxBuf 中

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃橘子的橘猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值