|
由于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;
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|