CC2530串口发送接收字符串

CC2530串口发送接收字符串

实验目的:利用串口调试工具从PC端发送字符串给CC2530,接收到完整的数据后D4灯切换状态,并将数据发送回PC端。
涉及到的地方:串口通讯、灯的控制。



一、涉及到的寄存器

PERCFG寄存器

用于选择串口的引脚的位置,这里选择UARST0备用位置1,RX:P0_2、TX:P0_3
UARST0备用位置2,RX:P1_4、TX:P1_5
UARST1备用位置1,RX:P1_5、TX:P1_4
UARST1备用位置2,RX:P1_7、TX:P1_6
PERCFG--外设控制寄存器

P0SEL寄存器

设置串口为外设功能,否者无法使用串口。
P0SEL寄存器

U0BAUD寄存器

设置波特率小数部分的数值,必须和U0GCR一起使用。

U0BAUD寄存器
可根据官方提供的常用波特率表来选择对应的值,表放在最后。

U0GCR寄存器

设置波特率指数,必须和U0BAUD一起使用。
U0GCR寄存器
可根据官方提供的常用波特率表来选择对应的值,表放在最后。

U0BUF寄存器

CC2530芯片会将接收和发送的数据全部存放到U0BUF寄存器中,所以只需对这个寄存器做发送数据和接收数据的操作即可。但ioCC2530.h的头文件中给U0BUF寄存器定义的名字为U0DBUF,所以在存取数据的时候要对U0DBUF操作。
U0BUF寄存器

U0CSR寄存器

设置USART的模式,和接收器使能,需要在UART完全初始化完之后在在对该寄存器操作。
U0CSR寄存器

U0UCR寄存器

清楚单元
U0UCR寄存器

IEN0寄存器

本代码使用的串口方法是用接收到数据后产生中断的方式来接收数据,所以需要对URX0IE中断和EA总中断是能。
IEN0寄存器

二、直接上代码

代码如下(示例):

#include<iocc2530.h>

#define uint8_t unsigned char
#define uint32_t unsigned int
#define D4 P1_1

uint8_t UR0_Recv[32],URX_cnt=0;

void Init_Port()      //初始化引脚
{
  //D4灯初始化
  P1SEL &= ~0x02;
  P1DIR |= 0x02;
  P1 &= ~0x02;
  
  //使用外部晶振32Mhz
  CLKCONCMD &= ~0x47;
  while((CLKCONSTA & 0x40) == 0x40);
  
  /*串口初始化
            波特率:9600bps
            单片机串口:USART0
            数据位:8
            校验位:None
            停止位:1
            流  控:None
  */
  PERCFG &= ~0x01;   //设置USART0的I/O位置为备用位置1
  P0SEL |= 0x0c;     //对P0_2,P0_3设置为外设功能
  U0BAUD = 59;       //设置波特率为9600
  U0GCR = 8;
  U0UCR |= 0x80;     //清空USART0单元
  UTX0IF = 0;        //清空USART0写标志
  URX0IF = 0;        //清空USART0读标志
  URX0IE = 1;        //USART0中断使能
  EA = 1;            //总中断使能
  U0CSR |= 0xc0;     //设置USART0为UART模式、开启UART接收器使能
}

//串口发送字节函数
void UR0_SendByte(uint8_t dat)
{
  U0DBUF = dat;
  while(!UTX0IF);   //等待串口发送完毕
  UTX0IF=0;       //清楚中断位
}

//串口发送字符串函数
void UR0_SendString(uint8_t *str)
{
  while(*str != '')
  {
    UR0_SendByte(*str++);
  }
}

//串口接收中断函数
#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR()
{
  uint8_t dat;
  dat = U0DBUF;
  if(dat != '' || URX_cnt == 32-1)
  {
    UR0_Recv[URX_cnt++]=dat;
  }
  else
  {
    UR0_Recv[URX_cnt]=dat;
    URX_cnt=0;
    D4 = ~D4;
    UR0_SendString(UR0_Recv);
  }
}
void main()
{
  Init_Port();      //初始化引脚
  while(1)
  {
    ;
  }
}

三、代码解析

串口接收中断函数

#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR()
{
  uint8_t dat;
  dat = U0DBUF;     //解析1
  if(dat != '' || URX_cnt == 32-1)//解析2
  {
    UR0_Recv[URX_cnt++]=dat;
  }
  else
  {                             //解析3
    UR0_Recv[URX_cnt]=dat;
    URX_cnt=0;
    D4 = ~D4;
    UR0_SendString(UR0_Recv);
  }
}

解释1:把从串口发送过来的字节存到dat变量里(注意这里只收到一个字节的数据)
解析2:查看是否是字符串‘’(字符串以结尾),URX_cnt == 32-1 是判断是否超出UR0_Recv的最大范围,防止溢出。
解析3:说明已经字符串结束,将数据发送回去。

四、设备玩法

设置串口调试工具

串口设置

设置接收区和发送区

发送/接收区设置

输入想发送的数据

输入完数据后,再选中 发送设置–>HEX ,软件会自动将字符串转换成ASCII码
发送的数据
转换后在ASCII码后面加入00 后点发送,就完成了!!!
发送的ASCII数据
蓝色的字为你发送的数据,绿色的字是从单片机上发送过来的数据,也支持汉字发送哦!!结果

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>