public:
std::string input;
//0x11, 0x22, 0x33
const std::string packet_start = "\x11\x22\x33"; //帧头
int data_packet_start;
#define BASE_CALLBACK_PACKAGE_LENGTH 28
std::string readMsg;
if (serialPort.available())
{
unsigned char recvDispose[BASE_CALLBACK_PACKAGE_LENGTH];
readMsg = serialPort.read(serialPort.available());
printf("read %i new characters from serial port, adding to %i characters of old input.\n", (int)readMsg.size(), (int)input.size());
input += readMsg;
while (input.length() >= BASE_CALLBACK_PACKAGE_LENGTH) // while there might be a complete package in input
{
// parse for data packets
data_packet_start = input.find(packet_start);
if (data_packet_start != std::string::npos)
{
printf("found possible start of data packet at position %d\n", data_packet_start);
if ((input.length() >= data_packet_start + BASE_CALLBACK_PACKAGE_LENGTH) && /*校验位算式*/CheckDigit((unsigned char*)input.c_str() + data_packet_start, BASE_CALLBACK_PACKAGE_LENGTH))
{
memcpy(recvDispose, input.c_str() + data_packet_start, BASE_CALLBACK_PACKAGE_LENGTH);
printf("...right data is : ");
for (int m = 0;m < 28;m++)
{
printf("0x%02x, ", recvDispose[m]);
}
printf("\n");
/*帧数据处理函数写在此处*/
input.erase(0, data_packet_start + BASE_CALLBACK_PACKAGE_LENGTH); // delete everything up to and including the processed packet
}
else
{
if (input.length() >= data_packet_start + BASE_CALLBACK_PACKAGE_LENGTH)
{
input.erase(0, data_packet_start + 1); // delete up to false data_packet_start character so it is not found again
}
else
{
// do not delete start character, maybe complete package has
// not arrived yet
input.erase(0, data_packet_start);
}
}
}
else
{
// no start character found in input, so delete everything
printf("No start character found in input \n");
input.clear();
}
}
}
else
printf("Serial not available\n");
串口持续接收协议数据,接收到数据放到一个缓存区中,比较帧头,若有帧则处理,若无,则删掉。应该不会丢数据