• C#串口通信编程类(修改版)


    这是从网上down下来的一个串口通信类,发现close函数忘记了设置Opened属性为false
    还有后面string转byte[]和byte[]转string的函数有错误,索性删掉了
    修改后的串口通信类如下:
    下一篇将把我的测试程序主程序部分全部代码贴出来
    可以坚强勇敢的用来实现串口通信。

    using System;
    using System.Runtime.InteropServices;

    namespace BusApp
    {
     /// <summary>
     ///
     /// </summary>
     public class mycom
     {
      public mycom()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
      }
      public int PortNum; //1,2,3,4
      public int BaudRate; //1200,2400,4800,9600
      public byte ByteSize; //8 bits
      public byte Parity; // 0-4=no,odd,even,mark,space
      public byte StopBits; // 0,1,2 = 1, 1.5, 2
      public int ReadTimeout; //10
     
      //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)]
       private struct DCB
      {
       //taken from c struct in platform sdk
       public int DCBlength;           // sizeof(DCB)
       public int BaudRate;            // current baud rate
       public int fBinary;          // binary mode, no EOF check
       public int fParity;          // enable parity checking
       public int fOutxCtsFlow;      // CTS output flow control
       public int fOutxDsrFlow;      // DSR output flow control
       public int fDtrControl;       // DTR flow control type
       public int fDsrSensitivity;   // DSR sensitivity
       public int fTXContinueOnXoff; // XOFF continues Tx
       public int fOutX;          // XON/XOFF out flow control
       public int fInX;           // XON/XOFF in flow control
       public int fErrorChar;     // enable error replacement
       public int fNull;          // enable null stripping
       public int fRtsControl;     // RTS flow control
       public int fAbortOnError;   // abort on error
       public int fDummy2;        // reserved
       public ushort wReserved;          // not currently used
       public ushort XonLim;             // transmit XON threshold
       public ushort XoffLim;            // transmit XOFF threshold
       public byte ByteSize;           // number of bits/byte, 4-8
       public byte Parity;             // 0-4=no,odd,even,mark,space
       public byte StopBits;           // 0,1,2 = 1, 1.5, 2
       public char XonChar;            // Tx and Rx XON character
       public char XoffChar;           // 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,                         // file name
       uint dwDesiredAccess,                      // access mode
       int dwShareMode,                          // share mode
       int lpSecurityAttributes, // SD
       int dwCreationDisposition,                // how to create
       int dwFlagsAndAttributes,                 // file attributes
       int hTemplateFile                        // handle to template file
       );
      [DllImport("kernel32.dll")]
      private static extern bool GetCommState(
       int hFile,  // handle to communications device
       ref DCB lpDCB    // device-control block
       );
      [DllImport("kernel32.dll")]
      private static extern bool BuildCommDCB(
       string lpDef,  // device-control string
       ref DCB lpDCB     // device-control block
       );
      [DllImport("kernel32.dll")]
      private static extern bool SetCommState(
       int hFile,  // handle to communications device
       ref DCB lpDCB    // device-control block
       );
      [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
       );
     
      public void Open()
      {
      
       DCB dcbCommPort = new DCB();
       COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
      
      
       // OPEN THE COMM PORT.

       
       hComm = CreateFile("COM" + 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("Comm Port Can Not Be Opened"));
       }
     
       // 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.
       // THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST.
       // IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER
       // THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING.
       // ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING.
     
       dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort);
       GetCommState(hComm, ref dcbCommPort);
       dcbCommPort.BaudRate=BaudRate;
       dcbCommPort.Parity=Parity;
       dcbCommPort.ByteSize=ByteSize;
       dcbCommPort.StopBits=StopBits;
       SetCommState(hComm, ref dcbCommPort);
       
       Opened = true;
       
      }
     
      public void Close()
      {
       if (hComm!=INVALID_HANDLE_VALUE)
       {
        CloseHandle(hComm);
                    Opened=false;
       }
      }
     
      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("Comm Port Not Open"));
       }
       return OutBytes;
      }
     
      public int Write(byte[] WriteBytes)
      {
       int BytesWritten = 0;
       if (hComm!=INVALID_HANDLE_VALUE)
       {
        OVERLAPPED ovlCommPort = new OVERLAPPED();
        WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);
       }
       else
       {
        throw(new ApplicationException("Comm Port Not Open"));
       } 
       return BytesWritten;
      }
     }
    }


    敬告各位网友:



        该程序源码已经放到本blog第一篇



    中提供下载!

  • 相关阅读:
    单div绘制多元素图
    js笔试题系列之二——数组与对象
    JS设计模式——策略模式
    js笔试题系列之三——函数
    zepto.js中的Touch事件
    java定时任务之Scheduled注解
    汤姆大叔送书,咱也科学抢书
    Asp.net Mvc自定义客户端验证(CheckBox列表的验证)
    摆脱烂项目
    我的ORM发展史
  • 原文地址:https://www.cnblogs.com/tuyile006/p/514327.html
Copyright © 2020-2023  润新知