发新帖我要提问
12
返回列表
打印
[Zigbee]

CC2530串口通讯-发送字符串

[复制链接]
楼主: gwsan
手机看帖
扫描二维码
随时随地手机跟帖
21
gwsan|  楼主 | 2019-8-1 11:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
(3)系统时钟和 Uart 的配置具体如下:

CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
   
PERCFG = 0x00;        //位置1 P0口
P0SEL = 0x0c;        //P0_2,P0_3用作串口
P2DIR &= ~0XC0;  //P0优先作为UART0

U0CSR |= 0x80;        //UART方式
U0GCR |= 11;        //U0GCR.BAUD_E
U0BAUD |= 216;        //波特率设为115200 UxBAUD.BAUD_M
UTX0IF = 0;  //UART0 TX中断标志初始置位0

使用特权

评论回复
22
gwsan|  楼主 | 2019-8-1 11:01 | 只看该作者
2.5参考代码
/**Includes*********************************************************************/
#include <ioCC2530.h>
#include <string.h>

/**宏定义***********************************************************************/
//定义数据类型
#define  uint  unsigned int
#define  uchar unsigned char

//定义控制灯的端口
#define LED1  P1_0

/**函数声明*********************************************************************/
void Delay(uint);
void initUARTSEND(void);
void IO_Init(void);
void UartTX_Send_String(char *Data,int len);

/**全局变量*********************************************************************/
char Txdata[25];

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
  //uchar i;         
  initUARTSEND();
  IO_Init();
  
  //UartTX_Send_String(Txdata,25);               
  //for(i=0;i<30;i++)
  // Txdata=' ';
  strcpy(Txdata,"LONGCHUANGKEJI!\r\n");      //将UART0 TX test赋给Txdata;
  while(1)
  {
    UartTX_Send_String(Txdata,strlen(Txdata)); //串口发送数据
    Delay(1000);                                //延时
    LED1=!LED1;                                 //D1灯在闪,标志发送状态
    Delay(1000);
  }
}

使用特权

评论回复
23
gwsan|  楼主 | 2019-8-1 11:01 | 只看该作者
/**
  * @brief     延时函数
  * @param     xms 延时大小
  * @retval    None
  */
void Delay(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
    for(j=587;j>0;j--);
}

使用特权

评论回复
24
gwsan|  楼主 | 2019-8-1 11:02 | 只看该作者
/**
  * @brief     初始化函数
  * @param     None
  * @retval    None
  */
void IO_Init()
{
  P1DIR = 0x01; //P1控制LED       
  LED1 = 1;     //关LED
}

使用特权

评论回复
25
gwsan|  楼主 | 2019-8-1 11:02 | 只看该作者
/**
  * @brief     串口初始化函数
  * @param     None
  * @retval    None
  */
void initUARTSEND(void)
{
    //时钟配置
    CLKCONCMD &= ~0x40;        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);   //等待晶振稳定
    CLKCONCMD &= ~0x47;        //设置系统主时钟频率为32MHZ
    //端口配置
    PERCFG = 0x00;               //位置1 P0口
    P0SEL = 0x0c;                                //P0_2,P0_3用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0
   //串口配置
    U0CSR |= 0x80;                                //UART方式
    U0GCR |= 11;                                 //U0GCR.BAUD_E
    U0BAUD |= 216;                                //波特率设为115200 UxBAUD.BAUD_M
    UTX0IF = 0;                                 //UART0 TX中断标志初始置位0
}

使用特权

评论回复
26
gwsan|  楼主 | 2019-8-1 11:02 | 只看该作者
/**
  * @brief     串口发送字符串函数
  * @param     Date 数据
               len 长度
  * @retval    None
  */
