nRF24LE1 串口调试成功 发送数据包
2011-09-29 08:52
316 查看
写了这么久程序,都没有分享点,今天分享点最基础实用的,还望大家指教
以0x55起始 0xDD结尾 的数据包
#include <Nordic\reg24le1.h>
#include <intrins.h>
#include <stdint.h>
#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<len_cnt;i++)
{
uart_putchar(uart_rx[i]);
}
}
}
}
以0x55起始 0xDD结尾 的数据包
#include <Nordic\reg24le1.h>
#include <intrins.h>
#include <stdint.h>
#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<len_cnt;i++)
{
uart_putchar(uart_rx[i]);
}
}
}
}
相关文章推荐
- arduino can总线实验,开源调试软件的串口数据包协议。
- PDU编码的短信终于通过串口成功发送了
- STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以
- 怎么把一个结构体的数据包通过串口发送出去?
- STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以
- 奶奶的熊,就是因为一跳串口线,导致一个客户重新做了一次S5pv210 底板,烧写wince6.0 两周不成功,哎,实在没办法,叫他发电路板给我调试,我发现居然是串口线!
- 在串口通过命令发送广播—机顶盒开发调试使用
- STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以
- telnet对server监听的端口发送数据包进行调试
- 奶奶的熊,就是因为一跳串口线,导致一个客户重新做了一次S5pv210 底板,烧写wince6.0 两周不成功,哎,实在没办法,叫他发电路板给我调试,我发现居然是串口线!
- STM32F4 串口实验中收不到超级终端发送的数据,调试工具却可以
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题
- Ubuntu 17.04编译串口发送16进制数据包报了个神奇的错误
- Ubuntu 17.04编译串口发送16进制数据包报了个神奇的错误—续
- Python3 串口接收与发送16进制数据包
- STM32中关于串口中断的调试(不断进入发送中断的原因)
- Delphi 使用 SPcomm 调试串口程序出现总是在程序断开的时候,才发送指令的问题。
- 第一次用verilog调试串口(发送、接收)
- 如何判断TCP数据包是否发送成功
- 串口调试成功 yeah SPCOMM