VC#串口操作实用类

做工业通信有很长时间了,特别是串口(232/485),有VB/VC/C各种版本的串口操作代码,这些代码也经过了多年的现场考验,应该说是比较健壮的代码,但是目前却没有C#相对成熟的串口操作代码,最近用Moxa的设备开发基于WinCE5.0的串口操作代码,所以就扩充完善了一下串口操作,特别是SendCommand函数,这是我比较常用的主从通信代码,不喜欢用事件或线程接数据,在规定的超时时间内直接循环判断要接收的数据。

下面是具体的代码:

public class PortData
{
public event PortDataReceivedEventHandle Received;
public event SerialErrorReceivedEventHandler Error; 
public SerialPort port;
public bool ReceiveEventFlag = false; //接收事件是否有效 false表示有效
 public PortData(string sPortName, int baudrate,Parity parity,SerialInterface.SerialMode mode)
  {
  port = new SerialPort(sPortName, baudrate, parity, 8, StopBits.One);
  port.RtsEnable = true;
  port.ReadTimeout = 3000;
  port.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
  port.ErrorReceived += new SerialErrorReceivedEventHandler(ErrorEvent);
  } ~PortData()
  {
  Close();
  }
  public void Open()
  {
  if (!port.IsOpen)
  { 
  port.Open();
  }
  } public void Close()
  {
  if (port.IsOpen)
  {
  port.Close();
  }
  }
  //数据发送
  public void SendData(byte[] data)
  {
  if (port.IsOpen)
  {
  port.Write(data, 0, data.Length);
  }
  }
  public void SendData(byte[] data,int offset,int count)
  {
  if (port.IsOpen)
  {
  port.Write(data, offset, count);
  }
  }
  //发送命令
  public int SendCommand(byte[] SendData, ref byte[] ReceiveData,int Overtime)
  { if(port.IsOpen)
  {
  ReceiveEventFlag = true; //关闭接收事件
  port.DiscardInBuffer(); //清空接收缓冲区 
  port.Write(SendData, 0, SendData.Length);
  int num=0,ret=0;
  while (num++ < Overtime)
  {
  if (port.BytesToRead >= ReceiveData.Length) break;
  System.Threading.Thread.Sleep(1); 
  }
  if (port.BytesToRead >= ReceiveData.Length) 
  ret = port.Read(ReceiveData, 0, ReceiveData.Length);
  ReceiveEventFlag = false; //打开事件
  return ret;
  }
  return -1;
  } public void ErrorEvent(object sender, SerialErrorReceivedEventArgs e)
  {
  if (Error != null) Error(sender, e);
  }
  //数据接收
  public void DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
  //禁止接收事件时直接退出
  if (ReceiveEventFlag) return; byte[] data = new byte[port.BytesToRead];
  port.Read(data, 0, data.Length);
  if (Received != null) Received(sender, new PortDataReciveEventArgs(data));
  } public bool IsOpen()
  {
  return port.IsOpen;
  }
  }
  public delegate void PortDataReceivedEventHandle(object sender, PortDataReciveEventArgs e);
  public class PortDataReciveEventArgs : EventArgs
  {
  public PortDataReciveEventArgs()
  {
  this.data = null;
  } public PortDataReciveEventArgs(byte[] data)
  {
  this.data = data;
  } private byte[] data; public byte[] Data
  {
  get { return data; }
  set { data = value; }
  }
  }

【附注】1~9 串口的名称是 "COMx:",>9的以前用\\\\.\\COMx:比较好使,但是在moxa 661设备上却不行,要用如下格式"$device\\COM" + PortNo.ToString() + "\0",也许这是moxa修改了相应的串口驱动。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c# 串口通信
, byte
, 串口
, 代码
, 串口serialport
, moxa 字符叠加
, data
, vc/c++
, bytestoread
, 485串口
, public
, port
, c# 串口通信 线程
串口vc++dllc#
vc++6.0、vc投资、vc是什么意思、vc2010、vc组合,以便于您获取更多的相关知识。

时间: 2024-08-02 06:03:11

VC#串口操作实用类的相关文章

深入浅出VC++串口编程之第三方类

