public void sendPacket(SerialPortPacket packet) { mSendPacketLock.waitForUnlock(); if (mSendPacket.Count < MAX_SEND_PACKET_COUNT) { mSendPacket.Add(packet); } mSendPacketLock.unlock(); }
protected bool parseThread() { if (mInputDataSize > 0) { mInputBufferLock.waitForUnlock(); // 首先解析包头 PacketHeader header = new PacketHeader(GameDefine.REPORT_IN); PARSE_RESULT result = header.parseData(mInputBuffer, mInputDataSize); // 解析失败,则将缓冲区清空 if (result == PARSE_RESULT.PR_ERROR) { clearInputBuffer(); } // 数据不足,继续等待接收数据 else if (result == PARSE_RESULT.PR_NOT_ENOUGH) { ; } // 解析成功,判断包类型,继续解析 else if (result == PARSE_RESULT.PR_SUCCESS) { SerialPortPacket packet = createPacket(mInputBuffer[header.mHeaderLength]); if (packet != null) { int offset = 0; packet.parseData(header, mInputBuffer, mInputDataSize, ref offset); // 解析数量与包头不一致,清空缓冲区 if (offset != header.mHeaderLength + header.mPayloadLength) { clearInputBuffer(); } // 解析正确,移除已解析的数据 else { removeDataFromInputBuffer(0, offset); // 加入接收的消息包列表 mReceivedPacketLock.waitForUnlock(); if (mReceivedPacket.Count < MAX_RECEIVE_PACKET_COUNT) { mReceivedPacket.Add(packet); } mReceivedPacketLock.unlock(); } mLastPacketTime = DateTime.Now; } else { clearInputBuffer(); } } mInputBufferLock.unlock(); } return(true); }