日期:2014-05-18  浏览次数:21112 次

请问C#读写串口的方法
有源码更好,谢谢大家

------解决方案--------------------
C# code
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-co