c#串口通信(opencv入门教程)

串口进行操作的类,其中包括写和读操作,类可设置串口参数、设置接收函数、打开串口资源、关闭串口资源,操作完成后,一定要关闭串口、接收串口数据事件、接收数据出错事件、获取当前全部串口、把字节型转换成十六进制字符串等功能。这个串口类已经过了调试,可以使用: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSyste…

串口开展操作的类,主要包括写和读操作,类可设定串口主要参数、设定接收函数公式、开启串口資源、关掉串口資源,操作进行后,一定要关掉串口、接收串口数据信息事件、接收数据出差错事件、获取现阶段所有串口、把字节数型转化成十六进制字符串数组等作用。这一串口类已经过去了调节,可以应用:

C#串口操作类,包括串口读写操作

using System;

using System.Collections.Generic;

using System.Text;

using System.IO.Ports;

using System.Globalization;

namespace SerialClass

{

public class SerialClass

{

SerialPort _serialPort = null;

//界定授权委托

public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits);

//界定接收数据信息事件

public event SerialPortDataReceiveEventArgs DataReceived;

//界定接收不正确事件

//public event SerialErrorReceivedEventHandler Error;

//接收事件是不是合理 false表明合理

public bool ReceiveEventFlag = false;

#region 获取串口名

private string protName;

public string PortName

{

get { return _serialPort.PortName; }

set

{

_serialPort.PortName = value;

protName = value;

}

}

#endregion

#region 获取视频码率

private int baudRate;

public int BaudRate

{

get { return _serialPort.BaudRate; }

set

{

_serialPort.BaudRate = value;

baudRate = value;

}

}

#endregion

#region 默认设置构造方法

/// <summary>

/// 默认设置构造方法,操作COM1,速率为9600,沒有奇偶校验,8位字节数,终止位是1 “COM1”, 9600, Parity.None, 8, StopBits.One

/// </summary>

public SerialClass()

{

_serialPort = new SerialPort();

}

#endregion

#region 构造方法

/// <summary>

/// 构造函数,

/// </summary>

/// <param name=”comPortName”></param>

public SerialClass(string comPortName)

{

_serialPort = new SerialPort(comPortName);

_serialPort.BaudRate = 9600;

_serialPort.Parity = Parity.Even;

_serialPort.DataBits = 8;

_serialPort.StopBits = StopBits.One;

_serialPort.Handshake = Handshake.None;

_serialPort.RtsEnable = true;

_serialPort.ReadTimeout = 2000;

setSerialPort();

}

#endregion

#region 构造方法,可以自定串口的复位主要参数

/// <summary>

/// 构造方法,可以自定串口的复位主要参数

/// </summary>

/// <param name=”comPortName”>必须操作的COM口名字</param>

/// <param name=”baudRate”>COM的速率</param>

/// <param name=”parity”>奇偶校验位</param>

/// <param name=”dataBits”>数据信息长短</param>

/// <param name=”stopBits”>终止位</param>

public SerialClass(string comPortName, int baudRate, Parity parity, int dataBits, StopBits stopBits)

{

_serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);

_serialPort.RtsEnable = true; //全自动要求

_serialPort.ReadTimeout = 3000;//请求超时

setSerialPort();

}

#endregion

#region 析构函数

/// <summary>

/// 析构函数,关掉串口

/// </summary>

~SerialClass()

{

if (_serialPort.IsOpen)

_serialPort.Close();

}

#endregion

#region 设定串口主要参数

/// <summary>

/// 设定串口主要参数

/// </summary>

/// <param name=”comPortName”>必须操作的COM口名字</param>

/// <param name=”baudRate”>COM的速率</param>

/// <param name=”dataBits”>数据信息长短</param>

/// <param name=”stopBits”>终止位</param>

public void setSerialPort(string comPortName, int baudRate, int dataBits, int stopBits )

{

if (_serialPort.IsOpen)

_serialPort.Close();

_serialPort.PortName = comPortName;

_serialPort.BaudRate = baudRate;

_serialPort.Parity = Parity.None;

_serialPort.DataBits = dataBits;

_serialPort.StopBits = (StopBits)stopBits;

_serialPort.Handshake = Handshake.None;

_serialPort.RtsEnable = false;

_serialPort.ReadTimeout = 3000;

_serialPort.NewLine = “/r/n”;

setSerialPort();

}

#endregion

#region 设定接收函数公式

/// <summary>

