cc2530串口接收数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cc2530串口接收数据相关的知识,希望对你有一定的参考价值。

接收不到数据,进入不了接收中断里

#include<iocc2530.h>

#define LED1 P1_0
#define LED2 P0_1
#define uchar unsigned char
#define uint unsigned int

uchar tmp;
uchar RTflag = 1;
uchar num = 0;
uchar Recdata[3]="000";
void InitUART();//初始化串口0函数
void InitLED();//初始化LED函数

void main()


InitLED();//初始化LED灯
InitUART();//初始化串口

U0CSR |=0x40;//打开异步接收
IEN0 |=0x84;//打开总中断和串口0的接收中断

while(1)

//接收

if(RTflag == 1)

if(tmp!=0)
if((tmp !='#')&&(num<3))

Recdata[num++] = tmp;

else

//进入LED控制
RTflag = 3;

//接收3个字符后进入LED控制
if(num==3)
RTflag = 3;
tmp = 0;



//控制LED
if(RTflag == 3)

//控制LED2
if(Recdata[0]=='1')

//10#关LED2
if(Recdata[1]=='0')

LED1 = 1;

else

//11#LED2开
LED1 = 0;



//控制LED3
if(Recdata[0]=='2')

//20#关LED3
if(Recdata[1]=='0')

LED2 = 1;

else

//21#LED2开
LED2 = 0;


RTflag = 1;
num = 0;





//设置时钟为32M
void InitClock()

CLKCONCMD &=~0x40;//选用32M晶振
while(SLEEPSTA & 0x40 == 0);//等待32M晶振稳定
CLKCONCMD &=~0x47;//不分频输出
SLEEPCMD |=0x04;//关闭不用的RC振荡器


//串口0初始化并设置波特率
void InitUART()

InitClock();//时钟选用32M

PERCFG |=0x00;//设置外设位置2
P0SEL =0x3c;//设置P0上对应的口为片上外设
P2DIR &=~0xc0;
U0CSR |=0x80;//设置为UART模式
//设置波特率57600
U0GCR |=10;
U0BAUD |=216;
//URX0IF = 0;//接受中断标志清0
UTX0IF = 1;


//初始化LED2,LED3
void InitLED()


P1DIR |=0x01;
LED1 = 1;

P0DIR |=0x02;
LED2 = 1;


//UART0接收中断函数
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR()

//关闭中断
IEN0 &=~0x04;
if(URX0IF > 0)

URX0IF = 0;//清中断标志位
tmp = U0DBUF;//读取U0DUBF的值

IEN0 |=0x04;

参考技术A 1、首先进行连线:
cc2530芯片TX,RX与51单片机的TX,RX交叉相连,然后共地。
2、分别下载接收程序:
用IAR Embedded Workbench给接收端CC2530芯片下载接收程序,用keil uvision4给发送端51单片机下载接收程序。
3、用串口助手分别测试两端:
都可以与电脑进行串口通讯,完成二者串口通信。
参考技术B 好多错别字啊,看起来很别扭 一般串口数据包的发送,我们都会定义一个帧头、帧长和校验和的 以便数据的接收、校验。 我不太清楚你哪里不明白,可以说的具体点吗 其实说白了,数据包也就是一串数据而已,只不过为了可靠,我们在有用的数据前加了...

STM8S903K3基于ST Visual Develop开发串口接收中断示例

STM8S903K3基于ST Visual Develop开发串口接收中断示例


📗UART中断请求

  • 📓UART中断映射图
  • 📑中断向量表有关串口中断号信息:

🌻接收中断数据转发功能实现

🔖将通过串口接收到的数据转发出去,对数据不做任何处理。

#include"stm8s903k3.h"

void CLK_Init(void)

	//  CLK_ECKR = 0x01; //开启外部时钟寄存器
//  CLK_SWR = 0xb4; //HSE外部时钟源作为主时钟源
//  CLK_CKDIVR = 0x00;//不分频
  
  CLK_ICKR |= 0X01; //使能内部高速时钟 HSI
  CLK_CKDIVR = 0x00; // 不分频,16M
 //    CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M 
   while(!(CLK_ICKR&0x02)); //HSI准备就绪
     CLK_SWR = 0xE1;//HSI内部时钟源作为主时钟源(复位值)

