首页 > Windows开发 > 详细

c# 串口所有数据接收 到串口的数据全部处理

时间:2015-12-26 13:11:11      阅读:491      评论:0      收藏:0      [点我收藏+]
         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;
                 }
             }
         }

 

c# 串口所有数据接收 到串口的数据全部处理

原文:http://www.cnblogs.com/rechen/p/5077796.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!