/// 设定串口資源,还需轻载好几个设定串口的函数公式

/// </summary>

void setSerialPort()

{

if (_serialPort != null)

{

//设定开启DataReceived事件的字节为1

_serialPort.ReceivedBytesThreshold = 1;

//接收到一个字节时,也会开启DataReceived事件

_serialPort.DataReceived = new SerialDataReceivedEventHandler(_serialPort_DataReceived);

//接收数据信息出差错,开启事件

_serialPort.ErrorReceived = new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived);

//打开串口

//openPort();

}

}

#endregion

#region 开启串口資源

/// <summary>

/// 开启串口資源

/// <returns>回到bool类型</returns>

/// </summary>

public bool openPort()

{

bool ok = false;

//假如串口是打开的,先关闭

if (_serialPort.IsOpen)

_serialPort.Close();

try

{

//打开串口

_serialPort.Open();

ok = true;

}

catch (Exception Ex)

{

throw Ex;

}

return ok;

}

#endregion

#region 关闭串口

/// <summary>

/// 关闭串口資源,实际操作结束后,一定要关闭串口

/// </summary>

public void closePort()

{

//假如串口处在打开情况,则关闭

if (_serialPort.IsOpen)

_serialPort.Close();

}

#endregion

#region 接受串口数据信息事情

/// <summary>

/// 接受串口数据信息事情

/// </summary>

/// <param name=”sender”></param>

/// <param name=”e”></param>

void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

//严禁接受事情时立即撤出

if (ReceiveEventFlag)

{

return;

}

try

{

System.Threading.Thread.Sleep(20);

byte[] _data = new byte[_serialPort.BytesToRead];

_serialPort.Read(_data, 0, _data.Length);

if (_data.Length == 0) { return; }

if (DataReceived != null)

{

DataReceived(sender, e, _data);

}

//_serialPort.DiscardInBuffer(); //清除接收缓冲区

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

#region 获取数据出差错事情

/// <summary>

/// 获取数据出差错事情

/// </summary>

/// <param name=”sender”></param>

/// <param name=”e”></param>

void _serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)

{

}

#endregion

#region 传送数据string种类

public void SendData(string data)

{

//传送数据

//严禁接受事情时立即撤出

if (ReceiveEventFlag)

{

return;

}

if (_serialPort.IsOpen)

{

_serialPort.Write(data);

}

}

#endregion

#region 传送数据byte种类

/// <summary>

/// 数据信息推送

/// </summary>

/// <param name=”data”>要传送的数据信息字节数</param>

public void SendData(byte[] data, int offset, int count)

{

//严禁接受事情时立即撤出

if (ReceiveEventFlag)

{

return;

}

try

{

if (_serialPort.IsOpen)

{

//_serialPort.DiscardInBuffer();//清除接收缓冲区

_serialPort.Write(data, offset, count);

}

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

#region 推送指令

/// <summary>

/// 推送指令

/// </summary>

/// <param name=”SendData”>传送数据</param>

/// <param name=”ReceiveData”>获取数据</param>

/// <param name=”Overtime”>请求超时時间</param>

/// <returns></returns>

public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime)

{

if (_serialPort.IsOpen)

{

try

{

ReceiveEventFlag = true; //关闭接受事情

_serialPort.DiscardInBuffer(); //清除接收缓冲区

_serialPort.Write(SendData, 0, SendData.Length);

int num = 0, ret = 0;

System.Threading.Thread.Sleep(10);

ReceiveEventFlag = false; //打开事情

while (num < Overtime)

{

if (_serialPort.BytesToRead >= ReceiveData.Length)

break;

System.Threading.Thread.Sleep(10);

}

if (_serialPort.BytesToRead >= ReceiveData.Length)

{

ret = _serialPort.Read(ReceiveData, 0, ReceiveData.Length);

}

else

{

ret = _serialPort.Read(ReceiveData, 0, _serialPort.BytesToRead);

}

ReceiveEventFlag = false; //打开事件

return ret;

}

catch (Exception ex)

{

ReceiveEventFlag = false;

throw ex;

}

}

return -1;

}

#endregion

#region 获得串口

/// <summary>

/// 获取全部已连接短信猫机器设备的串口

/// </summary>

/// <returns></returns>

public string[] serialsIsConnected()

{

List<string> lists = new List<string>();

string[] seriallist = getSerials();

foreach (string s in seriallist)

{

}

return lists.ToArray();

}

#endregion

#region 获得现阶段所有串口資源

/// <summary>

/// 得到现阶段电脑的全部串口資源

/// </summary>

/// <returns></returns>

public string[] getSerials()

{

return SerialPort.GetPortNames();

}

#endregion

#region 字节数型变换16

/// <summary>

/// 把字节数型转化成十六进制字符串数组

/// </summary>

/// <param name=”InBytes”></param>

/// <returns></returns>

public static string ByteToString(byte[] InBytes)

{

string StringOut = “”;

foreach (byte InByte in InBytes)

{

StringOut = StringOut String.Format(“{0:X2} “, InByte);

}

return StringOut;

}

#endregion

#region 十六进制字符串转字节型

/// <summary>

/// 把十六进制字符串转化成字节型(方式1)

/// </summary>

/// <param name=”InString”></param>

/// <returns></returns>

public static byte[] StringToByte(string InString)

{

string[] ByteStrings;

ByteStrings = InString.Split(” “.ToCharArray());

byte[] ByteOut;

ByteOut = new byte[ByteStrings.Length];

for (int i = 0; i <= ByteStrings.Length-1 ; i )

{

//ByteOut[i] = System.Text.Encoding.ASCII.GetBytes(ByteStrings[i]);

ByteOut[i] = Byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);

//ByteOut[i] =Convert.ToByte(“0x” ByteStrings[i]);

}

return ByteOut;

}