void UART1_Init(void)

    PD_DDR |= ( 1 << 5 );                       //输出模式 TXD
    PD_CR1 |= ( 1 << 5 );                       //推挽输出
    
    PD_DDR &= ~( 1 << 6 );                      //输入模式 RXD
    PD_CR1 &= ~( 1 << 6 );                      //浮空输入
    
	 UART1_CR3 = 0x00;
	 /*disable LIN mode 
	-one stop bit
	-disable SCK
	*/
    UART1_CR2  = 0x00;
		/*disable TX interrupt
	  disable TX completion interrupt
		disable RX interrupt
		disable idle interrupt
		disable TX and RX
		没有发送断开帧
	*/
    UART1_CR3  = 0x00;
		/*one start bit 
	eight data bits 
	 wake up by idle bus
	 disable ECC and EEC interrupt
	 UART enable
	*/
	
/* 波特率:9600 */  
   UART1_BRR2 = 0x02;//
   UART1_BRR1 = 0x68;//
  /* 波特率:115200 */   
//    UART1_BRR2 = 0x0b;
 //   UART1_BRR1 = 0x08;
 
	UART1_CR2  |= 0x20;
	UART1_CR2  |= 0x0C; //enable TX and RX



//char putchar(char c)
//
 // 发送一个字符 c 到UART1
//	UART1_DR = c;
//等待发送完毕 */
// while (!(UART1_SR&0x40));
// return (c);
//

void delay (unsigned int x)

	unsigned int i,j;
	for(i=x;i>0;i--)
		for(j=300;j>0;j--);



//阻塞式发送函数
void SendChar( unsigned char dat )

  /* 发送一个字符 c 到UART1 */
	UART1_DR = dat;
 /* 等待发送完毕 */
 while (!(UART1_SR&0x40));


//发送字符串
void SendString( unsigned char* s )

    while( '\\0' != *s )
    
        SendChar( *s );
        s++;
    




//接收中断函数 中断号18
@far @interrupt void UART1_Handle( void )

	while(!(UART1_SR&0x40));
	RevByte  = UART1_DR ;
	 UART1_DR = RevByte ;//转发出去
	while(!(UART1_SR&0x40));


void main()
	
	_asm("sim");    //disable all interrupt
		CLK_Init();
	UART1_Init();
	_asm("rim");    //enable all interrupt
	while(1);

  • 🌿中断向量表源文件:stm8_interrupt_vector.c
typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector 
	unsigned char interrupt_instruction;
	interrupt_handler_t interrupt_handler;
;

@far @interrupt void NonHandledInterrupt (void)

	/* in order to detect unexpected events during development, 
	   it is recommended to set a breakpoint on the following instruction
	*/
	return;


extern void _stext();     /* startup routine */
//extern @far @interrupt  void TIM1_OVR_UIF(void);
extern @far @interrupt void UART1_Handle(void);
struct interrupt_vector const _vectab[] = 
	0x82, (interrupt_handler_t)_stext, /* reset */
	0x82, NonHandledInterrupt, /* trap  */
	0x82, NonHandledInterrupt, /* irq0  */
	0x82, NonHandledInterrupt, /* irq1  */
	0x82, NonHandledInterrupt, /* irq2  */
	0x82, NonHandledInterrupt, /* irq3  */
	0x82, NonHandledInterrupt, /* irq4  */
	0x82, NonHandledInterrupt, /* irq5  */
	0x82, NonHandledInterrupt, /* irq6  */
	0x82, NonHandledInterrupt, /* irq7  */
	0x82, NonHandledInterrupt, /* irq8  */
	0x82, NonHandledInterrupt, /* irq9  */
	0x82, NonHandledInterrupt, /* irq10 */
	0x82, NonHandledInterrupt, /* irq11 TIM1*/
	0x82, NonHandledInterrupt, /* irq12 */
	0x82, NonHandledInterrupt, /* irq13 */
	0x82, NonHandledInterrupt, /* irq14 */
	0x82, NonHandledInterrupt, /* irq15 */
	0x82, NonHandledInterrupt, /* irq16 */
	0x82, NonHandledInterrupt, /* irq17 */
	0x82, UART1_Handle, /* irq18 */
	0x82, NonHandledInterrupt, /* irq19 */
	0x82, NonHandledInterrupt, /* irq20 */
	0x82, NonHandledInterrupt, /* irq21 */
	0x82, NonHandledInterrupt, /* irq22 */
	0x82, NonHandledInterrupt, /* irq23 */
	0x82, NonHandledInterrupt, /* irq24 */
	0x82, NonHandledInterrupt, /* irq25 */
	0x82, NonHandledInterrupt, /* irq26 */
	0x82, NonHandledInterrupt, /* irq27 */
	0x82, NonHandledInterrupt, /* irq28 */
	0x82, NonHandledInterrupt, /* irq29 */
