/// <summary> /// 获取端口错误的字符 /// </summary> /// <param name="code"></param> /// <returns></returns> public static string GetErrorStr(PortAPI.ErrorCodes code) { switch (code) { default: return("OK"); case PortAPI.ErrorCodes.SIO_BADPORT: return("没有此端口或端口未打开"); case PortAPI.ErrorCodes.SIO_OUTCONTROL: return("无法控制此板"); case PortAPI.ErrorCodes.SIO_NODATA: return("没有数据代读取或没有缓冲区供写"); case PortAPI.ErrorCodes.SIO_OPENFAIL: return("没有此端口或端口已打开"); case PortAPI.ErrorCodes.SIO_RTS_BY_HW: return("因为H/W流量控制而不能设置"); case PortAPI.ErrorCodes.SIO_BADPARM: return("无效参数"); case PortAPI.ErrorCodes.SIO_WIN32FAIL: return("调用win32函数失败请调用GetLastError函数以获取错误代码"); case PortAPI.ErrorCodes.SIO_BOARDNOTSUPPORT: return("此版本不支持这个函数"); case PortAPI.ErrorCodes.SIO_FAIL: return("PCOMM函数运行结果失败"); case PortAPI.ErrorCodes.SIO_ABORT_WRITE: return("写入已被锁定,用户已放弃写入"); case PortAPI.ErrorCodes.SIO_WRITETIMEOUT: return("已发生写入超时"); } }
/// <summary> /// 获取端口读取超时时间 /// </summary> /// <param name="totalTimeouts">超时总值</param> /// <param name="intervalTimeouts">间隔超时值</param> public void GetReadTimeouts(out int totalTimeouts, out int intervalTimeouts) { PortAPI.ErrorCodes code = GetReadTimeouts(Port, out totalTimeouts, out intervalTimeouts); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 设置端口数据接收回调 /// </summary> private void SetDataReceived() { PortAPI.ErrorCodes code = SetDataReceived(Port, m_dataReceived); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 设置端口写入超时时间 /// </summary> /// <param name="totaltimeouts">总超时值</param> /// <param name="intervalTimeouts">间隔超时值 默认0</param> public void SetWriteTimeouts(int totalTimeouts, int intervalTimeouts) { PortAPI.ErrorCodes code = SetWriteTimeouts(Port, totalTimeouts, intervalTimeouts); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 向缓冲区写入数据 /// </summary> /// <param name="str">发送的字符数据</param> /// <param name="hex">是否十六进制 true - 十六进制发送</param> public void Write(string str, bool hex) { PortAPI.ErrorCodes code = Write(Port, str, hex); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 向缓冲区写入数据 /// </summary> /// <param name="buffer">数据流</param> public void Write(byte[] buffer) { PortAPI.ErrorCodes code = Write(Port, buffer); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 清除端口缓冲区数据 /// </summary> /// <param name="func">0 - 清除写入缓冲区数据 1 - 清除读缓冲区数据 2 - 清除读写缓冲区数据</param> public void Flush(int func) { PortAPI.ErrorCodes code = Flush(Port, func); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 读取端口数据 /// </summary> /// <param name="buffer">数据流</param> public void Read(byte[] buffer) { PortAPI.ErrorCodes code = Read(Port, buffer, buffer.Length); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 设置端口波特率、数据位、停止位、检验位 /// </summary> public void Setioctl() { PortAPI.ErrorCodes code = Setioctl(Port, BaudRate, (int)StopBit | (int)DataBit | (int)Parity); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } }
/// <summary> /// 关闭端口 /// </summary> public void Close() { PortAPI.ErrorCodes code = Close(Port); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } IsOpen = false; SerialPortChange?.Invoke(this); }
/// <summary> /// 获取端口写入超时时间 /// </summary> /// <returns></returns> public int GetWriteTimeouts() { int totalTimeout; PortAPI.ErrorCodes code = GetWriteTimeouts(Port, out totalTimeout); if (code != PortAPI.ErrorCodes.SIO_OK) { throw new Exception(GetErrorStr(code)); } return(totalTimeout); }
/// <summary> /// 打开端口 /// </summary> public void Open() { PortAPI.ErrorCodes code = Open(Port); if (code == PortAPI.ErrorCodes.SIO_OK) { IsOpen = true; Setioctl(); SetDataReceived(); SerialPortChange?.Invoke(this); } else { throw new Exception(GetErrorStr(code)); } }