C#串口通讯类

串口通讯类:

using System;using System.Runtime.InteropServices;namespace JustinIO {
  class CommPort { public string PortNum;
  public int BaudRate;
  public byte ByteSize;
  public byte Parity; // 0-4=no,odd,even,mark,space
  public byte StopBits; // 0,1,2 = 1, 1.5, 2
  public int ReadTimeout;

//comm port win32 file handle
  private int hComm = -1;

public bool Opened = false;

//win32 api constants
  private const uint GENERIC_READ = 0x80000000;
  private const uint GENERIC_WRITE = 0x40000000;
  private const int OPEN_EXISTING = 3;
  private const int INVALID_HANDLE_VALUE = -1;

[StructLayout(LayoutKind.Sequential)]
  public struct DCB {
  //taken from c struct in platform sdk
  public int DCBlength; // sizeof(DCB)
  public int BaudRate; // 指定当前波特率 current baud rate
  // these are the c struct bit fields, bit twiddle flag to set
  public int fBinary; // 指定是否允许二进制模式,在windows95中必须主TRUE binary mode, no EOF check
  public int fParity; // 指定是否允许奇偶校验 enable parity checking
  public int fOutxCtsFlow; // 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。 CTS output flow control
  public int fOutxDsrFlow; // 指定CTS是否用于检测发送控制 DSR output flow control
  public int fDtrControl; // DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手" DTR flow control type
  public int fDsrSensitivity; // 当该值为TRUE时DSR为OFF时接收的字节被忽略 DSR sensitivity
  public int fTXContinueOnXoff; // 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止。TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。 FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。XOFF continues Tx
  public int fOutX; // TRUE时,接收到XoffChar之后便停止发送接收到XonChar之后将重新开始 XON/XOFF out flow control
  public int fInX; // TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去 XON/XOFF in flow control
  public int fErrorChar; // 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符 enable error replacement
  public int fNull; // eTRUE时,接收时去掉空(0值)字节 enable null stripping
  public int fRtsControl; // RTS flow control
  /*RTS_CONTROL_DISABLE时,RTS置为OFF
    RTS_CONTROL_ENABLE时, RTS置为ON
     RTS_CONTROL_HANDSHAKE时,
     当接收缓冲区小于半满时RTS为ON
      当接收缓冲区超过四分之三满时RTS为OFF
     RTS_CONTROL_TOGGLE时,
     当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF*/ public int fAbortOnError; // TRUE时,有错误发生时中止读和写操作 abort on error
  public int fDummy2; // 未使用 reserved

public uint flags;
  public ushort wReserved; // 未使用,必须为0 not currently used
  public ushort XonLim; // 指定在XON字符发送这前接收缓冲区中可允许的最小字节数 transmit XON threshold
  public ushort XoffLim; // 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数 transmit XOFF threshold
  public byte ByteSize; // 指定端口当前使用的数据位 number of bits/byte, 4-8
  public byte Parity; // 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY 0-4=no,odd,even,mark,space
  public byte StopBits; // 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS 0,1,2 = 1, 1.5, 2
  public char XonChar; // 指定用于发送和接收字符XON的值 Tx and Rx XON character
  public char XoffChar; // 指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
  public char ErrorChar; // 本字符用来代替接收到的奇偶校验发生错误时的值 error replacement character
  public char EofChar; // 当没有使用二进制模式时,本字符可用来指示数据的结束 end of input character
  public char EvtChar; // 当接收到此字符时,会产生一个事件 received event character
  public ushort wReserved1; // 未使用 reserved; do not use
  } [StructLayout(LayoutKind.Sequential)]
  private struct COMMTIMEOUTS {
  public int ReadIntervalTimeout;
  public int ReadTotalTimeoutMultiplier;
  public int ReadTotalTimeoutConstant;
  public int WriteTotalTimeoutMultiplier;
  public int WriteTotalTimeoutConstant;
  } [StructLayout(LayoutKind.Sequential)]
  private struct OVERLAPPED {
  public int Internal;
  public int InternalHigh;
  public int Offset;
  public int OffsetHigh;
  public int hEvent;
  }

[DllImport("kernel32.dll")]
  private static extern int CreateFile(
  string lpFileName, // 要打开的串口名称
  uint dwDesiredAccess, // 指定串口的访问方式,一般设置为可读可写方式
  int dwShareMode, // 指定串口的共享模式,串口不能共享,所以设置为0
  int lpSecurityAttributes, // 设置串口的安全属性,WIN9X下不支持,应设为NULL
  int dwCreationDisposition, // 对于串口通信,创建方式只能为OPEN_EXISTING
  int dwFlagsAndAttributes, // 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
  int hTemplateFile // 对于串口通信必须设置为NULL
  );
  [DllImport("kernel32.dll")]
  private static extern bool GetCommState(
  int hFile, //通信设备句柄
  ref DCB lpDCB // 设备控制块DCB
  );
  [DllImport("kernel32.dll")]
  private static extern bool BuildCommDCB(
  string lpDef, // 设备控制字符串
  ref DCB lpDCB // 设备控制块
  );
  [DllImport("kernel32.dll")]
  private static extern bool SetCommState(
  int hFile, // 通信设备句柄
  ref DCB lpDCB // 设备控制块
  );
  [DllImport("kernel32.dll")]
  private static extern bool GetCommTimeouts(
  int hFile, // 通信设备句柄 handle to comm device
  ref COMMTIMEOUTS lpCommTimeouts // 超时时间 time-out values
  );
  [DllImport("kernel32.dll")]
  private static extern bool SetCommTimeouts(
  int hFile, // 通信设备句柄 handle to comm device
  ref COMMTIMEOUTS lpCommTimeouts // 超时时间 time-out values
  );
  [DllImport("kernel32.dll")]
  private static extern bool ReadFile(
  int hFile, // 通信设备句柄 handle to file
  byte[] lpBuffer, // 数据缓冲区 data buffer
  int nNumberOfBytesToRead, // 多少字节等待读取 number of bytes to read
  ref int lpNumberOfBytesRead, // 读取多少字节 number of bytes read
  ref OVERLAPPED lpOverlapped // 溢出缓冲区 overlapped buffer
  );
  [DllImport("kernel32.dll")]
  private static extern bool WriteFile(
  int hFile, // 通信设备句柄 handle to file
  byte[] lpBuffer, // 数据缓冲区 data buffer
  int nNumberOfBytesToWrite, // 多少字节等待写入 number of bytes to write
  ref int lpNumberOfBytesWritten, // 已经写入多少字节 number of bytes written
  ref OVERLAPPED lpOverlapped // 溢出缓冲区 overlapped buffer
  );
  [DllImport("kernel32.dll")]
  private static extern bool CloseHandle(
  int hObject // handle to object
  );
  [DllImport("kernel32.dll")]
  private static extern uint GetLastError();

public void Open()
  {

DCB dcbCommPort = new DCB();
  COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();

// 打开串口 OPEN THE COMM PORT.
  hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
  // 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
  if(hComm == INVALID_HANDLE_VALUE)
  {
  throw(new ApplicationException("非法操作,不能打开串口!"));
  }

// 设置通信超时时间 SET THE COMM TIMEOUTS.
  GetCommTimeouts(hComm,ref ctoCommPort);
  ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
  ctoCommPort.ReadTotalTimeoutMultiplier = 0;
  ctoCommPort.WriteTotalTimeoutMultiplier = 0;
  ctoCommPort.WriteTotalTimeoutConstant = 0;
  SetCommTimeouts(hComm,ref ctoCommPort);

// 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
  GetCommState(hComm, ref dcbCommPort);
  dcbCommPort.BaudRate=BaudRate;
  dcbCommPort.flags=0;
  //dcb.fBinary=1;
  dcbCommPort.flags|=1;
  if (Parity>0)
  {
  //dcb.fParity=1
  dcbCommPort.flags|=2;
  }
  dcbCommPort.Parity=Parity;
  dcbCommPort.ByteSize=ByteSize;
  dcbCommPort.StopBits=StopBits;
  if (!SetCommState(hComm, ref dcbCommPort))
  {
  //uint ErrorNum=GetLastError();
  throw(new ApplicationException("非法操作,不能打开串口!"));
  }
  //unremark to see if setting took correctly
  //DCB dcbCommPort2 = new DCB();
  //GetCommState(hComm, ref dcbCommPort2);
  Opened = true;
  }

public void Close() {
  if (hComm!=INVALID_HANDLE_VALUE) {
  CloseHandle(hComm);
  }
  }

public byte[] Read(int NumBytes) {
  byte[] BufBytes;
  byte[] OutBytes;
  BufBytes = new byte[NumBytes];
  if (hComm!=INVALID_HANDLE_VALUE) {
  OVERLAPPED ovlCommPort = new OVERLAPPED();
  int BytesRead=0;
  ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
  OutBytes = new byte[BytesRead];
  Array.Copy(BufBytes,OutBytes,BytesRead);
  }
  else {
  throw(new ApplicationException("串口未打开!"));
  }
  return OutBytes;
  }

public void Write(byte[] WriteBytes) {
  if (hComm!=INVALID_HANDLE_VALUE) {
  OVERLAPPED ovlCommPort = new OVERLAPPED();
  int BytesWritten = 0;
  WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);
  }
  else {
  throw(new ApplicationException("串口未打开!"));
  }
  }
  } class HexCon {
  // 把十六进制字符串转换成字节型和把字节型转换成十六进制字符串 converter hex string to byte and byte to hex string
  public static string ByteToString(byte[] InBytes) {
  string StringOut="";
  foreach (byte InByte in InBytes) {
  StringOut=StringOut + String.Format("{0:X2} ",InByte);
  }
  return StringOut;
  }
  public static byte[] StringToByte(string InString) {
  string[] ByteStrings;
  ByteStrings = InString.Split(" ".ToCharArray());
  byte[] ByteOut;
  ByteOut = new byte[ByteStrings.Length-1];
  for (int i = 0;i==ByteStrings.Length-1;i++) {
  ByteOut[i] = Convert.ToByte(("0x" + ByteStrings[i]));
  }
  return ByteOut;
  }
  }
  }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c# 串口通信
