这里写一种,COM口的数据接收,发送方法。

1.COMHelper类

/// <summary>初始化串行端口</summary>
private SerialPort _serialPort;

public SerialPort serialPort
{
get { return _serialPort; }
set { _serialPort = value; }
}

/// <summary>
/// COM口通信构造函数
/// </summary>
/// <param name="PortID">通信端口</param>
/// <param name="baudRate">波特率</param>
/// <param name="parity">奇偶校验位</param>
/// <param name="dataBits">标准数据位长度</param>
/// <param name="stopBits">每个字节的标准停止位数</param>
/// <param name="readTimeout">获取或设置读取操作未完成时发生超时之前的毫秒数</param>
/// <param name="writeTimeout">获取或设置写入操作未完成时发生超时之前的毫秒数</param>
public ComHelper(string PortID, int baudRate, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One, int readTimeout = 100, int writeTimeout = 100)
{
try
{
serialPort = new SerialPort();
serialPort.PortName = "COM" + PortID;//通信端口
serialPort.BaudRate = baudRate;//波特率
serialPort.Encoding = Encoding.ASCII;
serialPort.Parity = parity;//奇偶校验位
serialPort.DataBits = dataBits;//标准数据位长度
serialPort.StopBits = stopBits;//每个字节的标准停止位数
serialPort.ReadTimeout = readTimeout;//获取或设置读取操作未完成时发生超时之前的毫秒数
serialPort.WriteTimeout = writeTimeout;//获取或设置写入操作未完成时发生超时之前的毫秒数
}
catch (Exception ex) { throw new Exception(ex.Message); }
}

/// <summary>
/// 打开COM口
/// </summary>
/// <returns>true 打开成功;false 打开失败;</returns>
public bool Open()
{
try
{
if (serialPort.IsOpen == false)
{
serialPort.Open();
return true;
}
}
catch (Exception ex)
{
LogImpl.Debug(ex.ToString());
}
return false;
}

/// <summary>
/// 关闭COM口
/// </summary>
/// <returns>true 关闭成功;false 关闭失败;</returns>
public bool Close()
{
try
{
serialPort.Close();
return true;
}
catch
{
return false;
}
}

/// <summary>
/// 判断端口是否打开
/// </summary>
/// <returns></returns>
public bool IsOpen()
{
try
{
return serialPort.IsOpen;
}
catch { throw; }
}

/// <summary>
/// 向COM口发送信息
/// </summary>
/// <param name="sendData">16进制的字节</param>
public void WriteData(byte[] sendData)
{
try
{
if (IsOpen())
{
Thread.Sleep(5);
serialPort.Write(sendData, 0, sendData.Length);
}
}
catch { throw; }
}

/// <summary>
/// 接收来自COM的信息
/// </summary>
/// <returns>返回收到信息的数组</returns>
public string[] ReceiveDataArray()
{

try
{
Thread.Sleep(5);
if (!serialPort.IsOpen) return null;
int DataLength = serialPort.BytesToRead;
byte[] ds = new byte[DataLength];
int bytecount = serialPort.Read(ds, 0, DataLength);
return ByteToStringArry(ds);
}
catch (Exception ex)
{
LogImpl.Debug(""+ex.ToString());
throw;
}
}

/// <summary>
/// 把字节型转换成十六进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string[] ByteToStringArry(byte[] bytes)
{
try
{
string[] strArry = new string[bytes.Length];
for (int i = 0; i < bytes.Length; i++)
{
strArry[i] = String.Format("{0:X2} ", bytes[i]).Trim();
}
return strArry;
}
catch { throw; }
}

/// <summary>
/// 清除缓存数据
/// </summary>
public void ClearDataInBuffer()
{
try
{
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();
}
catch { throw; }
}

/// <summary>
/// 注册 数据接收事件,在接收到数据时 触发
/// </summary>
/// <param name="serialPort_DataReceived"></param>
public void AddReceiveEventHanlder(SerialPortDataReceivedDelegate serialPort_DataReceived)
{
try
{
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}
catch { throw; }
}

//接收事件是否有效 true开始接收,false停止接收。默认true

public static bool ReceiveEventFlag = true;
/// <summary>
/// 接收数据触发,将接收的数据,通过一个定义的数据接收事件,传递出去。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (ReceiveEventFlag == false)
{
return;
}
string strReceive = ReceiveDataString();
if (!string.IsNullOrEmpty(strReceive))
{
OnReceiveDataHanlder(new ReceiveEventArgs() { ReceiveData = strReceive });
}
}

#region 数据接收事件
public event EventHandler<ReceiveEventArgs> ReceiveDataHandler;

protected void OnReceiveDataHanlder(ReceiveEventArgs e)
{
EventHandler<ReceiveEventArgs> handler = ReceiveDataHandler;
if (handler != null) handler(this, e);
}
#endregion

