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

相关推荐

  • 30岁好用精华液排行榜(公认最好用的十大抗衰老精华)

    精华液价格贵效果好,是护肤品中的精华所在,现在几乎是人手一瓶了,可是你手中的精华液真的就好用吗?今天我们就介绍10款真正有效的精华液,不在乎价格多少,只在乎是否有效果,这才是最重要的。保证每一款精华液都物有所值是我们的责任,也是大家一直关注我们的原因,感谢这么多粉丝后台的留言支持。 安娜柏林橙花蜜 这瓶美白精华会油润一点,是水油分离的结构,上层是低温萃取的植物精油,下层是橙花原液。里面富含VC,能…

    2022年9月9日
    580
  • 区块链技术应用案例分享,区块链技术到底有什么用

    现如今,区块链技术可谓是“炙手可热”。各大行业巨头,各国政府机构对区块链的布局也是忙前忙后。可以看出区块链在未来的世界里将扮演“举足轻重”的角色。现在有些区块链技术应用已经落地,要全行业全面应用可能还需要时间。接下来,我们来看看有哪些区块链技术应用案列。 区块链技术应用案列一: 2016年9月23日,IBM与中国银联预演“使用区块链技术的跨行积分兑换系统”,该系统允许跨行、跨平台兑换奖励积分,消费…

    2022年7月1日
    630
  • 网站被攻击打不开怎么办,附原因及解决方法

    如今互联网安全问题越来越严峻,很多大型的网站都有被黑客攻击的事件,网站被黑给企业带来巨大的损失,轻则网站停运,重则网站核心数据泄漏文件丢失无法恢复,对于大型品牌型网站和做推广网站网站被黑尤其要引起重视,网站被攻击之后都会有比较明显的现象,今天我们就来盘点一下网站被攻击一些类型和解决方法。 网站被黑首先要检查搜索引擎页面收录情况,很多网站被黑页面会被修改标题后跳转,黑客通过挂马跳转到自己的网站,被跳…

    2022年5月26日
    810
  • 版本控制软件有哪些(最好的文件管理软件)

    什么是版本控制? 你可以把一个版本控制系统理解为"数据库",在需要的时候,它可以帮你快速保存一个项目的快照,当你需要查看上一个版本时(即快照),版本控制系统可以显示出当前版本与上一个版本之间所改动的细节。 版本控制有什么优势? 1、更快、更简单的错误发现 版本控制也是无价的。版本控制不仅可以让您很好地了解引入错误的时间和地点,而且还可以用于立即恢复到项目的先前功能版本。这意味着当所有其他方法都失败…

    2022年5月13日
    930
  • 探路者登山鞋怎么样,探路者登山鞋最详细测评

    鞋舒不舒服只有脚知道,对于喜爱户外运动一族来说,有一双好鞋子尤其重要,在他们看来,对脚部的周全保护是获得攀登乐趣与成功的根本。徒步鞋相对于厚重而坚硬的登山鞋来说,其最大的优点在于穿着轻便舒适并富有弹性,适合于户外休闲、山地慢跑、徒步旅行和登山等户外活动,同时在城市中穿行也不显笨重,动感十足。 目前国内的户外运动爱好者对于这类徒步鞋的需求很强,探路者徒步鞋的推出正满足了这一需求。这款采用精选牛反毛皮…

    2022年9月8日
    680
  • 网络推广有哪些渠道,10大网络推广途径分享

    2018年已经过去了一半,你们的业绩完成了吗?现在越来越多的人使用网络推广,下面小良告诉大家常见的网络推广的方法,提高大家的效率 在互联网时代,企业产品推广不能仅仅依靠下线,这样投入的太高成本高。更上互联网发展,做网络推广是必须的,下面小良就和大家讲讲2018年熟知的网络推广方法。 在互联网的圈子里有关推广的问题是一个永恒的话题,你的商品哪怕再好如果没有推广出去一切都是白搭,经常听有人说“酒香不怕…

    2022年5月27日
    650
  • 小孩上幼儿园需要哪些证件,这篇文章新手妈妈必看

    2019年春季学期准备开学了,每年的春季学期都会有一些新生,如果有多新生,一般会做一个新班级,如果有少,就会插入原有班级。这两天陆陆续续接到很多新生爸爸妈妈问我:新生入园需要带什么证件和准备什么? 一、入园需要带以下证件 1、户口本,户口本要有详细地址,有孩子至亲的成员,跟孩子同一户口。 2、出生医学证明。 3、儿童免疫接种证。 4、入园前体检表。 5、一寸相片若干张(根据幼儿园所需要的张数) 6…

    2022年9月10日
    490
  • 微信群打卡签到怎么弄,使用微信签到功能的方法

    很多人都会建立微信群来做营销,打卡几乎是每个群的必修课。 今天就来聊一款打卡工具,完全基于微信开发,可以实现服务号与微信群的无缝链接。 这篇小文会从以下3个方面来说明: 1.为什么微信群要做打卡动作? 2.现在常用的微信群打卡是怎么做的? 3.这款新的打卡工具都有哪些独特的功能? 一、为什么微信群里要做打卡动作呢? 首先从建群人的角度来看,建立一个微信群之后肯定不希望这个群立刻死去,而签到打卡是最…

    2022年8月14日
    1460
  • 手机微店怎么开通,手机开微店教程视频

    淘宝重磅推出了类似微店功能的淘宝手机端开店工具淘小铺,可以非常方便快速、快捷拍照,马上发布宝贝哦。特别适合小白新手,没电脑或者不方便随时用电脑的上班族或者学生朋友了。只要你有拍照功能的手机、身份证、银行卡就可以快速方便开店卖东西了。 本视频包含了淘小铺功能介绍、淘小铺怎么开通、淘宝小铺如何进行发布宝贝、淘小铺名片设置等等实用操作方法。建议广大卖家都看看,尽快开通自己的淘小铺。 (一)视频下载 视频…

    2022年7月30日
    460
  • 最准确排卵日计算器有哪个(计算月经和排卵期的app推荐)

    导读:如何正确选择容易怀孕的时机? 有的夫妻双方备孕很久,却迟迟没有怀孕,而有的夫妻没怎么备孕,却一碰就中。有的朋友可能认为是因为人家是易孕体质,其实除了是易孕体质外,还有一个因素就是选对了最佳受孕的时机。如何正确选择易受孕期的时机呢?我们一起来看一下。 计算排卵期 最简单的方法就是计算排卵期,从月经开始的那一天开始计算,往后推14天为排卵日,排卵日前5天和后4天为排卵期,在这10天之内受孕都是可…

    2022年5月5日
    1150

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信