调用RF_getRssi(rfHandle)时,这个函数返回的是RF_GET_RSSI_ERROR_VAL,请问调用这个函数需要配置其他参数吗?谢谢。
Viki Shi:
Felix_ZF的代码没问题的,你是在哪边调用的API?
user5611410:
回复 Viki Shi:
在 rfEchoRx中调用的这个函数,直接用串口打印出来,这方法能行吗?
user4988634:
回复 user5611410:
你不能再这里调用,这个函数是在接收的过程中使用才有效,你这里的调用是接收结束之后才调用,肯定出错啊。。。建议你不要用这种方法读取rssi。。
建议你使用下面的指令 RF_cmdPropRx.rxConf.bAppendRssi = 1;这个指令在你定义接收配置的地方加进去。下面是我添加的位置。
RF_cmdPropRx.rxConf.bAppendRssi= 1;/* Copy all RX options from the SmartRF Studio exported RX command to the RX Sniff command */initializeSniffCmdFromRxCmd(&RF_cmdPropRxSniff, &RF_cmdPropRx);/* Configure RX part of RX_SNIFF command */RF_cmdPropRxSniff.pQueue= &dataQueue;RF_cmdPropRxSniff.pOutput= (uint8_t*)&rxStatistics;RF_cmdPropRxSniff.maxPktLen= MAX_LENGTH;/* Discard ignored packets and CRC errors from Rx queue */RF_cmdPropRxSniff.rxConf.bAutoFlushIgnored= 1;RF_cmdPropRxSniff.rxConf.bAutoFlushCrcErr= 1;/* Calculate datarate from prescaler and rate word */uint32_t datarate = calculateSymbolRate(RF_cmdPropRadioDivSetup.symbolRate.preScale, RF_cmdPropRadioDivSetup.symbolRate.rateWord);/* Configure Sniff-mode part of the RX_SNIFF command */configureSniffCmd(&RF_cmdPropRxSniff, WOR_MODE, datarate, 1);/* Request access to the radio */rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);这个指令在你接收指令的时候,就会把rssi保存到发送数据的最后一位。
定义的位置在rf_prop_cmd.h中,自己研究一下
struct {uint8_t bAutoFlushIgnored:1;//!<If 1, automatically discard ignored packets from RX queueuint8_t bAutoFlushCrcErr:1;//!<If 1, automatically discard packets with CRC error from RX queueuint8_t :1;uint8_t bIncludeHdr:1;//!<If 1, include the received header or length byte in the stored packet; otherwise discard ituint8_t bIncludeCrc:1;//!<If 1, include the received CRC field in the stored packet; otherwise discard ituint8_t bAppendRssi:1;//!<If 1, append an RSSI byte to the packet in the RX queueuint8_t bAppendTimestamp:1;//!<If 1, append a timestamp to the packet in the RX queueuint8_t bAppendStatus:1;//!<If 1, append a status byte to the packet in the RX queue} rxConf;因为我发送的是32字节的数据,因此可以在中断接收里面
/* Called for every received packet and command done */ void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e) {if ((e & RF_EventLastCmdDone) && (RF_cmdPropTx.status == PROP_DONE_OK)){Send_Ok_Flag = 20;}if (e & RF_EventRxEntryDone){do{currentDataEntry = RFQueue_getDataEntry();//第一次安全防护,消息id与自身id校验uint8_t check = 0;for(i=0; i<6; i++){if((*(uint8_t*)(¤tDataEntry->data + 1 + i)) == mac[i])check++;}if(check < 6)//如果不是指定给这个网关,对比一下是不是广播地址{if((*(uint8_t*)(¤tDataEntry->data + 1 + 31))==0x00 && (*(uint8_t*)(¤tDataEntry->data + 1 + 30))==0x06){check = 0;for(i=0; i<6; i++){if((*(uint8_t*)(¤tDataEntry->data + 1 + i)) == 0xef){check++;}}if(check == 6)GB_Flag = 1;//如果接收到网关的广播组网信息}}if(check == 6){RF_re_packetLength= *(uint8_t*)(¤tDataEntry->data);//the length of the dataRF_re_packetDataPointer =(uint8_t*)(¤tDataEntry->data + 1); //the first pointer of the datamemcpy(RF_re_packet, RF_re_packetDataPointer, RF_re_packetLength);//copy the data of the first pointer//如果是配对信息,那么添加信号强度到29的位置if(RF_re_packet[31]==0x00 || RF_re_packet[31]==0x03 || RF_re_packet[31]==0xa3){RF_re_packet[29] = *((uint8_t*)(¤tDataEntry->data)+33);//在最后就可以读取信号强度}if(RF_re_packet[31]==0x00 && RF_re_packet[30]==0x02){RF_re_packet[29] = (~RF_re_packet[29] + 0x01) & 0x7f;Add_Node(List_RF_dbm,RF_re_packet);//添加到配对信息存储链表中}//接收成功的标志,这样就可以在main函数里面处理了Recieve_ok = 1;}else{Recieve_ok = 0;}} while(RFQueue_nextEntry() == DATA_ENTRY_FINISHED);} }
user5611410:
回复 user4988634:
您好,我按照您的方法加了这个字段,但是数据接收不到了,除了加这个字段,还需要配置其他的么?
user4988634:
回复 user5611410:
MAX_LENGTH 这个长度加1试试看。因为之前你接收进队列,队列初始化的时候,也要把节点加长。估计是你这个长度没有加长。
Felix ZF:
回复 user4988634:
嗯,接收缓存要足够放下append的信息