c#串口通信 opencv入门教程

用于串行端口操作的类,包括写和读操作。类可以设置串口参数,设置接收函数,打开串口资源,关闭串口资源。操作完成后,它必须关闭串口,接收串行数据事件,接收数据错误事件,获取所有当前串口,并将字节类型转换为十六进制字符串。此串行端口类已经过调试,可以使用:使用系...

用于串行端口操作的类,包括写和读操作。类可以设置串口参数,设置接收函数,打开串口资源,关闭串口资源。操作完成后,它必须关闭串口,接收串行数据事件,接收数据错误事件,获取所有当前串口,并将字节类型转换为十六进制字符串。此串行端口类已经过调试,可以使用:

使用系统;

使用系统。***。泛型;

使用系统。文本;

使用系统。IO .端口;

使用系统。全球化;

命名空间SerialClass

{

公共类串行类

{

SerialPort _ serialPort = null

//定义委托

公共委托void SerialPortDataReceiveEventArgs(对象发送方,SerialDataReceivedEventArgs e,byte[]bits);

//定义接收数据事件

公共事件SerialPortDataReceiveEventArgs data received;

//定义接收错误事件

//公共事件serial errorreceivedeventhandler错误;

//接收事件是否有效。false表示有效。

public bool ReceiveEventFlag = false;

#region获取串行端口名称

私有字符串protName

公共字符串端口名

{

获取{ return _serialPort。端口名;}

设置

{

_串行端口。PortName = value

protName = value

}

}

#结束区域

#区域获取比特率

private int baudRate

公共int波特率

{

获取{ return _serialPort。波德拉特;}

设置

{

_串行端口。BaudRate =值;

baudRate =值;

}

}

#结束区域

#区域默认构造函数

///<总结& gt

///默认构造函数,运算COM1,速度9600,无奇偶校验,8位字节,停止位为1 “COM1 & # 8221,9600,平价。无,8,停止位。一个

///</sum***ry >

公共SerialClass()

{

_ serial port = new serial port();

}

#结束区域

#区域构造函数

///<总结& gt

///构造函数,

///</sum***ry >

///<param name = & # 8221comPortName & # 8221& gt& lt/param >

公共SerialClass(字符串组件名)

{

_ serial port = new serial port(comport name);

_串行端口。波德拉特= 9600;

_串行端口。平价=平价。甚至;

_串行端口。数据位数= 8;

_串行端口。停止位=停止位。一;

_串行端口。握手=握手。无;

_串行端口。RtsEnable = true

_串行端口。ReadTimeout = 2000

set serial port();

}

#结束区域

#region构造函数,可以自定义串口的初始化参数。

///<总结& gt

///构造函数,可以自定义串口的初始化参数。

///</sum***ry >

///<param name = & # 8221comPortName & # 8221& gt操作需要COM端口名

///<param name = & # 8221波德拉特”& gtCOM速度

///<param name = & # 8221平价”& gt奇偶校验位

///<param name = & # 8221数据比特”& gt数据长度

///<param name = & # 8221停止位”& gt停止位

public SerialClass(字符串组件名,整数波特率,奇偶校验,整数数据位,停止位停止位)

{

_ serial port = new serial port(comport name,baudRate,parity,dataBits,stop bits);

_串行端口。RtsEnable = true//自动请求

_串行端口。ReadTimeout = 3000//超时

set serial port();

}

#结束区域

#区域析构函数

///<总结& gt

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

///</sum***ry >

~SerialClass()

{

if (_serialPort。IsOpen)

_串行端口。close();

}

#结束区域

#区域设置串行端口参数

///<总结& gt

///设置串口参数

///</sum***ry >

///<param name = & # 8221comPortName & # 8221& gt操作需要COM端口名

///<param name = & # 8221波德拉特”& gtCOM速度

///<param name = & # 8221数据比特”& gt数据长度

///<param name = & # 8221停止位”& gt停止位

public void set serial port(string comport name,int baudRate,int dataBits,int stopBits)

{

if (_serialPort。IsOpen)

_串行端口。close();

_串行端口。PortName = comPortName

_串行端口。波德拉特=波德拉特;

_串行端口。平价=平价。无;

_串行端口。数据比特=数据比特;

_串行端口。StopBits = (StopBits)停止位;

_串行端口。握手=握手。无;

_串行端口。RtsEnable = false

_串行端口。ReadTimeout = 3000

_串行端口。NewLine = & # 8220/r/n ”;

set serial port();

}

#结束区域

# RegionSets设置接收功能。

///<总结& gt

///设置串口资源,需要重载多个设置串口的函数。

///</sum***ry >

void setSerialPort()

{

if (_serialPort!=空)

{

//将触发DataReceived事件的字节数设置为1

_串行端口。ReceivedBytesThreshold = 1;

//当接收到一个字节时,DataReceived事件也会被触发。

_串行端口。data received+= new serial datareceivedeventhandler(_ serial port _ data received);

//接收数据出错,触发事件

_串行端口。error received+= new serial errorreceivedeventhandler(_ serial port _ error received);

//打开串口

//open port();

}

}

#结束区域

#区域开放串行端口资源

///<总结& gt

///打开串口资源

///<returns & gt返回布尔类型

///</sum***ry >

public bool openPort()

{

bool ok = false

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

if (_serialPort。IsOpen)

_串行端口。close();

尝试

{

//打开串口

_串行端口。open();

ok = true

}

catch(例外Ex)

{

扔Ex;

}

退货ok;

}

#结束区域

#区域关闭串行端口

///<总结& gt

///关闭串口资源。操作完成后,一定要关闭串口。

///</sum***ry >

public void closePort()

{

//如果串口是打开的,它会被关闭

if (_serialPort。IsOpen)

_串行端口。close();

}

#结束区域

#区域接收串行数据事件

///<总结& gt

///接收串行数据事件

///</sum***ry >

///<param name = & # 8221发件人”& gt& lt/param >

///<param name = & # 8221e & # 8221& gt& lt/param >

void _serialPort_DataReceived(对象发送方,SerialDataReceivedEventArgs e)

{

//接收事件时禁止直接退出。

if (ReceiveEventFlag)

{

返回;

}

尝试

{

系统。线程. thread . sleep(20);

byte[] _data =新字节[_serialPort。BytesToRead];

_串行端口。Read(_data,0,_data。长度);

if(_数据。长度= = 0){ return;}

如果(DataReceived!=空)

{

DataReceived(发送方,e,_ data);

}


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

}

catch(例外ex)

{

扔ex;

}

}

#结束区域

#区域接收数据错误事件

///<总结& gt

///接收数据错误事件

///</sum***ry >

///<param name = & # 8221发件人”& gt& lt/param >

///<param name = & # 8221e & # 8221& gt& lt/param >

void _serialPort_ErrorReceived(对象发送方,SerialErrorReceivedEventArgs e)

{

}

#结束区域

#区域发送数据字符串类型

公共void SendData(字符串数据)

{

//发送数据

//接收事件时禁止直接退出。

if (ReceiveEventFlag)

{

返回;

}

if (_serialPort。IsOpen)

{

_串行端口。写(数据);

}

}

#结束区域

#区域发送数据字节类型

///<总结& gt

///数据发送

///</sum***ry >

///<param name = & # 8221数据”& gt要发送的数据字节

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

{

//接收事件时禁止直接退出。

if (ReceiveEventFlag)

{

返回;

}

尝试

{

if (_serialPort。IsOpen)

{


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

_串行端口。写(数据、偏移量、计数);

}

}

catch(例外ex)

{

扔ex;

}

}

#结束区域

#区域发送命令

///<总结& gt

///发送命令

///</sum***ry >

///<param name = & # 8221发送数据”& gt发送数据

///<param name = & # 8221接收数据”& gt接收数据

///<param name = & # 8221加班”& gt超时时间

///<returns & gt& lt/returns >

public int send com***nd(byte[]send data,ref byte[] ReceiveData,int Overtime)

{

if (_serialPort。IsOpen)

{

尝试

{

ReceiveEventFlag = true//关闭接收事件


_串行端口。DiscardInBuffer();//清除空接收缓冲区

_串行端口。写(SendData,0,SendData。长度);

int num = 0,ret = 0;

系统。Threading.Thread.Sleep(十);

ReceiveEventFlag = false//打开事件

while(num++ <加班)

{

if (_serialPort。BytesToRead & gt=接收数据。长度)

打破;

系统。Threading.Thread.Sleep(十);

}

if (_serialPort。BytesToRead & gt=接收数据。长度)

{

ret = _serialPort。Read(接收数据,0,接收数据。长度);

}

其他

{

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

}

ReceiveEventFlag = false//打开事件

返回ret

}

catch(例外ex)

{

ReceiveEventFlag = false

扔ex;

}

}

return-1;

}

#结束区域

#获取串行端口的区域

///<总结& gt

///获取所有连接的SMS cat设备的串行端口

///</sum***ry >

///<returns & gt& lt/returns >

公共字符串[]serialisconnected()

{

列表& lt字符串& gtlists =新列表& lt字符串& gt();

string[]serial list = get serials();

foreach(序列列表中的字符串s)

{

}

返回列表。to array();

}

#结束区域

#获取所有当前串行端口资源的区域

///<总结& gt

///获取当前计算机上的所有串行端口资源

///</sum***ry >

///<returns & gt& lt/returns >

公共字符串[] getSerials()

{

返回串行端口。getport names();

}

#结束区域

#区域字节转换16

///<总结& gt

///将字节类型转换为十六进制字符串

///</sum***ry >

///<param name = & # 8221InBytes & # 8221& gt& lt/param >

///<returns & gt& lt/returns >

公共静态字符串ByteToString(byte[] InBytes)

{

string StringOut = & # 8220”;

foreach(字节中的字节)

{

StringOut = StringOut + String。格式(“{ 0:X2 } “,以字节为单位);

}

return StringOut

}

#结束区域

#区域十六进制字符串到字节类型

///<总结& gt

///将十六进制字符串转换为字节类型(方法1)

///</sum***ry >

///<param name = & # 8221英斯特灵”& gt& lt/param >

///<returns & gt& lt/returns >

public static byte[]string tobyte(string in string)

{

string[]bytes string;

ByteStrings = InString。拆分(”“。ToCharArray());

byte[]byte out;

ByteOut =新字节[字节字符串。长度];

for(int I = 0;我& lt=字节字符串。长度-1;i++)

{

//ByteOut[i] = System。text . encoding . ascii . getbytes(bytes strings[I]);

ByteOut[i] =字节。parse(bytes strings[I],System。globalization . number styles . hex number);

//ByteOut[i] =Convert。ToByte(“0x & # 8221+bytes strings[I]);

}

返回ByteOut

}

#结束区域

#区域十六进制字符串到字节类型

///<总结& gt

///字符串转换为十六进制字节数组(方法2)

///</sum***ry >

///<param name = & # 8221hexString & # 8221& gt& lt/param >

///<returns & gt& lt/returns >

公共静态字节[] strToToHexByte(字符串hexString)

{

hexString = hexString。替换(”“, “”);

if ((hexString。长度% 2)!= 0)

hex string+= ”“;

byte[]return bytes = new byte[hex string。长度/2];

for(int I = 0;我& ltreturnBytes字节。长度;i++)

returnBytes[i] = Convert。ToByte(十六进制字符串。Substring(i * 2,2),16);

返回returnBytes

}

#结束区域

#区域字节到十六进制字符串

///<总结& gt

///将字节数组转换为十六进制字符串

///</sum***ry >

///<param name = & # 8221字节”& gt& lt/param >

///<returns & gt& lt/returns >

公共静态字符串byteToHexStr(byte[] bytes)

{

string returnStr = & # 8220”;

如果(字节!=空)

{

for(int I = 0;我& lt字节。长度;i++)

{

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

}

}

return returnStr

}

#结束区域

}

}

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

