栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CC2530串口发送接收字符串

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CC2530串口发送接收字符串

CC2530串口发送接收字符串

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


文章目录
  • CC2530串口发送接收字符串
  • 一、涉及到的寄存器
    • PERCFG寄存器
    • P0SEL寄存器
    • U0BAUD寄存器
    • U0GCR寄存器
    • U0BUF寄存器
    • U0CSR寄存器
    • U0UCR寄存器
    • IEN0寄存器
  • 二、直接上代码
  • 三、代码解析
    • 串口接收中断函数
  • 四、设备玩法
    • 设置串口调试工具
    • 设置接收区和发送区
    • 输入想发送的数据


一、涉及到的寄存器 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

P0SEL寄存器

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

U0BAUD寄存器

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


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

U0GCR寄存器

设置波特率指数,必须和U0BAUD一起使用。

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

U0BUF寄存器

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

U0CSR寄存器

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

U0UCR寄存器

清楚单元

IEN0寄存器

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

二、直接上代码

代码如下(示例):

#include

#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);
  
  
  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 后点发送,就完成了!!!

蓝色的字为你发送的数据,绿色的字是从单片机上发送过来的数据,也支持汉字发送哦!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/693214.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号