;

🌼通过自定义传输协议,选择性处理接收数据

🚩此方法可以有针对性的对接收数据进行筛选。

📝示例代码

⛳通过对带有结束符且带换行符来判断数据接收完成,不过这样有一定的局限性。如果想实现对不定长数据完整接收需要添加更多的条件判断才行。

#include"stm8s903k3.h"
#include "string.h"
unsigned char cnt=0;
 unsigned char RxBuffer[32];
unsigned char flag=0;

void CLK_Init(void)

	//  CLK_ECKR = 0x01; //开启外部时钟寄存器
//  CLK_SWR = 0xb4; //HSE外部时钟源作为主时钟源
//  CLK_CKDIVR = 0x00;//不分频
  
  CLK_ICKR |= 0X01; //使能内部高速时钟 HSI
  CLK_CKDIVR = 0x00; // 不分频,16M
 //    CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M 
   while(!(CLK_ICKR&0x02)); //HSI准备就绪
     CLK_SWR = 0xE1;//HSI内部时钟源作为主时钟源(复位值)

void UART1_Init(void)

	PD_DDR |= ( 1 << 5 );                       //输出模式 TXD
    PD_CR1 |= ( 1 << 5 );                       //推挽输出
    
    PD_DDR &= ~( 1 << 6 );                      //输入模式 RXD
    PD_CR1 &= ~( 1 << 6 );                      //浮空输入
	 UART1_CR3 = 0x00;
	 /*disable LIN mode 
	-one stop bit
	-disable SCK
	*/
    UART1_CR2  = 0x00;
		/*disable TX interrupt
	  disable TX completion interrupt
		disable RX interrupt
		disable idle interrupt
		disable TX and RX
		没有发送断开帧
	*/
    UART1_CR3  = 0x00;
		/*one start bit 
	eight data bits 
	 wake up by idle bus
	 disable ECC and EEC interrupt
	 UART enable
	*/
	
/* 波特率:9600 */  
   UART1_BRR2 = 0x02;//
   UART1_BRR1 = 0x68;//
  /* 波特率:115200 */   
//    UART1_BRR2 = 0x0b;
 //   UART1_BRR1 = 0x08;
 
 	UART1_CR2  |= 0x20;
	UART1_CR2  |= 0x0C; //enable TX and RX
 




//char putchar(char c)
//
 // 发送一个字符 c 到UART1
//	UART1_DR = c;
//等待发送完毕 */
// while (!(UART1_SR&0x40));
// return (c);
//

void delay (unsigned int x)

	unsigned int i,j;
	for(i=x;i>0;i--)
		for(j=300;j>0;j--);



//阻塞式发送函数
void SendChar( unsigned char dat )

  /* 发送一个字符 c 到UART1 */
	UART1_DR = dat;
 /* 等待发送完毕 */
 while (!(UART1_SR&0x40));


//发送字符串
void SendString( unsigned char* s )

    while( '\\0' != *s )
    
        SendChar( *s );
        s++;
    


//接收中断函数 中断号18
@far @interrupt void UART1_Handle( void )


    char dataTmp ;
    UART1_SR &= ~( 1 << 5 ); //RXNE 清零
		 dataTmp = UART1_DR;
		if((0x0d != dataTmp)&&(0x0a != dataTmp))//换行符和回车符判断结束
		
			RxBuffer[cnt++] = dataTmp;		
	  
	  else
	
		RxBuffer[cnt] = '\\0';
		cnt=0;
		flag = 1;
	
		
	



void main()
	
	_asm("sim");    //disable all interrupt
	CLK_Init();
	UART1_Init();
	_asm("rim");    //enable all interrupt
	while(1)
	
	if(flag == 1)
	
		SendString(RxBuffer);
		SendChar('\\n');
		memset(RxBuffer,0,sizeof(RxBuffer));
		flag =0;		
	
  


中断向量表源文件中的代码和上面的示例是相同的。

以上是关于cc2530串口接收数据的主要内容,如果未能解决你的问题,请参考以下文章

#导入Word文档图片# CC2530 串口配置步骤

关于Zigbee_cc2530解决串口显示头几个乱码要怎么解决?

如何使用串口调试工具收发cc2530串口数据?

TI的cc2530 z-stack协议栈简单问题

CC2530开发模块与51单片机如何实现串口通信

ALB技术笔记基于多线程方式的串行通信接口数据接收案例