CC2530串口发送接收字符串

CC2530串口发送接收字符串

实验设备:新大陆物联网协调器设备(黑色板)
设备硬件:CC2530_QFN芯片、MAX232串口芯片(RX:P0_2、TX:P0_3)、LED灯(P1_1)
实验目的:利用串口调试工具从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 != '\0')
  {
    UR0_SendByte(*str++);
  }
}

//串口接收中断函数
#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR()
{
  uint8_t dat;
  dat = U0DBUF;
  if(dat != '\0' || 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 != '\0' || 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:查看是否是字符串‘\0’(字符串以\0结尾),URX_cnt == 32-1 是判断是否超出UR0_Recv的最大范围,防止溢出。
解析3:说明已经字符串结束,将数据发送回去。

四、设备玩法

同款串口调试工具下载/download

设置串口调试工具

串口设置

设置接收区和发送区

发送/接收区设置

输入想发送的数据

输入完数据后,再选中 发送设置–>HEX ,软件会自动将字符串转换成ASCII码
发送的数据
转换后在ASCII码后面加入00 后点发送,就完成了!!!
发送的ASCII数据
蓝色的字为你发送的数据,绿色的字是从单片机上发送过来的数据,也支持汉字发送哦!!结果
以上就是使用CC2530串口发送字符串的基础玩法,创作不易,点赞投币!!

  • 8
    点赞
  • 42
    收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论 6

打赏作者

就很离谱吧

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值