| 
 | 
 
    由于c# SerialPort类在串口操作方面存在bug,会概率性的出现串口打开失败的问题,建议使用c++ api来直接操作串口,附件是在网上收集的串口操作类,经测试比较稳定,要用到串口操作的类请使用此类来编程。 
 
   -  ///<summary>
 
 -         ///建立与串口的连接
 
 -         ///</summary>
 
 -         public int Open()
 
 -         {
 
 -             DCB dcb = new DCB();
 
 -             COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
 
  
-             // 打开串口
 
 -             hComm = CreateFile(PortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
 
 -             if (hComm == INVALID_HANDLE_VALUE)
 
 -             {
 
 -                 return -1;
 
 -             }
 
 -             // 设置通信超时时间
 
 -             GetCommTimeouts(hComm, ref ctoCommPort);
 
 -             ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
 
 -             ctoCommPort.ReadTotalTimeoutMultiplier = 0;
 
 -             ctoCommPort.WriteTotalTimeoutMultiplier = 0;
 
 -             ctoCommPort.WriteTotalTimeoutConstant = 0;
 
 -             SetCommTimeouts(hComm, ref ctoCommPort);
 
  
-             //设置串口参数
 
 -             GetCommState(hComm, ref dcb);
 
 -             dcb.DCBlength = Marshal.SizeOf(dcb);
 
 -             dcb.BaudRate = BaudRate;
 
 -             dcb.flags = 0;
 
 -             dcb.DataBits = (byte)DataBits;
 
 -             dcb.StopBits = StopBits;
 
 -             dcb.Parity = (byte)Parity;
 
  
-             //------------------------------
 
 -             SetDcbFlag(0, 1, dcb);            //二进制方式
 
 -             SetDcbFlag(1, (Parity == 0) ? 0 : 1, dcb);
 
 -             //SetDcbFlag(2, DtrEnable?1:0, dcb);            //不用CTS检测发送流控制
 
 -             //SetDcbFlag(3, RtsEnable?1:0, dcb);            //不用DSR检测发送流控制
 
 -             SetDcbFlag(2, 0, dcb);            //不用CTS检测发送流控制
 
 -             SetDcbFlag(3, 0, dcb);            //不用DSR检测发送流控制
 
 -             SetDcbFlag(4, 0, dcb);            //禁止DTR流量控制
 
 -             SetDcbFlag(6, 0, dcb);            //对DTR信号线不敏感
 
 -             SetDcbFlag(9, 1, dcb);            //检测接收缓冲区
 
 -             SetDcbFlag(8, 0, dcb);            //不做发送字符控制
 
 -             SetDcbFlag(10, 0, dcb);           //是否用指定字符替换校验错的字符
 
 -             SetDcbFlag(11, 0, dcb);           //保留NULL字符
 
 -             SetDcbFlag(12, 0, dcb);           //允许RTS流量控制
 
 -             SetDcbFlag(14, 0, dcb);           //发送错误后,继续进行下面的读写操作
 
 -             //--------------------------------
 
 -             dcb.wReserved = 0;                       //没有使用,必须为0      
 
 -             dcb.XonLim = 0;                          //指定在XOFF字符发送之前接收到缓冲区中可允许的最小字节数
 
 -             dcb.XoffLim = 0;                         //指定在XOFF字符发送之前缓冲区中可允许的最小可用字节数
 
 -             dcb.XonChar = 0;                         //发送和接收的XON字符
 
 -             dcb.XoffChar = 0;                        //发送和接收的XOFF字符
 
 -             dcb.ErrorChar = 0;                       //代替接收到奇偶校验错误的字符
 
 -             dcb.EofChar = 0;                         //用来表示数据的结束     
 
 -             dcb.EvtChar = 0;                         //事件字符,接收到此字符时,会产生一个事件       
 
 -             dcb.wReserved1 = 0;                      //没有使用
 
  
-             if (!SetCommState(hComm, ref dcb))
 
 -             {
 
 -                 return -2;
 
 -             }
 
 -             IsOpen = true;
 
 -             return 0;
 
 -         }
 
  复制代码 
 
 
 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
 
 
 
 |