void UartTX_Send_String(char *Data,int len)
{
  int j;
  for(j=0;j<len;j++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}

使用特权

评论回复
27
gwsan|  楼主 | 2019-8-1 11:03 | 只看该作者
2.6实验现象

程序下到开发板上,同时把USB 线接到PC 上,PC 上的串口设置和现象如下图。

图4串口设置

使用特权

评论回复
28
gwsan|  楼主 | 2019-8-1 11:03 | 只看该作者

现象如下图。

图5串口现象

在接收区不断接收字符串并且LED不断闪烁。


使用特权

评论回复
29
gwsan|  楼主 | 2019-8-1 11:04 | 只看该作者
小贴士:
1.strcpy函数与strlen函数
1).strcpy函数
其一般形式为
strcpy(字符串1,字符串2)
strcpy是STRingPY(字符串复制)的简称,它是“字符串复制函数”,作用是将字符串2复制到字符串1中去,例如:

char str1[10]=’’,str2[]={“china”};
strcpy(str1,str2);

执行后,str1的状态下图所示。



图6
说明:
A.字符数组1必须足够大,一边容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。
B.“字符数组1”必须写成数组名形式(如str1)”字符串2”可以是字符数组名,也可以是一个字符串常量。例如;

strcpy(str1,”china”);

作用与前面相同
C.如果在复制前未对str1数组赋值,则str1各字节中的内容是无法预知的,复制时将str2中的字符串和其后’\0’一起复制到字符数组1中,取代字符数组1中的前面6个字符,最后4个字符不一定是斜杠零;而是str1中原有的最后4个字节的内容。

D.不能用赋值语句将一个字符串或字符数组直接给一个字节数组,如下面两行都是不合法的:

str1=”china”;
str1=str2;

而只能用strcpy函数将一个字符串复制到另一个字符数组中去,用赋值语句智能将一个字符赋给一个字符型变量或字符数组元素。下面的语句就是合法的。

char a[5],c1,c2;
c1=’A’;c2=’B’;
a[0]=’C’;a[1]=’h’;a[2]=’i’;a[3]=’n’;a[4]=’a’;

E.可以用strcpy函数将字符串2中前面n个字符复制到字符数组1中去。例如:

strncpy(str1,str2,2);

作用是将str2中最前面的2个字符复制到str1中,取代str1中原有的最前面2个字符,但复制的字符个数n不应多于str1中原有的字符(不包括’\0’)。


使用特权

评论回复
30
gwsan|  楼主 | 2019-8-1 11:05 | 只看该作者
2).strlen函数
其一般形式为
strlen(字符数组)
strlen是STRingLENght(字符串长度)的缩写。它是测试字符串长度的函数。函数的值为字符串中实际长度(不包括’\0’在内)。例如;

char str[10]={“china”};
printf(“%d”,strlen(str));

输出结果不是10,也不是6,而是5,也可以是直接测试字符串常量的长度,例如:

Strlen(“china”);

注意:以上两个函数在< string.h>中,使用以上两个函数必须包含头文件< string.h>。

使用特权

评论回复
31
gwsan|  楼主 | 2019-8-1 11:05 | 只看该作者
2. U0DBUF串口寄存器
当接收数据时,我们写” a =U0DBUF;”语句,单片机会自动将串口接收寄存器中的数据取走给a;当发送数据时,我们写“U0DBUF=a;”语句,程序执行完这条语句后自动开始将串口发送寄存器的数据发送出去。U0DBUF是共用一个地址的两个独立的寄存器,单片机识别操作那个寄存器的关键语句就是“a =U0DBUF;”和“U0DBUF=a;”。

使用特权

评论回复
32
gwsan|  楼主 | 2019-8-1 11:06 | 只看该作者
附:管理 Usart 的寄存器类型
        UxCSR:USARTx 控制和状态;
        UxUCR:USARTx UART 控制;
        UxGCR:USARTx 通用控制
        UxBUF:USARTx 接收/发送数据缓冲
        UxBAUD:USARTx 波特率控制

使用特权

评论回复
33
parameters| | 2019-8-6 14:43 | 只看该作者
感谢楼主分享!了解学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则