#endregion

#region 十六进制字符串转字节型

/// <summary>

/// 字符串转16进制字节二维数组(方式2)

/// </summary>

/// <param name=”hexString”></param>

/// <returns></returns>

public static byte[] strToToHexByte(string hexString)

{

hexString = hexString.Replace(” “, “”);

if ((hexString.Length % 2) != 0)

hexString = ” “;

byte[] returnBytes = new byte[hexString.Length / 2];

for (int i = 0; i < returnBytes.Length; i )

returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);

return returnBytes;

}

#endregion

#region 字节型转十六进制字符串

/// <summary>

/// 字节二维数组转16进制字符串

/// </summary>

/// <param name=”bytes”></param>

/// <returns></returns>

public static string byteToHexStr(byte[] bytes)

{

string returnStr = “”;

if (bytes != null)

{

for (int i = 0; i < bytes.Length; i )

{

returnStr = bytes[i].ToString(“X2”);

}

}

return returnStr;

}

#endregion

}

}

======================================================================================

启用方式:

static SerialClass sc = new SerialClass();

static void Main(string[] Args)

{

sc.DataReceived = new SerialClass.SerialPortDataReceiveEventArgs(sc_DataReceived);

sc.writeData(“at”);

Console.ReadLine();

sc.closePort();

}

static void sc_DataReceived(object sender, SerialDataReceivedEventArgs e, byte[] bits)

