主题中讨论的其他部件:CC1310, CC1000
大家好,
我正在处理一个项目,我从CC1310上的旧CC1000发送器接收数据,并在rfPacketRx示例中解包和解码这些数据。
我在观看'packet'表达式时正确地收到了我的数据包。 我应该收到以下十六进制数据包:
66 55 66 A6 A5 59 AA 55 55 55 55 99
下图是我正在观看数据包表达。 当将 我收到的十进制数转换回十六进制时,它们与我的数据包对应,因此我知道它是正确接收的:

但是,当我尝试将数据包变量写入UART时,它会写入char值。 通常这不是问题,但正如您在上看到的,例如packet[2],我收到非常奇怪的值"\xa6",它不是真正的字符值。
我的问题是:如何打印十进制值?
提前感谢。
KR,
Mirte H
下面是我使用的代码(rfPacketRx.C):
/***** 包括***** /
/*标准C库*/
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
/* TI驱动程序*/
#include <ti/drivers/RF/RF.h>
#include <ti/drivers/PIN.h>
#include <ti/drivers/UART.h>
#include <ti/drivers/GPIC.h>
/* Driverlib Header文件*/
#include DeviceFamily_construtPath(driverlib/RF_prop_mailbox.h)
/*主板标题文件*/
包含"Board.h"
/*应用程序头文件*/
#include "RFQueue.h"
包括"SmartRF_settings/SmartRF_settings.h"
/***** 定义***** /
/*数据包RX配置*/
#define data_entry_header_size 15 /*通用数据条目的常量标头大小*/
#define MAX_LENGTH 18 /*对讲机将接受的最大长度字节*/
#define NUM_DATA_entries 20 /*注:目前仅支持两个数据条目*/
#define NUM_appended_bytes 2/*数据条目数据字段将包含:
* 1标头字节(RF_cmdProprx.rxConf.bIncludeHdr = 0x1)
*最多30个有效负载字节
* 1状态字节(RF_cmdProprx.rxConf.bAppendStatus = 0x1)*/
/***** 原型***** /
静态空回调(RF_handle h,RF_CmdHandle ch,RF_EventMask e);
/***** 变量声明***** /
静态RF_Object rfObject;
static RF_handle rfHandle;
/*插针拆装器手柄*/
static PIN_handle ledPinHandle;
static PIN_State ledPinState;
/*缓冲区,包含用于接收数据的所有数据条目。
*需要pragma以确保此缓冲区是4字节对齐的(RF内核的要求)*/
#if defined(__TI_Compiler_version__)
#pragma data_align (rxDataEntryBuffer, 4);
静态uint8_t.
rxDataEntryBuffer[RF_QUEUE_DATA_Entry_BUFFER_SIZE (NUM_DATA_entries,
max_length,
num_appended_bytes)];
#Elif已定义(__IAR_SYSTEMS _ICC__)
#pragma data_alignment = 4
静态uint8_t.
rxDataEntryBuffer[RF_QUEUE_DATA_Entry_BUFFER_SIZE (NUM_DATA_entries,
max_length,
num_appended_bytes)];
#Elif已定义(__GMNU__)
静态uint8_t.
rxDataEntryBuffer[RF_QUEUE_DATA_Entry_BUFFER_SIZE (NUM_DATA_entries,
max_length,
num_appended_bytes)]
__attribute__((已对齐(4)));
#否则
错误不支持此编译器。
#endif
/*接收数据RF内核要填充数据的队列*/
静态数据Queue_t数据队列;
静态RFC_dataEntryGeneral _t* currentDataEntry;
静态uint8_t packetLength;
静态uint8_t* packetDataPointer;
static uint8_t packet[MAX_length + NUM_appended_bytes -1];/*长度字节存储在单独的变量*/中
/*
*应用LED引脚配置表:
*-所有LED板指示灯均熄灭。
*/
PIN_Config pin表[]=
{
Board_PIN_LED2 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
/***** 函数定义***** /
void packetToUart(uint8_t pckt[]);
void packetToUart(uint8_t pckt[]){
UART_HANDLE UART;
UART_Params uartParams;
/*调用驱动程序初始化函数*/
UART_INIT();
/*创建数据处理关闭的UART。 */
UART_PARAM_INIT (&uartParams);
uartParams.writeDataMode = UART_DATA_binary;
uartParams.baudrate = 4800;
UART = UART_OPEN (Board_UART0,&uartParams);
IF (UART ==空){
/* UART_OPEN ()失败*/
同时(1);
}
// uint8_t* print[]={&pckt[0]};
UART_WRITE (UART,&pckt[0],12);
UART_WRITE (UART,"\n",2);
}
void *mainThread(void *arg0)
{
RF_Params rfParams;
rf_params_init(&rfParams);
/* LED针脚开路*/
ledPinHandle = PIN_OPEN (&ledPinState,PinTable);
IF (ledPinHandle ==空)
{
同时(1);
}
IF( RFQueue_DefineQueue(&dataQueue,
rxDataEntryBuffer,
sizeof(rxDataEntryBuffer),
num_data_entries,
max_length + NUM_appended_bytes))
{
/*无法为所有数据条目分配空间*/
同时(1);
}
/*修改CMD_PROP_RX命令以满足应用程序需求*/
/*设置接收数据的数据实体队列*/
rf_cmdProprx.pQueue =数据队列;
RF_cmdProprx.pktConf.bRepeatOk = 1;
RF_cmdProprx.pktConf.bRepeatNok = 1;
/*请求访问对讲机*/
#IF已定义(DeviceFamily_CC26X0R2)
rfHandle = RF_OPEN (&rfObject,&RF_prop,(RF_RadioSetup*)&RF_cmdPropRadioSetup,&rfParams);
#否则
rfHandle = RF_OPEN (&rfObject,&RF_prop,(RF_RadioSetup*)&RF_cmdPropRadioDivSetup,&rfParams);
#endif// DeviceFamily_CC26X0R2
/*设置频率*/
RF_postCmd (rfHandle,(RF_Op*)&RF_cmdF,RF_PriorityNormal,NULL,0);
/*进入RX模式并永久保持RX */
RF_EventMask终结符Reason = RF_runCmd (rfHandle,(RF_Op*)&RF_cmdPropRx,
RF_PriorityNormal,回调(&C),
RF_EventRxEntryDone);
交换机(终端原因)
{
案例RF_EventLastCmdDone:
//独立对讲机操作命令或最后一个对讲机
//链中的操作命令已完成。
中断;
案例RF_EventCmdlet已取消:
//命令在启动之前被取消;可能会导致该问题
//由RF_cancelCmd()或RF_FlushCmd()。
中断;
案例RF_EventCmdlet已中止:
//由RF_cancelCmd()或引起的突然命令终止
// RF_flushCmd()。
中断;
案例RF_EventCmdlet:
//由RF_cancelCmd ()或引起的正常命令终止
// RF_flushCmd()。
中断;
默认:
//未捕获的错误事件
同时(1);
}
UINT32_t cmdStatus =((volatile RF_Op*)&RF_cmdProprx)->状态;
交换机(cmdStatus)
{
案例PROP_DON_OK:
//通过CRC接收的数据包正常
中断;
案例PROP_DON_RXERR:
//收到数据包时出现CRC错误
中断;
Case PROP_DON_RXTIMEOUT:
//同步搜索时观察到的结束触发器
中断;
案例PROP_DON_Break:
//在接收数据包时,当命令为时,观察到的结束触发器
//配置了endType设置为1
中断;
问题PROP_DON_END_END_END_END:
//在观察结束触发后收到的数据包;如果是
//命令配置为endType设置为0,即结束触发器
//不会终止正在进行的接收
中断;
案例PROP_DON_STOPPED:
//命令启动后收到CMD_STOP,如果找到同步,
//接收数据包
中断;
案例PROP_DON_ABORT:
//命令启动后收到CMD_ABORT
中断;
案例PROP_ERROR_RXBUF:
//没有足够大的RX缓冲区可用于接收到的数据
//数据包的开始
中断;
案例PROP_ERROR_RXFULL:
//接收部分读取时RX缓冲空间不足
中断;
问题PROP_ERROR_PAR:
//观察到的非法参数
中断;
案例PROP_ERROR_NO_SETUP:
//在支持的中发送命令,但未设置对讲机
//模式使用CMD_PROP_RADIO_SETUP或CMD_RADIO_SETUP
中断;
案例PROP_ERROR_NO_FS:
//发送的命令没有对合成器进行编程
中断;
案例PROP_ERROR_RXOVF:
//操作期间观察到RX溢出
中断;
默认:
//未捕获的错误事件-这些可能来自
// rf_mailbox.h中定义的状态池
同时(1);
}
同时(1);
}
void callback (RF_handle h,RF_CmdHandle ch,RF_EventMask e)
{
IF (E和RF_EventRxEntryDone)
{
/*切换引脚以指示RX */
PIN_setOutputValue (ledPinHandle,Board_PIN_LED2,
!PIN_getOutputValue(Board_PIN_LED2);
/*获取当前未处理的数据输入*/
currentDataEntry = RFQueue_getDataEntry ();
/*处理分组数据,位于¤tDataEntry -> data:
*-长度是当前配置的第一个字节
*-数据从第二个字节*/开始
packetLength =*(uint8_t*)(¤tDataEntry -> data);
packetDataPointer =(uint8_t*)(¤tDataEntry -> data +1);
/*将有效负载+状态字节复制到数据包变量*/
memcpy (packet,packetDataPointer,(packetLength + 1));
PacketToUart(packet);
RFQueue_nextEntry();
}
}