调用方法:

static serial class sc = new serial class();

静态void Main(string[] Args)

{

即DataReceived +=新的SerialClass。SerialPortDataReceiveEventArgs(sc _ data received);

sc . writedata(“在”);

控制台。ReadLine();

sc . close port();

}

静态void sc_DataReceived(对象发送方,SerialDataReceivedEventArgs e,byte[] bits)

{

控制台。WriteLine(编码。default . GetString(bits));

}

本文来自长街旧人投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/633958.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 07-14
下一篇 07-14

相关推荐

  • 通信大数据行程卡没有找到行程数据解决方法

    1.大数据中找不到出行信息的原因有以下几点:1。用户过去14天的常驻通话有效数据不足,用户需要记录过去14天内单日在一个城市的数据。最早和最晚的间隔可以超过4小时,以显示旅行路线。2.中国电信、中国移动联通三家运营商任意一家的用户都是;请问您最近14天是否在XX逗留超过

    2023-07-19 19:44:01
    771 0
  • c#串口通信 opencv入门教程

    用于串行端口操作的类,包括写和读操作。类可以设置串口参数,设置接收函数,打开串口资源,关闭串口资源。操作完成后,它必须关闭串口,接收串行数据事件,接收数据错误事件,获取所有当前串口,并将字节类型转换为十六进制字符串。此串行端口类已经过调试,可以使用:使用系

    2023-07-14 17:05:01
    959 0
  • 通信运营是做什么的 附其通信运营近况

    近日,市工信局组织通信运营企业召开全国文明城市创建工作推进会和约谈会,对近期创建工作进行了安排部署。兰州电信、兰州移动、兰州联通创建工作负责人及各测点营业厅负责人80余人参加了会议。本次会议再次强调了创建城市工作的重要性,要求各通信运营商实测点负责人高度重视

    2023-07-13 23:07:01
    764 0
  • android线程间通信有哪些方式 android进程间通信方式讲解

    1、通过Handler机制。处理程序在主线程中定义,子线程发送消息通知处理程序完成UI更新。处理程序对象必须在主线程中定义。如果多个类直接互相调用,不是很方便,需要通过接口传递内容对象或者调用。private void one() { handler=new Handler(){ @Override public void handl

    2023-07-04 05:54:01
    452 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

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

关注微信