C# SerialPort的使用
工具类SerialPort
- SerialPortBase类
SerialPortBase类
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Tools
{public class SerialPortBase{private List<byte> data = new List<byte>();public SerialPort SerialPort { get; set; }public event Action<SerialPort, byte[]> DataReceive;//用于接收数据/// <summary>/// "COM5",9600,"N",8,1/// </summary>/// <param name="portName">COM1</param>/// <param name="baudRate">9600 38400 </param>/// <param name="parity">None</param>/// <param name="dataBits">8</param>/// <param name="stopBits">one</param>public SerialPortBase(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits){SerialPort = new SerialPort();//串口名 = COM1SerialPort.PortName = portName;//波特率 = 9600 38400 SerialPort.BaudRate = baudRate;//奇偶校验 = NSerialPort.Parity = parity;//每个字节标准数据位 = 8SerialPort.DataBits = dataBits;//停止位 = 1SerialPort.StopBits = stopBits;//字节编码SerialPort.Encoding = Encoding.UTF8;//在添加到序列缓冲区前,是否丢弃接口上接收的空字节。SerialPort.DiscardNull = false;//在通信过程中,是否启用数据终端就绪行。SerialPort.DtrEnable = false;//获取或设置串行端口数据传输的握手协议。SerialPort.Handshake = Handshake.None;//获取或设置串行端口输出缓冲区的大小。常用的是2048或4096,2048足够用//serialPort.WriteBufferSize = 2048;//决定了当串口读缓存中数据多少个时才触发DataReceived事件SerialPort.ReceivedBytesThreshold = 1;SerialPort.DataReceived += SerialPort_DataReceived;}/// <summary>/// 默认COM1,9600,N,8,1/// </summary>public SerialPortBase(){SerialPort = new SerialPort();//串口名 = COM1//SerialPort.PortName = SerialPort.GetPortNames()[0];//波特率 = 9600 38400 SerialPort.BaudRate = 9600;//奇偶校验 = NSerialPort.Parity = Parity.None;//每个字节标准数据位 = 8SerialPort.DataBits = 8;//停止位 = 1SerialPort.StopBits = StopBits.One;//字节编码SerialPort.Encoding = Encoding.UTF8;//在添加到序列缓冲区前,是否丢弃接口上接收的空字节(byte = 0x00)。SerialPort.DiscardNull = false;//在通信过程中,是否启用数据终端就绪行。SerialPort.DtrEnable = false;//获取或设置串行端口数据传输的握手协议。SerialPort.Handshake = Handshake.None;//获取或设置串行端口输出缓冲区的大小。常用的是2048或4096,2048足够用//serialPort.WriteBufferSize = 2048;//决定了当串口读缓存中数据多少个时才触发DataReceived事件SerialPort.ReceivedBytesThreshold = 1;SerialPort.DataReceived += SerialPort_DataReceived;}private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){lock (data){try{int bytesToRead;while (SerialPort.IsOpen && (bytesToRead = SerialPort.BytesToRead) > 0){byte[] array = new byte[bytesToRead];SerialPort.Read(array, 0, bytesToRead);data.AddRange(array);}this.DataReceive?.Invoke(SerialPort, data.ToArray());}catch (Exception e2){Tools.Loger.err("tools_loghelper", e2);}finally{data.Clear();}}}#region 发送并返回数据byte[] bytesForSendReceived = null;//用于发送接收一体化的接收数据private Stopwatch sw = new Stopwatch();//用于发送接收一体化的定时器private bool isLoadDataReceive = false;//用于控制DataReceive += SerialPortBase_DataReceive;private void SerialPortBase_DataReceive(SerialPort arg1, byte[] arg2){bytesForSendReceived = arg2;}/// <summary>/// 发送并返回数据/// </summary>/// <param name="data"></param>/// <param name="timeout">3s带返回 TimeSpan.FromSeconds(3)</param>/// <returns></returns>public byte[] SendAndReceived(byte[] data, TimeSpan timeout){if (!SerialPort.IsOpen){throw new Exception("串口未打开!");}bytesForSendReceived = null;SerialPort.Write(data, 0, data.Length);sw.Reset();sw.Start();if (!isLoadDataReceive){DataReceive += SerialPortBase_DataReceive;isLoadDataReceive = true;}while (bytesForSendReceived == null && sw.Elapsed < timeout){System.Threading.Thread.Sleep(10);}sw.Stop();DataReceive -= SerialPortBase_DataReceive;isLoadDataReceive = false;return bytesForSendReceived;}/// <summary>/// 发送带返回/// </summary>/// <param name="data"></param>/// <param name="delay"></param>/// <returns></returns>public byte[] SendResponse(byte[] data, int delay = 100){if (!SerialPort.IsOpen){throw new Exception("串口未打开!");}bytesForSendReceived = null;lock (this.data){this.data.Clear();if (this.Send(data)){System.Common.Sleep(delay);int bytesToRead;while ((bytesToRead = SerialPort.BytesToRead) > 0){byte[] array = new byte[bytesToRead];SerialPort.Read(array, 0, bytesToRead);this.data.AddRange(array);System.Common.Sleep(Math.Max(50, delay / 2));}}bytesForSendReceived = this.data.ToArray();this.data.Clear();}return bytesForSendReceived;}#endregion/// <summary>/// 发送16进制字节/// </summary>/// <param name="data"></param>/// <returns></returns>public bool Send(byte[] data){if (!SerialPort.IsOpen){return false;}SerialPort.Write(data, 0, data.Length);return true;}/// <summary>/// 发送字符串/// </summary>/// <param name="data"></param>/// <returns></returns>public bool Send(string data){if (!SerialPort.IsOpen){return false;}SerialPort.Write(data);return true;}public void Close(){if (SerialPort.IsOpen){SerialPort.Close();}}public bool IsOpen{get{return SerialPort.IsOpen;}}public bool Open(){bool result;try{SerialPort.Open();result = true;}catch{result = false;}return result;}/// <summary>/// /// </summary>/// <param name="portName">COM1</param>/// <param name="baudRate">9600 38400 </param>/// <param name="parity">None</param>/// <param name="dataBits">8</param>/// <param name="stopBits">one</param>/// <returns></returns>public bool Open(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits){bool result;try{if (SerialPort.IsOpen){Close();}SerialPort.PortName = portName;SerialPort.BaudRate = baudRate;SerialPort.Parity = parity;SerialPort.DataBits = dataBits;SerialPort.StopBits = stopBits;SerialPort.Open();result = true;}catch{result = false;}return result;}public string[] GetPortNames(){return SerialPort.GetPortNames();}}
}
C# SerialPort的使用相关推荐
- linux安装语言总是waiting,node的serialport在arm的Linux安装血泪史之我太难了
0.序 本人在arm的Linux系统上serialport耗时5天,现在想想都头皮发麻! 下面我简单说一下过程,由于error时没有截图留档,关于出现的error,我就用语言描述一下,要是有什么不理解 ...
- C#利用SerialPort类对串口发送接收数据
1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...
- serialport接收串口数据_C#串口操作类,包括串口读写操作
串口进行操作的类,其中包括写和读操作,类可设置串口参数.设置接收函数.打开串口资源.关闭串口资源,操作完成后,一定要关闭串口.接收串口数据事件.接收数据出错事件.获取当前全部串口.把字节型转换成十六进 ...
- SerialPort实现对串口COM的操作(有些纠结)
这段时间做了一个小型贷款软件,包括客户管理,交易管理,存折管理和打印,统计分析等模块,其中要求结合存折读卡器一起使用,比如添加存折的时候,存折号要求刷完卡后读出来,刷卡后可以显示客户信息等,和银行的刷 ...
- 在C#中使用SerialPort类实现串口通信
在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信等.本文章将本人在学习过程中从网络上搜集到的相关信息写出来供大家参考. 下面主要介绍该类的主要属性(表1) ...
- POS 客显 设备 显示 总价 单价 找零 收款 C# SerialPort 法
在网上找了一堆的方法 基本都是C++或者VB 的DLL调用之类的 其实还有另一种2005的SerialPort方法 下载源代码 ---------------------------控 ...
- SerialPort.DataReceived 事件
https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived.aspx
- 串口使用stream_使用SerialPort库进行Node物联网项目开发
如果说Nodejs将JavaScript的应用从网页端扩展到了服务器和操作系统端,Electron为JavaScript实现了跨平台应用的能力,那么SerialPort就是打通JavaScript软件 ...
- 使用Java进行串口SerialPort通讯
1.准备工作 在进行串口连接通讯前,必须保证你当前操作电脑上有可用且闲置的串口.因为一般的电脑上只有一个或者两个串口,如COM1或COM2,但大多数情况下,这些串口可能会被其他的程序或者应用所占用,所 ...
- c# SerialPort会出现“已关闭 Safe handle”的错误
c# SerialPort使用时出现"已关闭 Safe handle"的错误 我在开发SerialPort程序时出现了一个问题,在一段特殊的扫描代码的时候会出现"已关闭 ...
最新文章
- x86构架之-Intel8042键盘控制器简介
- zhongdexing-pro
- python 递归的最大层数_练习题-Python的最大递归层数
- onnx格式转tensorRT
- 百倍性能的PL/SQL优化案例(r11笔记第13天)
- 《Mahout算法解析与案例实战》一一2.3 测试安装
- Futter基础第1篇: 实现输出Hello World【MaterialApp、Scaffold】
- Android 的singleTask和singleInstance的一点思考
- 基于matlab的瑞利衰落信道建模和仿真
- 从语义网络到知识图谱
- vc++datamatrix二维码识别
- 赛事相关 | 你好,微信大数据挑战赛,我是TI-ONE
- spring redis executePipelined
- 新浪,腾讯原生态SDK分享
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)...
- 广东计算机职业学校排名2015年,广东职业高中学校排名
- 电荷量Q=CU=It=Ne;左右手定则总结+安培定律 2020-3-15
- SOLIDWORKS的钛合金分析
- 1. 如果将学生的百分制成绩分为5个等级:0-59分为不及格(E),60-69分为及格(D),70-79分为一般(C),80-89分为良好(B),90-100分为优秀(A)。在实际中,学生的成绩在五个
- 协程(二):协程的应用