在线时间447 小时
UID3070798
注册时间2015-4-27
NXP金币0
TA的每日心情 | 开心 2020-5-24 10:39 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 3913
- 最后登录
- 2020-5-24
|
本帖最后由 suoma 于 2015-9-15 23:08 编辑
想用nRF905实时的发送温湿度数据怎么编程,接收端用液晶显示怎么处理这些数据 高手指点一下
答:NRF905是SPI接口的,调好能够传送数据和发送,然后定义一个简单的数据协议就可以了。
数据协议大概要怎么定义?温湿度的数据大概四个字节 用一个数组存放吗 谢谢
答:嗯嗯,用一个8个字节来存放。其中包括帧头,数据,帧尾,校验
几个字节你自己定义,这是举例
在主程序里把设置成发送模式他就能自动把数据发出去了吗
答:那得看你的发送模式设置函数是不是对发送使能等寄存器值为1了。
这两个寄存器使能就是启动发送TRX_CE、TX_EN
void Data_Send_Status(void)
{
uint8_t _cnt=11;
data_to_send[0]=0xAA;
data_to_send[1]=0xAA;
data_to_send[2]=0x01;
data_to_send[3]=0;
vs16 _temp;
_temp = (int)(Att_Angle.rol*100);
data_to_send[4]=BYTE1(_temp);
data_to_send[5]=BYTE0(_temp);
_temp = (int)(Att_Angle.pit*100);
data_to_send[6]=BYTE1(_temp);
data_to_send[7]=BYTE0(_temp);
_temp = (int)(Att_Angle.yaw*100);
//_temp = (int)(Mag_Heading*100);
data_to_send[8]=BYTE1(_temp);
data_to_send[9]=BYTE0(_temp);
if(Rc_C.ARMED==0) data_to_send[10]=0xA0;
else if(Rc_C.ARMED==1) data_to_send[10]=0xA1;
data_to_send[3] = _cnt-4;
uint8_t sum = 0;
for(uint8_t i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++]=sum;
#ifdef DATA_TRANSFER_USE_USART
Uart1_Put_Buf(data_to_send,_cnt);
#else
NRF_TxPacket(data_to_send,_cnt);
#endif
}
这是一个简单高效的通信协议,你看看。
那对面接收单片机的地址是怎么确定的呢
答:对接收到数据存到一个数组里,查找帧头 data_to_send[0]=0xAA;
data_to_send[1]=0xAA;
data_to_send[2]=0x01;
找到后,按照接收到数据个数再跳转到帧尾,判断是否准确,然后再做for(uint8_t i=0;i<_cnt;i++)
sum += data_to_send;
data_to_send[_cnt++]=sum;
累加和校验
校验数据结果和data_to_send[_cnt++]对比,正确就是接收成功,到数组的指定位置提取数据即可,发现数据不对,可以要求重发或者丢弃。
我用的是AM2301的温湿度传感器 它里面好像已经有校验了
答:那是温湿度传感器和你单片机的数据通信,跟你无线数据包时两码事,如果你对精度和准确率要求不高,可以不需要校验。
哦哦 要求不高能达到实时传送?
答:可以那判断帧头帧尾即可,保证数据不错位就OK啦,
帧头帧尾是怎么判断的呢
答:if语句啊
帧头帧尾是905自己添加的是吗?
答:不是,这个通信协议是你自己定义的,当然得你来添加了。
这个吗
data_to_send[0]=0xAA;
data_to_send[1]=0xAA;
data_to_send[2]=0x01;
while(1) 2015/9/15 20:16:02
答:其实nrf内部也有通信协议,帧头帧尾,校验,但那时保证数据在空中传输的正确性。 而你自己定义的通信协议主要是为了保证不错位。
就是再发送真正有用的头和尾发一个字节的用于识别的数据 在接收在检测这两个数据是吧
答:嗯嗯,但是要能够被区分出来不是真正数据才行。比如帧数据不会出现oxff,那你就可以用oxff作为帧头
哦 这就是自己定义的通信协议了吧
|
|