这个helper类,没多少东西,一般也够用了,主要就是,读取,写入。

2.页面或其他地方使用

public ComHelper comHelp;

string PortID = System.Configuration.ConfigurationManager.AppSettings["PeopleAdr"];
int baudRate = 9600;
int dataBits = 8;
System.IO.Ports.StopBits oStopBits = System.IO.Ports.StopBits.One;
//无奇偶校验位
System.IO.Ports.Parity oParity = System.IO.Ports.Parity.None;
int ReadTimeout = 100;
int WriteTimeout = -1;
comHelp = new ComHelper(PortID, baudRate, oParity, dataBits, oStopBits, ReadTimeout, WriteTimeout);
if (!comHelp.IsOpen()) comHelp.Open();

comHelp.AddReceiveEventHanlder(comHelp.serialPort_DataReceived);//将接收到数据,处理数据的方法注册进去
comHelp.ReceiveDataHandler += new EventHandler<ReceiveEventArgs>(rds_ReceiveDataHandler);//将传递接收数据的方法注册进去,如果接收到数据,触发事件,自动存串口数据。

public string strComReciveData = "";//从COM口接收到的数据,如果接收到数据,通过事件触发,会自动有值。
void rds_ReceiveDataHandler(object sender, ReceiveEventArgs e)
{
try
{
strComReciveData = e.ReceiveData;
Thread.Sleep(200);
//清空缓存
comHelp.ClearDataInBuffer();
}
catch (Exception ex)
{
LogImpl.Debug(ex.ToString());
Thread.Sleep(200);
}
}

//这是写入数据,就简单多了。

byte[] send = new byte[] { 0x7F, 0x02, 0x8F };
comHelp.WriteData(send);

C#,COM口,接收,发送数据的更多相关文章

  1. AJAX中使用post,get接收发送数据的区别

    如何发起请求 xhr.send(); 备注: 如果是get方式,send()命令中不用写任何参数 传递的数据可以写在url中,服务器用$_GEET["参数名"]接收 如果是post ...

  2. 读取com口接收byte数据的处理

    procedure Tfrm_CheckCloth.cnrs232ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); ...

  3. PHP发送和接收POST数据

    1. 发送post数据 $data = '{ "id": "17999030", "method": "sayHello" ...

  4. STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题

    STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...

  5. C#串口通信—向串口发送数据,同步接收返回数据

    最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接 ...

  6. nodejs实现Websocket的数据接收发送

    在去年的时候,写过一篇关于websocket的博文:http://www.cnblogs.com/axes/p/3586132.html ,里面主要是借助了nodejs-websocket这个插件,后 ...

  7. Android蓝牙连接以及数据接收发送

    1.加入权限 <uses-feature android:name="android.hardware.bluetooth_le" android:required=&quo ...

  8. stm32 usb数据接收与数据发送程序流程分析

    http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备 ...

  9. Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据

    1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...

随机推荐

  1. 201521123075 《Java程序设计》第13周学习总结

    1. 本周学习总结 协议 网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则),比如http, ftp等 IP层协议(Internet Protocol) Internet上的 ...

  2. Java、javax、org、sun、Java.util等常用包的区别、详解、实例

    Java.javax.org.sun包都是jdk提供的类包,且都是在rt.jar中.rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就 ...

  3. POJ 3625 最小生成树 Prim C++

    Building Roads Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11861   Accepted: 3376 D ...

  4. Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

    前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...

  5. YYHS-鏖战字符串

    题目描述 Abwad在nbc即将完成她的程序的时候,急中生智拔掉了她电脑的电源线,争取到了宝贵的时间.作为著名论文<论Ctrl-C与Ctrl-V在信息学竞赛中的应用>的作者,他巧妙地使用了 ...

  6. linux中文乱码

    txt文件在linux环境下打开呈现了乱码状态. 解决方法1:在linux用iconv命令,如乱码文件名为zhongwen.txt,那么在终端输入如下命令: iconv -f gbk -t utf8 ...

  7. [js高手之路] html5 canvas系列教程 - 掌握画直线图形的常用API

    我们接着上文[js高手之路] html5 canvase系列教程 - 认识canvas以及基本使用方法继续. 一.直线的绘制 cxt.moveTo( x1, y1 ): 将画笔移动到x1, y1这个点 ...

  8. MySQL_日期函数汇总

              如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!         关于MySQL日期时间函数,每回总 ...

  9. 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数

    目录: »  plot 最常用的二维曲线绘图函数 >  帮助文档 >  基本使用语法 >  线条的样式.符号和颜色调整 >  图形属性调整 >  使用图形句柄进行设置 » ...

  10. QT_FORWARD_DECLARE_CLASS

    相当于class 类名. 那么他和#include 包含头文件有什么区别呢 首先我们为什么要包括头文件问题的回答很简单通常是我们需要获得某个类型的定义(definition).那么接下来的问题 ...