CC2530 USART0收发通信,串口调试助手出现乱码,求帮助
迦蓝幻紫 2016-07-30 01:29:25 /**************************************
串口收发程序
描述:在串口调试助手上可以看到不停地
收到 CC2530 发过来的从串口助手发送过去的数据
波特率:115200bps
**************************************/
#include <ioCC2530.h>
#include <string.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
uchar RXTXflag = 0; //接收发送状态标志,0表示接收,1表示发送
uchar temp = 0; //表示每个要发送的数据
uint datanumber = 0; //表示数据的个数
uchar Rxdata[50]; //存放收到数据空间
//定义 LED 的端口,低电平有效
#define LED1 P1_0 //D2 黄灯
#define LED2 P1_1 //D1 蓝灯
//函数声明
void Delay_ms(uint);
void InitUART(void);
void UartSend_String(char *Data,int len);
void Usart_Send_Byte(uchar a);
/****************************************************************
延时函数
****************************************************************/
void Delay_ms(uint n)
{
uint i,j;
for(i = 0; i < n; i++)
{
for(j = 0;j < 1774; j++);
}
}
/***************************************************************
*LED指示灯初始化函数
***************************************************************/
void IO_Init()
{
P1DIR = 0x03; //P1_0IO 方向输出
LED1 = 1; //关 LED1,LED1表示接收状态
LED2 = 1; //关 LED2,LED2表示发送状态
}
/****************************************************************
串口初始化函数
****************************************************************/
void InitUART(void)
{
PERCFG = 0x00; //位置1 P0 口 /* Peripheral I/O Control */
P0SEL = 0x0c; //P0_2,P0_3 用作串口(外部设备功能) /* Port 0 Function Select
P2DIR &= ~0xc0; //P0口 优先作为 UART0
U0CSR |= 0x80; //设置为 UART 方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志初始置位 0
URX0IF = 0; //UART0 RX 中断标志初始置位 0
U0CSR |= 0X40; //允许串口0接收
IEN0 |= 0x84; // 开总中断和USART0接收中断使能
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartSend_String(char *Data,int len)
{
int j;
for(j = 0; j < len; j++)
{
U0DBUF = *Data++;
while( 0 == UTX0IF );
UTX0IF = 0;
}
}
void Usart_Send_Byte(uchar a)
{
U0DBUF = a;
while(UTX0IF == 0);
UTX0IF = 0;
}
/***************************************************************
*中断处理函数
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
temp = U0DBUF; //temp指向接收的数据
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为 32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ
IO_Init();
InitUART();
Delay_ms(500);
UartSend_String("send test.",sizeof("send test."));
while(1)
{
if( 0 == RXTXflag) //接收状态
{
LED1=0; //接收状态指示
Delay_ms(500);
if(temp != 0)
{
if((temp != '#')&&(datanumber < 50)) //'#'被定义为结束字符,最多能接收50个字符
{
Rxdata[datanumber++] = temp;
}
else
{
RXTXflag = 1; //进入发送状态
LED1 = 1; //关指示灯
}
temp = 0;
}
}
if( 1 == RXTXflag) //发送状态
{
LED2 = 0;
Delay_ms(500);
U0CSR &= ~0x40; //禁止接收
UartSend_String(Rxdata,datanumber); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
RXTXflag = 0; // 恢复到接收状态
datanumber = 0; //指针归0
LED2 = 1; //关发送指示
}
}
}