{

Console.WriteLine(Encoding.Default.GetString(bits));

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月10日 下午2:26
下一篇 2022年5月10日 下午2:27

相关推荐

  • 智能手环选择指南(推荐两款性价比最高的智能手环)

    智能手环无疑是当前可穿戴产品的主流,因为随着人们对健康认知的加深,运动与健康越来越被看重,很多人都希望能及时看到自己及家人的健康及运动等数据,这也是智能运动手环的需求所致。不过面对琳琅满目的智能手环产品,我们应该如何选择呢?相信看完本文就知道了。 荣耀手环5 在外观方面荣耀手环5继续延续了其前代的风格设计,手环搭载了一块0.95英寸的AMOLED触控彩屏,拥有240*120高分辨率,PPI高达28…

    2022年9月13日
    490
  • teamviewer过期了怎么办(免费使用teamviewer教程)

    远程控制软件TeamViewer很多用户使用它来处理远程问题,有位朋友使用Teamviewer时候,提示试用期已到,需要购买激活码,但又不想要购买激活码。今天小编就为大家介绍处理的方法。teamviewer系列软件最新版本下载TeamViewer软件版本:14.0.35Android软件立即查看 TeamViewer软件版本:14.0.146226iOS软件立即查看 方法/步骤 通过百度收索Tea…

    2022年4月28日
    1170
  • 个人微信开店怎么开,详细操作流程分享给大家

    微信公众平台本次更新增加了微信小店功能,微信小店基于微信支付,包括添加商品、商品管理、订单管理、货架管理、维权等功能,开发者可使用接口批量添加商品,快速开店。已接入微信支付的公众号,可在服务中心中申请开通微信小店功能。 微信公众平台今天正式推出“微信小店”,微信的整体开放能力不断增强。凡是开通了微信支付功能的认证服务号皆可在公众平台自助申请“微信小店”功能,从而实现批量添加商品快速开店。“微信小店…

    2022年9月4日
    900
  • 1.8亿毕加索名画被撕,嫌疑人到底在想什么

    2019 年 12 月 28 日,伦敦泰特现代美术馆一幅价值 2000 万英镑、约合人民币 1.8 亿元的毕加索名画《女子半身像》,被一名 20 岁的英国男子撕破。嫌疑人在撕破画作后被警方逮捕,并以刑事毁坏罪被起诉。

    2022年5月22日
    720
  • 最好的键盘(公认手感最好的键盘)

    工欲善其事必先利其器,键盘作为最基本的PC配件,已经成为游戏党&打工人在生活、工作中不可或缺的存在了。选一把手感出色、质量过硬的键盘无疑会对日常办公效率和娱乐体验带来极大的提升,论是个人自用还是作为礼物赠人都非常合适。那么借着这篇清单向的文章,聊聊性价比键盘的选购相关。 简单的做了一张思维导图,从配列、品牌、轴体以及使用用途等方面展开的,不仅可以作为选购前的要点梳理,还可以按图索骥直接购买…

    2022年5月9日
    1320
  • 有哪些10万左右的创业项目,低成本创业项目推荐

    低成本创业有哪些?随着经济发展,很多人都已具备了基本的创业能力。对于10万元之内的创业项目推荐,投资做什么好呢?笔者认为,开店是上佳之选,开店投入少,风险低,只要看准项目,经营得当,一般都会只赚不赔。下面就让我们看10万元创业项目推荐有什么吧! 低成本创业,10万元创业项目推荐: 10万元创业项目推荐一:开家政服务社 如果你对社区群众十分了解,你就可以结合他们的需求,在社区内开办一家家政服务社,一…

    2022年5月18日
    710
  • git安装包怎么安装(github注册流程)

    Git是一个开源版本控制系统,被全球成千上万的开发人员使用,它用于在源代码级别跟踪您的软件更改,它允许您跟踪更改,将其恢复到之前的阶段并创建文件和目录的备用版本。 HTTPGitServer是一个开源项目,它使用Nginx网络服务器通过局域网(LAN)为Git存储库提供服务,它非常简单且易于设置,任何人都可以从命令行界面管理它。 在本教程中,我将解释如何在Debian11上使用Nginx设置HTT…

    2022年5月13日
    820
  • 去韩国必买的7样东西,没买是你的损失

    首尔作为韩国的首都,是一个现代化的大都市,去首尔一定是要买、买、买的啊,乐天免税店、明洞的化妆品商店街、E-Mart超级市场都是必去的购物点。小编给大家介绍一下首尔必买的特产。 韩国高丽参 韩国高丽参在韩国是很出名的,是有名的国礼之一。高丽参有丰富的药用价值,能滋阴补阳、强身健体,有抗疲劳抗衰老的功效。在首尔随处可见各种各样的高丽参制品,有整根人参炮制的参酒,也有加工制作的红参糖、参片、高丽参粉、…

    2022年10月5日
    2810
  • 如何做好网站优化和排名(快速提升网站SEO排名的方法)

    现在的企业网站优化专员多数都是对网站没有过多的计划,专业的网站优化认为,坚持更新网站文章,网站优化效果自然有效果,不要局限在环境里面,深圳网站优化给你做一个分析。 一、网站优化关键词布局 关键词布局应该是均匀的,不是单词越多越好,而是技巧!一些企业认为只需要在网站的标题和描述中添加关键词。事实上,每一栏甚至每一种产品都应该合理分配。企业应该注意的一点是关键词不应该重叠太多,也就是说,同一单词不能在…

    2022年6月2日
    690
  • 社交平台有哪些,全球最火的10大社交app

    在如今这个互联网时代,人们的日常生活都与他紧密连接了在一起。都说互联网是有记忆的,人们的每一次搜索、每一张照片和每一句话都会被互联网记住。近日国外调查机构发布了“全球最受欢迎十大社交平台”,其中中国有5款上榜,我们熟悉又陌生的QQ空间也在榜单中。 在全球前十中,前三名分别是Facebook、YouTube以及WhatsApp。国产软件中,微信位列第四名,QQ第七名、抖音和微博分别为第九和第十名。其…

    2022年8月30日
    460

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信