, int
, 串口通信
, cts
, private
, 串口通信校验问题
, 串口通讯
, 串口
, 字节
, 缓冲区
, c# 串口 发送
, 串口发送
, public
串口接收缓冲区问题
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-27 06:33:56

C#串口通讯类的相关文章

C#结合串口通信类实现串口通信源代码

mycom是串口通信类.下面是串口通讯测试程序的源代码,将mycom类放在此项目中,可以实现简单的串口通信,希望读者能通过这个程序对串口通信过程有一个初步的了解: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; namesp

android 蓝牙-Android蓝牙4.0串口通讯问题

问题描述 Android蓝牙4.0串口通讯问题 大神,我通过UUID特征值去获取设备信息,如设备型号.设备名称.电量.信号.但是怎么也接收不到血糖或者血压值.这是怎么情况?能帮忙分析一下吗? 解决方案 http://blog.csdn.net/innost/article/details/9187199 解决方案二: 血糖或者血压值这类东东,是非标准的,你怎么就能确认可以获取到呢? 备型号.设备名称.电量.信号此类,现在的 BT 协议很多是支持的,但并不代表协议能支持所有你想要的功能与数据. 解

VC 控制台程序串口通讯,串口收到数据如何发送消息给主线程?

问题描述 VC 控制台程序串口通讯,串口收到数据如何发送消息给主线程? 用CSerialPort类实现串口通讯,该类在收到数据后会调用::sendmessage函数,该函数的第一个参数是窗口句柄,但是控制台没有窗口句柄,该怎么发送消息?main函数里怎么响应消息? 解决方案 sendmessage wm_copydata 解决方案二: 控制台程序可以调用http://blog.csdn.net/coredoor/article/details/8582001

