串口通讯:发送字符串
#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 中