博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#串口完全接收程序
阅读量:7088 次
发布时间:2019-06-28

本文共 3351 字,大约阅读时间需要 11 分钟。

 

待读:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)         {             int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致               RX_CNT += n;//增加接收计数               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;             int I = 0;//每次处理接收的时候,I从0开始。             while (I < data_num - 10)//遍历接收数据   ,//data_num  上次未处理数据长度。               {                 if (data_buf[I] == 0xaa && data_buf[I + 1] == 0xaa)//帧头                 {                     _frame_len = data_buf[I + 2];//帧长度()  0A                     _frame_num = data_buf[I + 3]; // 接收帧 在frame数组里的索引(功能)    01                      if ((data_num - I - 5) >= _frame_len) // 数据接收完毕  09                     {                         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)//接收帧 在frame数组里的索引(接收到的数据的类型)                             {                                 case 1://STATUS                                     j = I + 4;                                     S_acc_x = (float)((Int16)(data_buf[j] << 8 | data_buf[j + 1])) / 100;//字节处理                                     S_acc_y = (float)((Int16)(data_buf[j + 2] << 8 | data_buf[j + 3])) / 100;//2字节                                     //D_ang_yaw = (float)((Int16)(data_buf[j + 4] << 8 | data_buf[j + 5])) / 100;//                                     S_acc_1 = (Int16)(data_buf[j + 6] << 8 | data_buf[j + 7]);//2字节                                     S_acc_5 = (Int32)(data_buf[j + 8] << 24 | data_buf[j + 9] << 16 | data_buf[j + 10] << 8 | data_buf[j + 11]);//4字节                                          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) // 剩几字节没有处理完,,,处理一个字节,I 就增加1。    data_num 未处理的长度             {                 for (int j = I; j <= data_num - 1; j++)                 {                     data_buf[j - I] = data_buf[j];//将没有处理完的数据放到 数组的最前面。                    }                 data_num = data_num - I;             }         }

 

转载于:https://www.cnblogs.com/rechen/p/5078442.html

你可能感兴趣的文章
Scintilla and SciTE
查看>>
学习之路十五:C#基础知识简单梳理
查看>>
最近很忙
查看>>
Html中table显示空单元格的方法及table标签属性总结
查看>>
WPF 获取文件运行目录
查看>>
使用emma对web工程进行测试覆盖率检查
查看>>
android activity生命周期
查看>>
距离和相似度度量[转]
查看>>
mysql在创建存储函数时报错
查看>>
ADO.net DataTable 和Amazon SimpleDB的相互转换
查看>>
【英语天天读】Choose Optimism
查看>>
恢复Ext3下被删除的文件(转)
查看>>
Direct3D 开发之旅 3D 游戏基本概念的介绍1
查看>>
sc windows服务常用命令
查看>>
如何使用ftp从Metalink上下载补丁
查看>>
Oracle 中int , number的区别
查看>>
shell循环语法
查看>>
ORACLE SQL:经典查询练手第五篇
查看>>
ABAP-Note002
查看>>
【TDS学习笔记】Offline Backup/Restore the TDS
查看>>