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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
第二部分 基础篇-第6章 CC2530串口通讯-发送字符串
1 理论分析 1.1 CC2530 的 Usart 介绍 首先,我们要知道 CC2530 有几个串行通信口。由图1知,它总共有 2 个串口分别为 Usart0、Usart1。Usart0 和 Usart1 是串行通信接口,它们能够分别运行于异步 UART 模式或者同步 SPI 模式。两个 Usart 具有同样的功能,可以设置在单独的 I/O 引脚。由 CC2530 datasheet 可知...
CC2530串口接收总结
1.CC2530的串口操作都是针对bit只有一位的数据。 发送可以通过循环进行发送将一个字符串发送出去 /**************************************************************** 串口发送字符串函数 ****************************************************************/
TI CC2530基础实验(串口编程——USART0收发测试总结)
无论学习哪款MUC串口对于我们进行实验调试都是非常方便实用的,可以把程序中涉及的某些中间量或者其他程序状态信息打印出来显示在电脑上进行调试,许多MUC和PC机通信都是通过串口来进行的。 CC2530有两个USB转串口,分别是USART0和USART1。USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具体同样的功能,可以设置在单独的I/
CC2530基础实验四 串口通信
一、任务要求编写程序实现实验板定期向PC机串口发送字符串“Hello ! I am CC2530 。\n”。实验板开机后按照设定的时间间隔,不断地向PC及发送字符串,报告自己的状态,每发送一次字符串消息,LED1闪亮一次。具体工作方式如下: ① 通电后LED1熄灭。 ② 设置USART 0使用位置。 ③ 设置UART工作方式和波特率。 ④ LED1点亮。 ⑤ 发送字符串“
ZigBee Z-Stack 3.19 串口2-接收
(配套源码、软件、开发板等资源,可移步博客同名QQ群:拿破仑940911)前面两节讲述了Z-Stack协议栈中串口发送功能的使用,本节将讲述串口的数据接收处理机制。《ZigBee CC2530 Z-Stack 10 串口收发机制及使用1-发送》中提到, uartConfig.callBackFunc = NULL;关于这句代码,由于当时暂不实现串口接收处理数据的功能,所以之前此处...
[CC2530]串口接收发送数据
CC2530 串口接收发送数据(查询法) #include "ioCC2530.h" void initUART(void) {   PERCFG&=~0x01;   P0SEL |= 0x0C;     U0CSR |= 0xC0;  //串口接收使能   U0UCR |= 0x00;  //无奇偶校验,1位停止位     U0GCR |= 0x08;   U0BAUD = 0x3b;  //
CC2530之UART串口通信
CC2530之UART串口通信利用单片机的串口与计算机通信,可方便对各种实验数据进行观察。个人认为,学习一种新的单片机,除了永恒的LED外,第二个例程该是串口的通信实验。CC2530有两个串口,分别为USART0和USART1。由于采用了引脚复用功能,外设与引脚对应的关系可根据外设控制寄存器PERCFG进行配置,具体对应情况如下: UART0对应的外部引脚关系,位置1:Rx - P0_2
第二部分 基础篇-第6章 CC2530串口通讯-接收字符串
1 理论分析 当 1 写入 UxCSR.RE 位时,在 UART 上数据接收就开始了。然后 UART 会在输入引脚 RXDx 中寻找有效起始位,并且设置 UxCSR.ACTIVE 位为 1。当检测出有效起始位时,收到的字节就传入到接收寄存器,UxCSR.RX_BYTE 位设置为 1。该操作完成时,产生接收中断。同时 UxCSR.ACTIVE 变为低电平。 通过寄存器 UxBUF 提供收到的数据...
CC2530串口中断
CC2530是Zigbee模块的微控制器芯片
ZigBee CC2530串口通信调试
刚接触ZigBee,熟悉了一下ZStack协议栈,总算有了点认识。先从调试串口开始,再慢慢开始协议栈代码调试,下面程序已实现发送和接收数据,用的是CC Debugge仿真器和ZigBee最小系统,使用串口还得接个USB转串口设备,我用的是USB转TTL串口,直接贴代码: 包含头文件和系统变量声明部分:#include <ioCC2530.h> #include <string.h> #includ