话不多说,直接上马,太累了

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace CSDN
{public class MySerialPort{private SerialPort SerialPort;private Thread recvThread;// 指示线程是否正在工作private bool threadRunning = false;private volatile int bytesToRead = 0;  //volatile 关键字指示一个字段可以由多个同时执行的线程修改private byte[] Data = new byte[16 * 1024 * 1024];//定义存数据的容量private int EndOffset;//存取数据后,最后一条数据是第几位/// <summary>/// 为了方便没有写单例模式,需要可以优化下/// </summary>/// <param name="PortName"></param>/// <param name="BaudRate"></param>public MySerialPort(string PortName,int BaudRate){SerialPort = new SerialPort();SerialPort.PortName = PortName;SerialPort.BaudRate = BaudRate;SerialPort.ReadBufferSize = 16 * 1024 * 1024;SerialPort.WriteBufferSize = 1024 * 32;SerialPort.ReadTimeout = 200;SerialPort.WriteTimeout = 200;if (SerialPort.IsOpen){try{SerialPort.Close();}catch (Exception) { }}}#region  简单的应用场景/// <summary>/// 触发扫码枪扫码/// </summary>/// <returns></returns>public string ScanBarCode(){//以霍尼韦尔扫码枪为例string lon = "\x02LON\x03";   // 开指令Byte[] sendBytes = ASCIIEncoding.ASCII.GetBytes(lon);if (!SerialPort.IsOpen)SerialPort.Open();SerialPort.ReadExisting();string code = "";for (int i = 0; i < 10; i++){SerialPort.Write(sendBytes, 0, sendBytes.Length);if (code == "")code = SerialPort.ReadExisting();elsebreak;}lon = "\x02LOFF\x03";   // 关指令sendBytes = ASCIIEncoding.ASCII.GetBytes(lon);SerialPort.Write(sendBytes, 0, sendBytes.Length);return code;}#endregion#region  需要一直不断地进行接受数据,对数据进行处理时/// <summary>/// 打开串口,新建一个线程,实时的读取串口中的数据/// </summary>public void Open(){if (!SerialPort.IsOpen){SerialPort.Open();}if (recvThread != null){if (recvThread.IsAlive){recvThread.Abort();                   }recvThread = null;}if (recvThread == null){threadRunning = true;recvThread = new Thread(new ThreadStart(recvThreadFunc));recvThread.Priority = ThreadPriority.Highest;recvThread.Start();}}public void Stop(){if (!SerialPort.IsOpen) return;try{SerialPort.Close();}catch (Exception) { }threadRunning = false;if (recvThread != null && recvThread.IsAlive){try{recvThread.Join(100);}catch (Exception) { }recvThread = null;}}/// <summary>/// 线程负责接收数据和处理数据/// </summary>private void recvThreadFunc(){bytesToRead = 0;while (true){if (!threadRunning)break;try{int n = SerialPort.BytesToRead;if (n != bytesToRead){bytesToRead = n;bytesToRead-=ReadData(n);}}catch (Exception e){}}}/// <summary>/// 主要存储和处理数据的地方/// </summary>/// <param name="count"></param>/// <returns></returns>private int ReadData(int count){int bytesRead = 0;if (EndOffset+ count< Data.Length){bytesRead += SerialPort.Read(Data, EndOffset, count);EndOffset += count;}else{int len1 = Data.Length - EndOffset;//当前的剩余容量int len2 = Math.Min(count, Data.Length) - len1;//超出的数据部分bytesRead += SerialPort.Read(Data, EndOffset, len1);//加载到数据容器的最后bytesRead += SerialPort.Read(Data, 0, len2);//加载到数据容器的前面EndOffset = len2;}while (EndOffset > 0){//开始做数据处理//假如得到了想要的一组数据byte[] _data= new byte[10];Array.Copy(Data,0, _data,0,10);//将Data中的从第0个开始的10个数据,拷贝到目标数据_data中EndOffset -= 10;//数据存储位往前挪10}return bytesRead;}/// <summary>/// 写入数据,package需要提前封包好/// </summary>/// <param name="package"></param>public void Send(byte[] package){try{SerialPort.Write(package, 0, package.Length);}catch {}}#endregion}
}

C# 串口通讯协议的整理:(一)简单的扫码枪(霍尼韦尔)使用(二)不断地监听、读取、处理串口通讯发送过来的数据相关推荐

  1. 串口监听工具listen_串口命令解析

    第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁.天哪,我可不是武断,算了.不要太绝对了.99.9%的人吧,都遇到过这个问 ...

  2. 霍尼韦尔和陕西西咸新区签订投资战略协议;雀巢专业餐饮成都客户交流体验中心落成 | 美通企业日报...

    今日看点 霍尼韦尔宣布和陕西西咸新区签订投资战略协议.根据协议,霍尼韦尔计划将在陕西西咸新区投资开展以旗下智能建筑科技业务为主的运营,研发.市场和销售,整体投资规划将分阶段实施,一期项目将重点围绕消防 ...

  3. pks系统怎么切换服务器,霍尼韦尔PKS系统维护及简单故障处理ppt课件

    <霍尼韦尔PKS系统维护及简单故障处理ppt课件>由会员分享,可在线阅读,更多相关<霍尼韦尔PKS系统维护及简单故障处理ppt课件(48页珍藏版)>请在人人文库网上搜索. 1. ...

  4. 移通创联MODBUS转PROFIBUS网关和霍尼韦尔DCS系统之间通讯

    摘要:本文介绍了如何利用MODBUS转PROFIBUS现场总线网关实现西门子S7-300PLC和霍尼韦尔DCS系统之间的通讯. 1. 通信系统的构成以及实现方法 Honeywell的DCS系统通讯采用 ...

  5. 提供霍尼韦尔PLC协议脚本

    霍尼韦尔(Honeywell) PLC 的协议脚本可能因型号而异.常见的协议有 Modbus TCP/IP.Ethernet/IP 和 Profinet.如需更具体的脚本,建议查询霍尼韦尔的相关文档或 ...

  6. 霍尼韦尔和顺丰航空签署零备件采购协议

    中国珠海2021年9月28日 /美通社/ -- 霍尼韦尔(纳斯达克证券交易所代码:HON)和顺丰航空有限公司(以下简称"顺丰航空")在第十三届中国国际航空航天展览会上签署零备件采购 ...

  7. socket监听端口实现实时通讯

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  8. C# TCP/IP通讯协议的整理(三)附带——与倍福PLC通讯

    首先,需要一个和倍福PLC通讯的dll,一般厂家会提供 添加到引用后,直接创建通讯类 using System; using System.Collections.Generic; using Sys ...

  9. C# TCP/IP通讯协议的整理(一)附带——基恩士扫码枪的使用

    先新建一个TcpClient的类 using System; using System.Collections.Generic; using System.Linq; using System.Net ...

最新文章

  1. Windows Live Writer发布测试
  2. 7 大主题!梳理神经网络中 Normalization 的发展历程
  3. 扯淡设计模式之装饰者模式
  4. 基于机器视觉的缺陷检测汽车零部件
  5. 12.5寸新i5商务本 联想X220i报10888元
  6. boost创建线程池_Java并发 之 线程池系列 (1) 让多线程不再坑爹的线程池
  7. JavaFX中基于表达式的PathTransitions
  8. Python wxpy通过ModBus控制电脑鼠标和键盘
  9. 登录或连接MYSLQ 提示 error 1045 access denied for user 'root@127.0.0.1' 错误
  10. main run方法没用_多线程:解决Runnable接口无start()方法的问题
  11. 序列化二叉树(C++)
  12. 从传统文化中领悟贵金属白银现货走势分析方法
  13. 云栖大会day2总结 上午
  14. 萤石 python获取直播地址和画面
  15. Makefile中的CFLAGS、$^、$< 、$@
  16. 关于RECON-NG相关问题解决
  17. 前端大佬谈国产开源:VUE 的成功在于社区运营
  18. 单反相机风景摄影易记易学口诀
  19. 电商平台用户购买行为真实度的检测方法及系统
  20. 老闪创业那些事儿(外传)——教人与用人的撕裂

热门文章

  1. Apache国内镜像下载
  2. StarRocks从入门到精通系列六:使用EXPORT、Spark、Flink从StarRocks中导出数据
  3. ProjectCenter项目管理工具(8)
  4. Photoshop的版本体系
  5. html页面当记事本
  6. SWIG入门文档(翻译自官方网站)
  7. (这种方法简直就是在作弊) 7-25 一位的十六进制转换为十进制 (10 分) java
  8. UltraVNC学习
  9. 春节出行带个对讲机 旅行实测威诺VR-N65
  10. 2D场景导入粒子看不见的问题