2 cskingq cskingq 于 2016.03.07 17:02 提问

CC2530,串口通信,收发字符问题。

本人单片机新手。下面的程序是正确可达到目的。
对于这个程序我有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); 
    }
  }
}


谢谢!!!

1个回答

WinsenJiansbomber
WinsenJiansbomber   2016.03.07 17:34

这个是判断标志位,发送程序发完数据后产生会修改UTX0IF:

 while(UTX0IF==0);  //!!!!!!!!!!!!!!!!!?不太懂。

第二点,这是根据缓冲数据的字节数来判断是不是要接收数据,如果有数据就接收下来,接收完数据后就要重置字节数为0,不然,下次又重复收取了,逻辑就错乱了。

if(RxBuf!=0){
      ...
      RxBuf=0;
}
cskingq
cskingq 第二点我明白,但是如果把那句写在if的外边的话,每次运行的结果竟然不相同,我想知道不相同的原因,好奇怪呀。。。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!