在数据转换和指定协议发送数据的时候要注意数据的类型:
eg:
发送一个8bit的单字节数据而且这个数是带符号的:
0xA5
10进制:165
2进制:10100101
串口接收后我们看见16进制数据是0xA5,rssi
下面是发送端数据:
if(deviceInfo->pEvtData[24] == 0x24) {
if (deviceInfo->rssi) {
rxBuf[0] = 0x55;
//Major
rxBuf[1] = deviceInfo->pEvtData[25];
rxBuf[2] = deviceInfo->pEvtData[26];
//Minor
rxBuf[3] = deviceInfo->pEvtData[27];
rxBuf[4] = deviceInfo->pEvtData[28];
//rssi
rxBuf[5] = deviceInfo->rssi;
//checksum
rxBuf[6] = 0xFF;
My_UART_WriteTransport(rxBuf, 7); }
typedef struct
{
osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status
uint8 opcode; //!< GAP_DEVICE_INFO_EVENT
uint8 eventType; //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES
uint8 addrType; //!< address type: @ref GAP_ADDR_TYPE_DEFINES
uint8 addr[B_ADDR_LEN]; //!< Address of the advertisement or SCAN_RSP
int8 rssi; //!< Advertisement or SCAN_RSP RSSI
uint8 dataLen; //!< Length (in bytes) of the data field (evtData)
uint8 *pEvtData; //!< Data field of advertisement or SCAN_RSP
} gapDeviceInfoEvent_t;
可以看到rssi本身是一个char 类型的,所以是一个带符号数,所以在协议中约定:
在接收后我们按char 型接收打印可以看到,值位-91,如果按int 型或无符号型都是165,这是因为在计算机中整型按反码存储,最高位是符号位,1代表是负数,0是整数,
如果是int 10100101在最高位不是1, 所以不会是负数