我用c#写的串口通讯

窗口数据发送和接受的类 新建 PortControl 程序代码 using System;using System.IO.Ports;using System.Windows.Forms; namespace SPC{    /// <summary>    /// 串口控制      /// </summary>    public class PortControl     {        /// <summary>        /// 定义一个串口类     

串口通讯-Linux下多线程串口通信问题

问题描述 Linux下多线程串口通信问题 我做的一个项目,把串口读写采用了一个独立的线程,进行数据的读写,在调试时,发现只要启动另外一个计算量比较大的线程,串口通信就出错了,而只要不启动这个线程,可以启动其他线程,串口工作没有任何问题,求原因? 解决方案 在C#中使用SerialPort类实现串口通信,多线程问题在C#中使用SerialPort类实现串口通信 遇到多线程问题在C#中使用SerialPort类实现串口通信 遇到多线程问题 解决方案二: 这两个线程有耦合吧?认真分析一下之间的联系.可

VB.NET SerialPort串口通讯问题,请多多指导!多谢!

问题描述 一个交互式串口通讯的小问题,热心人帮忙指点一下!!!本人(VB新手)使用VB.NET编写了一个串口工具,纯属偷懒的工具^_^.使用SerialPort(串口收发).OpenFileDialog(打开文本).Button(文本发送)等控件.串口已能连接,并能接收和发送字符串.现在问题如下:在1.txt里面写着需要按顺序发送的指令.1.TXT内容如下:SHOSHO1SHO2SHOGSHOL........等当按下Button按钮时,选择要发送的指令类的TXT文本(1.txt),首先按行发送

PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]

php5|应用演示 一. 预先的知识: 什么是RS232/RS484及其应用?       QUOTE:RS232接口就是串口,电脑机箱后方的9芯(或25芯)插座,旁边一般有 "|O|O|" 样标识. 一般机箱有两个,新机箱有可能只有一个.笔记本电脑有可能没有. 有很多工业仪器将它作为标准通信端口.通信的内容与格式一般附在仪器的用户说明书中. 计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式.由于串行通讯方式具有使用线路少.成本低,特别是在远程传输时,避免了

Visual Basic串口通讯调试方法

visual 现有电子秤一台,使用串口与计算机进行通讯.编写VB程序来访问串口,达到读取电子秤上显示的数据.该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600.偶校验.7个数据位.2个停止位.所有字符均发送11位ASCII码,一个起始位.在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中).具体程序如下:控件简称:MSC Dim Out(12) As Byte '接收var中的值Dim var As Va

php main 与 iframe 相互通讯类(同域/跨域)

main 与 iframe 相互通讯类 之前写过一篇<iframe与主框架跨域相互访问方法>,介绍了main与iframe相互通讯的原理,不了解原理的可以先看看. 今天把main与iframe相互通讯的方法封装成类,主要有两个文件, JS:FrameMessage.js 实现调用方法的接口,如跨域则创建临时iframe,调用同域执行者. PHP:FrameMessage.class.php 实现接收到跨域请求时,根据参数返回执行方法的JS code. 功能如下: 1.支持同域与跨域通讯 2.传