Zigbee之旅(五):几个重要的CC2430基础实验——串口通信

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信

一、承上启下

  在无线传感网络中,CC2430需要将采集到的数据发送给上位机(即PC)处理,同时上位机需要向CC2430发送控制信息。这一切都离不开两者之间的信息传递。这一节,我们就来学习如何实现PC机与CC2430之间的串口通信。

  CC2430包括2个串行通信接口 USART0 与 USART1,每个串口包括两个模式:UART(异步)模式、SPI(同步)模式,本节仅涉及UART模式)。

二、串口通信实验

(1)实验简介

  实现开发板与PC机的通信:PC向CC2430发送某一字符串,CC2430收到后返回此此字符串给PC。

(2)实验准备

  开始编写代码之前,需要搭建好硬件设施:正确连线 + 安装USB转串的驱动。

  硬件连线需要两条:

    CC2430开发板的JTAG口 → 调试器 → PC的USB口(用于程序的调试、下载)

    CC2430开发板的串口 → PC的USB口(用于PC与CC2430的数据通信)

  然后需要安装USB转串口的驱动(下载地址)

  为了向串口发送数据,还需要一个串口调试工具(下载地址)。

(3)程序流程图

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信_第1张图片

(4)实验源码及剖析

/*
  实验说明:UART0,波特率115200bps,PC机向CC2430送字符串(以@字符结束),CC2430收到后返回该字符串
*/

#include <ioCC2430.h>

unsigned  char  recv_buf [ 300 ]  =  { 0 };
unsigned  char  recv_count  =  0;


/*系统时钟初始化
-------------------------------------------------------*/
void  xtal_init( void)
{
   SLEEP  &=  ~ 0x04;              //都上电
   while( !( SLEEP  &  0x40));      //晶体振荡器开启且稳定
   CLKCON  &=  ~ 0x47;             //选择32MHz 晶体振荡器
   SLEEP  |=  0x04;
}

/*UART0通信初始化
-------------------------------------------------------*/
void  Uart0Init( unsigned  char  StopBits , unsigned  char  Parity)
{
    PERCFG &=  ~ 0x01;                   //选择UART0为可选位置一,即RXD接P0.2,TXD接P0.3
    P0SEL  |=   0x0C;                   //初始化UART0端口,设置P0.2与P0.3为外部设备IO口

    U0CSR  =  0xC0;                     //设置为UART模式,并使能接收器
   
    U0GCR  = 1 1;
    U0BAUD  = 216;                      //设置UART0波特率为115200bps,至于为何是216和11,可查阅CC2430中文手册
   
    U0UCR  |=  StopBits| Parity;         //设置停止位与奇偶校验
}

/*UART0发送数据
-------------------------------------------------------*/
void   Uart0Send( unsigned  char  data)
{
   while( U0CSR & 0x01);     //等待UART空闲时发送数据
   U0DBUF  =  data;
}

/*UART0发送字符串
-------------------------------------------------------*/
void  Uart0SendString( unsigned  char  *s)
{
   while( *!=  0)          //依次发送字符串s中的每个字符
     Uart0Send( *s ++);
}

/*UART0接受数据
-------------------------------------------------------*/
unsigned  char  Uart0Receive( void)
{
   unsigned  char  data;
   while( !( U0CSR & 0x04));  //查询是否收到数据,否则继续等待
   data = U0DBUF;           //提取接收到的数据
   return  data;          
}

/*主函数
-------------------------------------------------------*/
void  main( void)
{
   unsigned  char  i ,b;
  
   xtal_init();

   Uart0Init( 0x00 , 0x00);   //初始化UART0,设置1个停止位,无奇偶校验
   Uart0SendString( "Please Input string ended with '@'! \r\n ");

   recv_count  =  0;
  
   while( 1)
   {
     while( 1)                           
     {
      b  =  Uart0Receive(); UART
       if(b == '@') break;                  //若接收到'@',则跳出循环,输出字符串

       recv_buf [ recv_count ]  = b;         //若不是'@',则继续向字符数组recv_buf[]添加字符
       recv_count ++;
     }
     for( i = 0i < recv_counti ++)         //输出字符串
       Uart0Send( recv_buf [ i ]);
    
     Uart0SendString( " \n ");
     recv_count  = 0;                      //重置
   }
}

  首先配置USART0所对应的I/O口:通过对 PECFRG.0 清零来设置UART0为可选位置1,即RXD对应P0.2,TXD对应P0.3。然后配置P0.2和P0.3为外部设备I/O。

  然后选择UART模式,并使能接收器。接着配置USART0的参数:波特率115200,无奇偶校验、停止位为1。

  接着向PC发送一条字符串:Please Input string ended with '@'!,然后就使用while(1)不断地去试图获取接收的每一个字符。当此字符不为'@'时,则表示还未输入完成,继续将此字符添加到字符数组recv_buf中;当此字符正好为'@'时,则表示输入完成,因此跳出循环将recv_buf中的每一个字符按次序发送到PC,同时重置recv_count

(5)实验结果

  首先完成硬件连线,打开串口调试工具,配置参数如下图:

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信_第2张图片

  点击“打开串口”,然后启动IAR调试,让程序跑起来,你会发现串口调试工具上的接收框中出现了预期的字符串:

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信_第3张图片

  然后在串口调试工具中下方的发送textbox中,输入"Hello",如下所示:

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信_第4张图片

  点击“发送”之后,你或许会奇怪,为什么CC2430不会返回你所输入的内容,那是因为你没有用@结尾。

  我们再次输入"Zigbee!@",点击“发送”,结果如下所示:

Zigbee之旅(五):几个重要的CC2430基础实验——串口通信_第5张图片

  就会出现预期内容“Hello Zigbee!”了!到此实验结束~

三、结语

  本篇介绍了CC2430开发板与上位机的通信。具备了串口通信的基础后,下一节我们来一起学习ADC(模数转换)单次采样。利用ADC,我们可以采集开发板上的温度传感器的值,并将温度值通过串口发送到PC上显示出来。

你可能感兴趣的:(嵌入式,物联网,智能家居,zigbee)