串口通信类,WPF
参考之前的资料,写了一个自己常用的串口类,
字符串发送类型用了两种方式,char[] 和byte[] ;
数据接收也是采用两种 char[] 和byte[] 两种。
类代码贴出来:
public class SerialPortManager
{
private bool _recStaus = true;//接收状态字
private bool _comPortIsOpen;
private void SetAfterClose()//成功关闭串口或串口丢失后的设置
{
_comPortIsOpen = false;//串口状态设置为关闭状态
}
private void SetComLose()//成功关闭串口或串口丢失后的设置
{
SetAfterClose();//成功关闭串口或串口丢失后的设置
}
public SerialPort CurrentSerialPort { get; set; } = new SerialPort();
public byte[] ReceivedDataPacket { get; set; } public bool OpenSerialPort(SerialPort serialPortPara)
{
CurrentSerialPort = serialPortPara;
if (_comPortIsOpen == false) //ComPortIsOpen == false当前串口为关闭状态,按钮事件为打开串口
{
try //尝试打开串口
{
CurrentSerialPort.ReadTimeout = ; //串口读超时8秒
CurrentSerialPort.WriteTimeout = ; //串口写超时8秒,在1ms自动发送数据时拔掉串口,写超时5秒后,会自动停止发送,如果无超时设定,这时程序假死
CurrentSerialPort.ReadBufferSize = ; //数据读缓存
CurrentSerialPort.WriteBufferSize = ; //数据写缓存
CurrentSerialPort.DataReceived += ComReceive; //串口接收中断
CurrentSerialPort.Open();
_comPortIsOpen = true; //串口打开状态字改为true
}
catch (Exception exception) //如果串口被其他占用,则无法打开
{
_comPortIsOpen = false;
ReceiveCompleted = false;
throw new Exception("unable open serial port" + exception.Message);
}
return true;
}
return true;
} public char[] ReceivedDataPacketChar { get; set; }
public bool ReceiveCompleted { get; set; } private void ComReceive(object sender, SerialDataReceivedEventArgs e)
{
ReceiveCompleted = false;
if (_recStaus) //如果已经开启接收
{
try
{
Thread.Sleep();
ReceivedDataPacket = new byte[CurrentSerialPort.BytesToRead];
ReceivedDataPacketChar = new char[CurrentSerialPort.BytesToRead];
// change to char datas
if (ByteMode)
{
CurrentSerialPort.Read(ReceivedDataPacket, , ReceivedDataPacket.Length);
}
else
{
CurrentSerialPort.Read(ReceivedDataPacketChar, , CurrentSerialPort.BytesToRead);
}
ReceiveCompleted = true;
}
catch (Exception)
{
if (CurrentSerialPort.IsOpen == false) //如果ComPort.IsOpen == false,说明串口已丢失
{
SetComLose(); //串口丢失后相关设置
}
else
{
throw new Exception("unable to receive data");
}
}
}
else //暂停接收
{
CurrentSerialPort.DiscardInBuffer(); //清接收缓存
}
} public bool SendDataPacket(string dataPacket)
{
char[] dataPacketChar = dataPacket.ToCharArray();
return SendDataPacket(dataPacketChar);
} public bool SendDataPacket(byte[] dataPackeg)
{
try
{
ByteMode = true;
CurrentSerialPort.Write(dataPackeg, , dataPackeg.Length); }
catch (Exception exception)
{
Console.WriteLine(exception.Message);
return false;
}
return true;
} public bool CloseSerialPort()
{
try//尝试关闭串口
{
CurrentSerialPort.DiscardOutBuffer();//清发送缓存
CurrentSerialPort.DiscardInBuffer();//清接收缓存
//WaitClose = true;//激活正在关闭状态字,用于在串口接收方法的invoke里判断是否正在关闭串口
CurrentSerialPort.Close();//关闭串口
// WaitClose = false;//关闭正在关闭状态字,用于在串口接收方法的invoke里判断是否正在关闭串口
SetAfterClose();//成功关闭串口或串口丢失后的设置
_comPortIsOpen = false;
}
catch//如果在未关闭串口前,串口就已丢失,这时关闭串口会出现异常
{
if (CurrentSerialPort.IsOpen == false)//判断当前串口状态,如果ComPort.IsOpen==false,说明串口已丢失
{
SetComLose();
}
else//未知原因,无法关闭串口
{
throw new Exception("unable close serial port");
}
}
return true;
} public bool ByteMode { get; set; } public bool SendDataPacket(char[] senddata)
{
try
{
ByteMode = false;
CurrentSerialPort.Write(senddata, , senddata.Length);
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
return false;
}
return true;
}
}
调用方法:char[]
private SerialPortManager _serialPortManager = new SerialPortManager();
char[] bytes ={(char)0xAA,(char)0xFF,(char)0x55,
(char)0xff, (char)0x06, (char)0x20,
(char)0xAA,(char)0XEE,(char)0x55,(char)0xEE};
_serialPortManager.SendDataPacket(bytes);
byte[]
byte[] byteOrdor = new byte[]
{
0xAA,0XFF,0X55,
0XFF,0X06,0X20,0XAA,0XEE,0X55,0XEE
};
_serialPortManager.SendDataPacket(byteOrdor);
数据接收数组对应使用
public byte[] ReceivedDataPacket { get; set; }
public char[] ReceivedDataPacketChar { get; set; }
实际可用。
串口通信类,WPF的更多相关文章
- VC 串口通信类
为了节省时间,我就贴出来吧 头文件 SerialPort.h /******************************************************************** ...
- c#串口通信类代码可以直接调用
文章首发于浩瀚先森博客 直接上代码 public struct SerialPara { private string portName; public string PortNameSetGet { ...
- boost实现串口通信(一):小试牛刀
/************************************************************************/ /* 功能:boost实现串口通信类 */ /* ...
- Qt 串口通信
在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台 QextSerialPort QT C++ Win/Linux http://sourceforge. ...
- java 串口通信 代码
下面是我自己实现的串口接收的类,串口发送比较简单,就直接发送就可以了.下面的这个类可以直接使用. package com.boomdts.weather_monitor.util; import ja ...
- Qt串口通信
1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...
- C\C++串口通信编程的一点技术记录
新工作接的第一个活,要写一个配合设备调试的上位机程序. 除了MFC界面的部分,就是要处理几条命令. 串口通信部分代码借鉴的是这一篇文章:http://blog.sina.com.cn/s/blog_a ...
- C++实现串口通信问题(与Arduino)
参考1(已验证稍加修改可与Arduino通信):https://blog.csdn.net/qq_36106219/article/details/81701368 参考2(比较全,main函数需要自 ...
- c#中实现串口通信的几种方法
c#中实现串口通信的几种方法 通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册 ...
随机推荐
- 使用SEP禁止客户端修改IP地址 - 飞舞的菜刀 - 51CTO技术博客
1.首先从注册表中搜寻 IP地址所在的位置,查到几项,此项即可: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Paramete ...
- require(__DIR__ . "/../sss.php"
魔法函数 __DIR__ 是 php5.2以后新加的函数,返回当前文件所在的目录,返回的目录不带 \,所以上边的意思是:Require当前目录的父目录中的 sss.php
- Ajax解决IE浏览器兼容问题
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享. 因为Context ...
- MSF命令 收集
一.msfconsole ? 帮助菜单 back 从当前环境返回 banner 显示一个MSF banner cd 切换目录 color 颜色转换 connect 连接一个主机 e ...
- Hrbustoj 1429 二分+计算几何
http://www.bubuko.com/infodetail-1121744.html 在这个上面学习了方法 如果要判断巨量的点 就应该使用二分法 思路是先从a[1] a[n] a[2]来判断是否 ...
- {转自MC}NVIDIA DirectX 11演示DEMO详解
http://tieba.baidu.com/p/1960826986 图形技术无论如何发展,最终都要落到实际的应用中才有效果.在个人电脑上,图形技术最大的用户除了显示UI和操作界面外,就是呈现美轮美 ...
- DWZ的选择带回功能无法带回第一个value中的值
<volist name="node1._child" id="node2"> 这里的value中第一个id是无法带回给上一个页面的..如果要带回则 ...
- Bootstrap页面布局9 - BS列表
列表: 无序列表(列表中项目内容没有固定的顺序), 有序列表(通常使用在一组有前后顺序的内容上), 描述列表(定义解释一组词汇) 无序列表: <ul> <li>Ueditor编 ...
- LAMP环境搭建教程(原创)
学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一. ...
- IMAP和POP3有什么区别
http://help.163.com/10/0203/13/5UJONJ4I00753VB8.html?servCode=6010237 IMAP和POP3有什么区别? POP3协议允许电子邮件 ...