c#串口完全接收程序

待读:

  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;
             }

         }
时间: 2024-08-03 18:37:58

c#串口完全接收程序的相关文章

单片机下串口(UART)协议包接收程序

该段代码仅仅是本人使用过的一段,非原创也不算抄袭,如果代码有什么不恰当.不优雅的地方,欢迎在评论留下宝贵的建议和意见. 代码编写在51单片机上,用于从接收缓冲区中提取有用数据(协议包).基本逻辑亦可用于其他语言,其他情况下的接收程序. 数据的转移主要分了3步,接收缓冲区=>待处理数据=>有用数据. 接收缓冲区提取到待处理数据:由于可能下一个包马上就要过来,所以应把数据提取出来再做处理,以免直接处理的过程中收到新的数据造成混乱. 待处理数据提取到有用数据:例如在某些环境下,会收到其他协议的包(由

基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?

============问题描述============ RT:基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗? 我的程序有两个 Activity,在启动后的 Activity 中已经验证了接收与发送数据. 后继做了第二个 Activity,此时从第二个 Activity 返回 第一个 Activity 时串口的接收线程会出错.调试了一下,串口再次被初始化了. 问题: (1)不想串口被反复初始化,应该如何做?

【转】搞定单片机多字节串口接收(串口多字节接收发送的高阶研究)

搞定单片机多字节串口接收(串口多字节接收发送的高阶研究) 原文地址:http://bbs.ednchina.com/BLOG_ARTICLE_3007162.HTM 工作了一年多,写了不少单片机串口程序.感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回复一字节只是多了一个循环. 串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了.然而在实际应用当中,基本

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十三:串口模块② &mdash; 接收

实验十三:串口模块② - 接收 我们在实验十二实现了串口发送,然而这章实验则要实现串口接收 ... 在此,笔者也会使用其它思路实现串口接收. 图13.1 模块之间的数据传输. 假设我们不考虑波特率,而且一帧数据之间的传输也只是发生在FPGA之间,即两只模块之间互转,并且两块模块都使用相同的时钟频率,结果如图13.1所示.只要成立上述的假设成立,串口传输不过是简单的数据传输活动而已,图中的发送模块经由TXD将一帧11位的数据发送至接收模块. 图13.2 发送与接收一帧数据. 至于两者之间的时序过程

VC++编写简单串口上位机程序

转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面.写上位机程序的编程语言.编译环境等不少,VB.C#.LABVIEW等等,我会的语言很 少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相 当蹩脚的C++写出了一个简单的串口上位机程序,分享一下

c# 串口发送接收数据

/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { UTF8Encoding uTF8Encoding = new UTF8Encoding(); byte[] readBytes = new byte[this.SerialPort.BytesToRe

C# ---串口发送接收数据实例

硬件设备: pH/ORP 电导率/TDS/盐度 溶解氧 2000/3000/5000/5500 变送器/控制器 设定: P-08:RS-485输出设定 P-11:485传输设定 设定这俩种的ID号 根据ID,对串口发送请求:接收串口返回的数据. C# ---串口发送接收数据实例

标准红外遥控的接收程序-松瀚汇编源程序

/**************************************************** 名称: 标准红发遥控 接收程序--4BYTE 平台为: 松瀚SN8P2511 接收方式为 定时中断接收 中断定时时间为100U *****************************************************/ ;寄存器定义 STS1 DS 1 F_IRECOK EQU STS1. 0 ;接收到一帖数据 T_IRSTA DS 1 T_IRNUMPOSI DS 1

C#----串口数据接收发送

虚拟串口驱动工具,创建俩个虚拟串口,如图: 创建两个Console模拟串口的发送接收数据 C#串口数据接收发送,类空间: using System.IO.Ports; C# 串行端口 接收数据,代码如下: //遍历串行端口名称数组 foreach (string port in System.IO.Ports.SerialPort.GetPortNames()) { Console.WriteLine(port); } byte[] b = new byte[32]; SerialPort sp