CC2530使用串口通信把发过来的数据发送回去
首先我们先来 了解一下CC2530的串口通信
数据通信时,根据CPU与外设之间的连线结构和数据传送方式的不同,可以将通信方式分为两种:并行通信和串行通信。
串行通信又分同步和异步两种方式。就是我们了解的 UART模式和SPI模式, 其中UART模式称为异步通信,SPI模式称为同步通信。
每一帧数据由起始位(低电平)、数据位、奇偶校验位(可选)、停止位(高电平)组成。帧的格式如下图:
这里需要注意的是:
UART模式,每次中断就发送一个字符,所以我们应该定义一个结束的特殊字符来结束我们接收状态,当我们URX0IF 写0时就会清空接收U0DBUF的数据。
发送的时候我们可以判断字符串的结束符‘\0’,这个也是 一个一个发送的 ,UTX0IF = 0时也会清空发送U0DBUF的数据
UART模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。实际发送的帧包含8位或者9位,但是数据传送只涉及一个字节。
下面为代码
#include <ioCC2530.h>
#include <string.h>
#define LED1 P1_1
typedef unsigned char uchr;
typedef unsigned int uint;
//需要发送的字符串
uchr Tx_send[30],Sand_flag = 0;
uchr return_success_tip[10] = "success";
uchr return_fail_tip[10] = "fail";
uint string_length = 0;
void display(uint ms){
for(uint i=0;i<ms;i++)
for(uint j=0;j<535;j++);
}
void init(){
//led初始化
P1SEL &= ~0x02;
P1DIR |= 0x02;
LED1 = 1;
//设置晶振
CLKCONCMD &= ~0x47;
while(CLKCONCMD & 0x40);
//串口初始化 选用USART0 UART 进行通信
PERCFG = 0x00; //选择串口备用位置1
P0SEL |= 0x0c; //选择P0_2,P0_3作为串口 ,设置为外设功能
P2DIR &= ~0xc0; //设置优先级 USART 0 > USART 1 > 定时器1
U0GCR |= 8;
U0BAUD |= 59;
U0UCR |= 0x80; //清空USART0单元
UTX0IF = 0; //清空USART0写标志
URX0IF = 0; //清空USART0读标志
IEN0 |= 0x84; //开启总中断与RX中断使能
U0CSR |= 0xc0; //设置USART0为UART模式、开启UART接收器使能
}
/********************************************
发送数组字符
********************************************/
void TXS(char *Data){
LED1 = 0;
while(*Data != '\0')
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void main(){
init();
while(1){
//当接收到数据后发送回去
if(Sand_flag == 1){
TXS(Tx_send);
LED1 = 1;
// strcpy(Tx_send,"");
Sand_flag = 0;
}
}
}
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(){
URX0IF = 0;
uchr temp = U0DBUF;
if(temp != '#'){
Tx_send[string_length++] = temp;
}else{
//改变状态转为发送
Sand_flag = 1;
string_length = 0;
}
}