串口类 从本系列文章可以看出,与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控 件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出 OnComm消息)方式实现串口的异步访问. 尽管如此,MScomm控件的使用仍有诸多不便,譬如其发送和接收数据都要进行VARIANT类 型对象与字符串的转化等.因此,国内外许多优秀的程序员自己编写了一些串口类,使用这 些类,我们将可以更方便的操作串口.在笔者的<深入浅出Win32多线程程序设计之综合实例 >

vc++-VC++串口编程求助。。。。。

问题描述 VC++串口编程求助..... 非常著名的serialport类中有这么一段代码: bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov); if (!bResult) { // If WaitCommEvent() returns FALSE, process the last error to determin switch (dwError = GetLastError()) { case ERRO

串口通信-vc++串口上位机串口设置

问题描述 vc++串口上位机串口设置 串口打开时,选择了一个无效的串口号后,怎么令串口按钮关闭.如图 图1是串口正常打开,图二是选择无效端口号后串口按钮的变化(串口关闭).请问是如何实现的?非常感谢! 解决方案 http://zhidao.baidu.com/link?url=YPewInrq7LneRthad_AJ1OgGmTZuMhRNayv0Pkq5v4mHdy3ZOKlax3q22fEhBTLC8kgrK-Zo8oIk5irlqdsaWK 解决方案二: VC++ .net 串口操作(简单

C#异步数据接收串口操作类

数据|异步 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我(dyj057@gmail.com)联系.你也可以教我怎么上传源代码. using System;using System.Runtime.InteropServices; /// <summary>/// (C)2003-2005 C2217 Studio 保留所有权利/// /// 文件名称: IbmsSerialPort.cs/// 文件ID

深入浅出VC++串口编程之基于Win32 API

1.API描述 在WIN32 API中,串口使用文件方式进行访问,其操作的API基本上与 文件操作的API一致. 打开串口 Win32 中用于打开串口的API 函数为 CreateFile,其原型为: HANDLE CreateFile ( LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2 DWORD dwAccess, //指定串口访问的类型 ,可以是读取.写入或两者并列 DWORD dwShareMode, //指定共享属性,由于串口不 能共享,该参数

深入浅出VC++串口编程之短信应用开发

前面数次连载我们以较长的篇幅讲解了串口通信的硬件原理.DOS平台控制以及基于WIN32 API.控件和第三方类的串口编程.作为本系列文章的最后一次连载,本章将给出一个典型的 应用实例:西门子短信服务模块TC35的串口控制. 1.短信控制终端 作为短信 (Short Message Service,SMS)一族,想必你有这样的体会:用手机编辑短信息十分不便. 容易出错,而且修改费时,若能用计算机来收发短信则方便许多.注意,本文所说的用计算 机收发短信并不是说通过"网易短信王"等方式在In

感谢帮忙!-VC串口数据处理绘制实时波形

问题描述 VC串口数据处理绘制实时波形 MSCOMM控件编写串口接收,settings"19200,n,8,1" 接收到数据块:35 2e b7 36 8d 0a 53 d4 ac 4e d4 ac 2d 30 30 30(不断重复),我改怎么取需要的数据?! 附注:(字符接收)5??j S?N??-0005.69? S??N??-0005.69? S??N??-0005.69? S??N??-0005.69? S??N??-0005.69? S??N??-0005.69? S??N?

串口通讯-vc串口通信的程序求解

问题描述 vc串口通信的程序求解 vc初学者要写一个串口通信的程序,串口如何通信的不是很了解啊! 解决方案 VC串口通信 解决方案二: VC中采用MSCOMM控件,首先对串口进行初始化,然后在OnOnCommMscomm函数中处理接收的数据. 解决方案三: http://blog.csdn.net/jax_lee/article/details/6764408图文并茂http://blog.csdn.net/a_runing_man/article/details/9947343代码http:/

java串口操作 java communications api 现在不能用了吗?

问题描述 最近需要做一个东西,需要用JAVA对串口进行操作,听说SUN对串口操作有个java communications api,但是好象不能用了,哪位大哥/大姐有新的吗? 解决方案 SUN只发了For Linux的CommAPI实现,Windows下的建议使用RXTX包.这里:http://users.frii.com/jarvi/rxtx/download.html