大神带我飞 2016-03-07 09:02 采纳率: 0%
浏览 4700

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); 
    }
  }
}


谢谢!!!

  • 写回答

2条回答 默认 最新

  • Jimbo 2016-03-07 09:34
    关注

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

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

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

    if(RxBuf!=0){
          ...
          RxBuf=0;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题