本人单片机新手。下面的程序是正确可达到目的。
对于这个程序我有2个地方不太理解,望大神不吝赐教。
第一个:【设置发送字符串的函数】这个块儿,不太能理解。特别是我注释的地方。
第二个:【主方法中】接收那部分,有一个注释的地方,搞不懂。求解释。。。
没有金币,,,不知道有大神赐教没。。。跪谢。。。
/*
设置串口波特率115200bps,8N1
串口调试助手给CC2530发送字符串,开发板则返回同样字符。
*/
#include<ioCC2530.h>
#include<string.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define SIZE 50
char RxBuf;
char RxData[SIZE];
char UartState;//0为接收状态,1为发送状态
uint count;//计数器
//延时器
void DelayMs(uint msec)
{
uint i,j;
for(i=0;i<msec;i++)
for(j=0;j<1070;j++);
}
//初始化串口
void InitUart()
{
//配置I/O,使用外部设备功能
PERCFG=0x00; //外设控制
P0SEL=0x0C; //配置P0端口的2,3为外设
//配置相应的串口
P2DIR&=~0x40; //优先级的控制
U0CSR|=0x80; //设置为UART模式
//配置串口的波特率
U0GCR=11;
U0BAUD=216;
U0CSR|=0x40;//接收使能
IEN0|=0x84;//允许USART0 RX 中断使能, 打开所有中断
}
//设置发送字符串的函数
void UartSendString(char *Data,uint len)
{
uint i;
for(i=0;i<len;i++)
{
U0DBUF=*Data++;
//传输开始时,触发TX中断,此时为1。
while(UTX0IF==0); //!!!!!!!!!!!!!!!!!?不太懂。
UTX0IF=0;
}
}
//接收中断处理函数
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR()
{
URX0IF=0;//清中断标志
RxBuf=U0DBUF;
}
//函数入口
void main()
{
//首先,设置系统的时钟
CLKCONCMD&=~0x40; //把bit 6置为0,系统时钟选择,为32MHz XOSC
while(CLKCONSTA&0x40); //等待晶振稳定
CLKCONCMD&=~0x47; //设置系统时钟频率为32MHZ
InitUart(); //初始化端口
memset(RxData,0,SIZE); //数据清零
UartState=0;
while(1)
{
if(UartState==0) //接收状态
{
if(RxBuf!=0)
{
//以“#”为结束符,一次最多接收50个字符
if((RxBuf!='#')&&(count<50))
RxData[count++]=RxBuf;//接收
else
{
if(count>=50)
{
memset(RxData,0,SIZE);
count=0;
}
else
UartState=1;
}
RxBuf=0;
}
//RxBuf=0;//!!!!如果把上面的 RxBuf=0;注释,打开这个的话,
//!!!!在串口调试助手中会输出每次都不同的结果,小弟找不到规律。
}
if(UartState==1)//发送状态
{
//首先要禁止接收
U0CSR&=~0x40;
UartSendString(RxData,count);
//允许接收字符
U0CSR|=0x40;
UartState=0;//回复到接收模式
count=0;
memset(RxData,0,SIZE);
}
}
}
谢谢!!!