nRF24LE1 串口调试成功 发送数据包

写了这么久程序,都没有分享点,今天分享点最基础实用的,还望大家指教

 以0x55起始 0xDD结尾 的数据包

 

#include
#include
#include
#define PIN32

#ifdef  PIN32
//定义I/O口方向
#define p0dir 0xf0
#define p1dir 0xff       
#endif

#define INTERRUPT_UART0        4                // UART0, Receive & Transmitt interrupt
#define TX_PLOAD_WIDTH  30       // 数据包长度为30 bytes

uint8_t uart_rx[TX_PLOAD_WIDTH];
uint8_t uart_rx_cnt=0;      //用于uart_rx数组计数
uint8_t recdat=0;          //缓存串口接收到的字节
uint8_t state=0;                            //串口接收状态机
uint8_t uart_flag=0;                        //串口接收完一帧数据的标志位
uint8_t len_cnt=0;                      //存储数据包里面规定的数据长度
/**************************************************
功能:串口中断服务程序
**************************************************/
void UART0_ISR(void) interrupt INTERRUPT_UART0
{
// uint8_t xorchm=0;         //存储异或校验
 if(RI0 == 1)
 {
    recdat=S0BUF;
    if(state == 0)  //串口接收到的第一个字节 检测帧头
    {
         if(recdat == 0x55)    //检测到帧头  状态机进入下一歩
   {
        state=1;
   }
   else
        state=0;
    }
    else if(state == 1)
    {
   len_cnt=recdat;
         state=2;
    }
    else if(state == 2)   //存储数据
    {
         uart_rx[uart_rx_cnt++]=recdat;  //数据保存
//   xorchm ^= recdat;
   if(uart_rx_cnt == len_cnt)
   {
        state = 3;        //数据接收完
     uart_rx_cnt=0;
   }
   else
        state=2;
    }
/*    else if(state == 3)     //异或校验
    {
         if(xorchm == recdat)
   {
        state = 4;
   }
   else
        state=0;  
    }  */
    else if(state == 3)         //数据接收正确  检验数据帧尾
    {
         if(recdat == 0xDD)
   {
        uart_flag=1;
     state = 0;
   }   
    }
    RI0 = 0;   
 } 

/**************************************************
功能:串口初始化子程序
说明:波特率19.2K,使用内部波特率发生器
**************************************************/
void uart_init(void)
{
    ES0 = 0;                          // 关UART0中断
    REN0 = 1;                         // 允许接收
    SM0 = 0;                          // 串口模式1,8bit可变波特率
    SM1 = 1;                        
    PCON |= 0x80;                     // SMOD = 1
    ADCON |= 0x80;                    // 选择内部波特率发生器

    S0RELL = 0xe6;                    // 波特率19.2K(十进制998=十六进制0x03e6)
    S0RELH = 0x03;
    TI0 = 0;           // 清发送完成标志
 RI0 = 0;
 S0BUF=0x99;           // 送初值
}
/**************************************************
功能:向串口发送1 byte数据
**************************************************/
void uart_putchar(uint8_t x)
{
 while (!TI0);        // 等待发送完成
 TI0=0;          // 清发送完成标志
 S0BUF=x;         // 发送数据
}
/**************************************************
功能:向串口发送一个字符串
**************************************************/
void uart_puts(int8_t *s)
{  
    while(*s!='\0')
 {
     uart_putchar(*s);
  s++;
 }
}   
/**************************************************
功能:I/O口初始化
**************************************************/
void io_init(void)
{
   P0DIR = p0dir;           // 设定I/O口输入输出
   P1DIR = p1dir;               
}
void main()
{
    uint8_t temp=0,num=0,i;
 io_init();  
 uart_init();     
 
    uart_puts("\r\nHello!");
 EA=1;     //允许中断
 ES0=1;
 while(1)
 {
     if(uart_flag == 1)    //如果收到一桢数据
  {
   uart_flag = 0;
   for(i=0;i    {
   uart_putchar(uart_rx[i]);
   }
  }
 }
}

 

你可能感兴趣的:(硬件技术)