void Data_Protocal_Package(Data_Protocal * package, U8 property, INT8 *buf, U8 data_length) { if(package == NULL || buf == NULL || data_length == 0) { printf("Input error!\n"); return; } if(data_length > MAX_DATA_LENGTH) { printf("Data is too long, Please consider subpackage.\n"); return; } package->head[0] = HEAD; package->length[0] = data_length + 6; /*length = 一帧数据的长度 = 协议长度+数据长度*/ package->property[0] = property; memcpy(package->data, buf, data_length); package->crc_fsc = CRC16_Check((U8 *)package + 1,data_length + 3,CRC_INIT); #ifdef DEBUG printf("CRC is %d\n",package->crc_fsc); #endif package->tail[0] = TAIL; }
int Rev_Process(U8 * rev_buf, int data_start_pos, int data_end_pos) { int i = 0; int pos = 0; int head_flag = 0, tail_flag = 0; msg_que msg_buf; int err = 0; U8 one_frame[(MAX_DATA_LENGTH + PROTOCAL_LENGTH)*2] = {0}; //考虑到发生端发送的所有数据都经过转义这种情况 所以大小是2倍协议长 U8 package[(MAX_DATA_LENGTH + PROTOCAL_LENGTH)] = {0}; int crc = 0; for( ; data_start_pos < data_end_pos; data_start_pos++ ) { if( HEAD == rev_buf[data_start_pos] ) { pos = data_start_pos; head_flag = 1; } else if(TAIL == rev_buf[data_start_pos] && 1 == head_flag ) { tail_flag = 1; } if( 1 == tail_flag ) //tai_flag =1 为接受完整的一帧数据 下面进一步处理如 反转义和CRC校验 { memcpy(one_frame, rev_buf + pos, data_start_pos - pos + 1); #ifdef DEBUG printf("Before Reveres_Escape:\n"); for(i = 0; i < data_start_pos - pos + 1; i++) { printf(" %x ",one_frame[i]); } printf("\n"); #endif Reverse_Escape_Character(one_frame, package); #ifdef DEBUG printf("REV CRC value is %d \n", package[package[1] - 3]*256 + package[package[1] - 2]); #endif crc = CRC16_Check(package + 1, package[1] - 2, CRC_INIT); if( 0 == crc ) { #ifdef DEBUG printf("crc check is success!\n"); #endif #ifdef RESULT printf("Property is :%d\n Key is:%d\n", package[2], package[3]); #endif msg_buf.msg_type = package[2]; msg_buf.data[0] = package[3]; //MSG_QUE_ID = msgget(MSG_QUE_KEY,IPC_EXCL); // printf("%d\n",MSG_QUE_ID); err = msgsnd(MSG_QUE_ID, (void *)&msg_buf, sizeof(msg_buf) - sizeof(long), IPC_NOWAIT); if(err < 0) { printf("Mssage queue send data failed!\n"); } else { #ifdef RESULT printf("Mssage queue send data success!\n"); #endif } } else { printf("crc check is failed!\n"); } head_flag = 0; tail_flag = 0; pos = 0; #ifdef DEBUG printf("After Reveres_Escape:\n"); for(i = 0; i < package[1]; i++) { printf(" %x ",package[i]); } printf("\n"); #endif } } return pos; }
uint8_t* iM880A_CbProcessRxMessage(uint8_t* rxBuffer, uint16_t length) { // 1. check CRC if (CRC16_Check(rxBuffer, length, CRC16_INIT_VALUE)) { // 2. check min length, 2 bytes for SapID + MsgID + 2 bytes CRC16 if(length >= (WIMODLR_HCI_MSG_HEADER_SIZE + WIMODLR_HCI_MSG_FCS_SIZE)) { // add length RxMessage.Length = length - (WIMODLR_HCI_MSG_HEADER_SIZE + WIMODLR_HCI_MSG_FCS_SIZE); // dispatch completed RxMessage // 3. forward message according to SapID / MsgID switch(RxMessage.SapID) { case DEVMGMT_ID: // forward Msg IDs to application, e.g. ping response (*cbLoRaWANHCIResponse)(RxMessage.MsgID, RxMessage.Payload, length); break; case LORAWAN_ID: // handle TX indications if((RxMessage.MsgID == LORAWAN_MSG_SEND_UDATA_TX_IND) || (RxMessage.MsgID == LORAWAN_MSG_SEND_CDATA_TX_IND) || (RxMessage.MsgID == LORAWAN_MSG_JOIN_NETWORK_TX_IND)) { (*cbMsgIndication)(NULL, 0, trx_TXDone); } // handle RX messages else if((RxMessage.MsgID == LORAWAN_MSG_RECV_UDATA_IND) || (RxMessage.MsgID == LORAWAN_MSG_RECV_CDATA_IND)) { (*cbMsgIndication)(RxMessage.Payload, length, trx_RXDone); } // handle ACKs else if(RxMessage.MsgID == LORAWAN_MSG_RECV_ACK_IND) { (*cbMsgIndication)(NULL, 0, trx_ACKDone); } // handle other responses else { (*cbLoRaWANHCIResponse)(RxMessage.MsgID, RxMessage.Payload, length); } break; default: // handle unsupported SapIDs here break; } } } else { // handle CRC error } // return same buffer again, keep receiver enabled return &RxMessage.SapID; }