int data_num = 0;//上次未处理数据长度 byte[] data_buf = new byte[50000];//存放上次未处理数据
接收处理程序:
else { int _frame_num = 0; // 接收帧在frame数组里的索引, int _frame_len = 0; // 帧长度 , if (n > 20000) return;//接收到的数据过长,可能出错 serialPort1.Read(data_buf, data_num, n);//读取缓冲数据,从data_buf的第data_num处开始写入,与之前未处理数据连接在一起 data_num += n;//未处理的数据位置 重新定位到 data_num + n int I = 0;// while (I < data_num - 4)//遍历接收数据 { if (data_buf[I] == 0xaa && data_buf[I + 1] == 0xaa && data_buf[I + 3] < 51) { _frame_num = data_buf[I + 2]; _frame_len = data_buf[I + 3]; if ((data_num - I - 5) >= _frame_len) // 数据接收完毕 { byte sum = 0; for (int j = I; j <= I + 3 + _frame_len; j++)//计算sum sum += data_buf[j]; if (sum == data_buf[I + 4 + _frame_len])//sum校验通过 { int j; switch (_frame_num) { case 2://传感器数据 j = I + 4; S_acc_x = (Int16)(data_buf[j] << 8 | data_buf[j + 1]); S_acc_y = (Int16)(data_buf[j + 2] << 8 | data_buf[j + 3]); S_acc_z = (Int16)(data_buf[j + 4] << 8 | data_buf[j + 5]); S_gyr_x = (Int16)(data_buf[j + 6] << 8 | data_buf[j + 7]); S_gyr_y = (Int16)(data_buf[j + 8] << 8 | data_buf[j + 9]); S_gyr_z = (Int16)(data_buf[j + 10] << 8 | data_buf[j + 11]); S_mag_x = (Int16)(data_buf[j + 12] << 8 | data_buf[j + 13]); S_mag_y = (Int16)(data_buf[j + 14] << 8 | data_buf[j + 15]); S_mag_z = (Int16)(data_buf[j + 16] << 8 | data_buf[j + 17]); break; default: break; } I = I + 5 + _frame_len; // I指向下一帧数据 } else//sum校验未通过 { I++; } } else//HEAD FUN LEN符合要求,但是数据未接收完毕 { for (int j = I; j <= data_num - 1; j++) { data_buf[j - I] = data_buf[j]; } data_num = data_num - I; return; } } else//HEAD FUN LEN 不符合要求 { I++; } } if (I < data_num) // 剩几字节没有处理完 { for (int j = I; j <= data_num - 1; j++) { data_buf[j - I] = data_buf[j]; } data_num = data_num - I; } } }
原文:http://www.cnblogs.com/rechen/p/5077796.html