public static void UpdateDCB(ref Win32.DCB dcb, SerialTerminalParam param) { dcb.BaudRate = (uint)param.BaudRate; dcb.ByteSize = param.ByteSize; dcb.Parity = (byte)param.Parity; dcb.StopBits = (byte)param.StopBits; //フロー制御:TeraTermのソースからちょっぱってきた if (param.FlowControl == FlowControl.Xon_Xoff) { //dcb.fOutX = TRUE; //dcb.fInX = TRUE; //dcbを完全にコントロールするオプションが必要かもな dcb.Misc |= 0x300; //上記2行のかわり dcb.XonLim = 2048; //CommXonLim; dcb.XoffLim = 2048; //CommXoffLim; dcb.XonChar = 0x11; dcb.XoffChar = 0x13; } else if (param.FlowControl == FlowControl.Hardware) { //dcb.fOutxCtsFlow = TRUE; //dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; dcb.Misc |= 0x4 | 0x2000; } }
public static ConnectionTag CreateNewSerialConnection(IWin32Window parent, SerialTerminalParam param) { bool successful = false; FileStream strm = null; try { string portstr = String.Format("\\\\.\\COM{0}", param.Port); IntPtr ptr = Win32.CreateFile(portstr, Win32.GENERIC_READ | Win32.GENERIC_WRITE, 0, IntPtr.Zero, Win32.OPEN_EXISTING, Win32.FILE_ATTRIBUTE_NORMAL | Win32.FILE_FLAG_OVERLAPPED, IntPtr.Zero); if (ptr == Win32.INVALID_HANDLE_VALUE) { string msg = GEnv.Strings.GetString("Message.CommunicationUtil.FailedToOpenSerial"); int err = Win32.GetLastError(); if (err == 2) { msg += GEnv.Strings.GetString("Message.CommunicationUtil.NoSuchDevice"); } else if (err == 5) { msg += GEnv.Strings.GetString("Message.CommunicationUtil.DeviceIsBusy"); } else { msg += "\nGetLastError=" + Win32.GetLastError(); } throw new Exception(msg); } //strm = new FileStream(ptr, FileAccess.Write, true, 8, true); Win32.DCB dcb = new Win32.DCB(); FillDCB(ptr, ref dcb); UpdateDCB(ref dcb, param); if (!Win32.SetCommState(ptr, ref dcb)) { throw new Exception(GEnv.Strings.GetString("Message.CommunicationUtil.FailedToConfigSerial")); } Win32.COMMTIMEOUTS timeouts = new Win32.COMMTIMEOUTS(); Win32.GetCommTimeouts(ptr, ref timeouts); timeouts.ReadIntervalTimeout = 0xFFFFFFFF; timeouts.ReadTotalTimeoutConstant = 0; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 100; timeouts.WriteTotalTimeoutMultiplier = 100; Win32.SetCommTimeouts(ptr, ref timeouts); successful = true; System.Drawing.Size sz = GEnv.Frame.TerminalSizeForNextConnection; SerialTerminalConnection r = new SerialTerminalConnection(param, ptr, sz.Width, sz.Height); r.SetServerInfo("COM" + param.Port, null); return(new ConnectionTag(r)); } catch (Exception ex) { GUtil.Warning(parent, ex.Message); return(null); } finally { if (!successful && strm != null) { strm.Close(); } } }
public static ConnectionTag CreateNewSerialConnection(IWin32Window parent, SerialTerminalParam param) { bool successful = false; FileStream strm = null; try { string portstr = String.Format("\\\\.\\COM{0}", param.Port); IntPtr ptr = Win32.CreateFile(portstr, Win32.GENERIC_READ|Win32.GENERIC_WRITE, 0, IntPtr.Zero, Win32.OPEN_EXISTING, Win32.FILE_ATTRIBUTE_NORMAL|Win32.FILE_FLAG_OVERLAPPED, IntPtr.Zero); if(ptr==Win32.INVALID_HANDLE_VALUE) { string msg = GEnv.Strings.GetString("Message.CommunicationUtil.FailedToOpenSerial"); int err = Win32.GetLastError(); if(err==2) msg += GEnv.Strings.GetString("Message.CommunicationUtil.NoSuchDevice"); else if(err==5) msg += GEnv.Strings.GetString("Message.CommunicationUtil.DeviceIsBusy"); else msg += "\nGetLastError="+ Win32.GetLastError(); throw new Exception(msg); } //strm = new FileStream(ptr, FileAccess.Write, true, 8, true); Win32.DCB dcb = new Win32.DCB(); FillDCB(ptr, ref dcb); UpdateDCB(ref dcb, param); if(!Win32.SetCommState(ptr, ref dcb)) throw new Exception(GEnv.Strings.GetString("Message.CommunicationUtil.FailedToConfigSerial")); Win32.COMMTIMEOUTS timeouts = new Win32.COMMTIMEOUTS(); Win32.GetCommTimeouts(ptr, ref timeouts); timeouts.ReadIntervalTimeout = 0xFFFFFFFF; timeouts.ReadTotalTimeoutConstant = 0; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 100; timeouts.WriteTotalTimeoutMultiplier = 100; Win32.SetCommTimeouts(ptr, ref timeouts); successful = true; System.Drawing.Size sz = GEnv.Frame.TerminalSizeForNextConnection; SerialTerminalConnection r = new SerialTerminalConnection(param, ptr, sz.Width, sz.Height); r.SetServerInfo("COM"+param.Port, null); return new ConnectionTag(r); } catch(Exception ex) { GUtil.Warning(parent, ex.Message); return null; } finally { if(!successful && strm!=null) strm.Close(); } }
public static bool FillDCB(IntPtr handle, ref Win32.DCB dcb) { dcb.DCBlength = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32.DCB)); //sizeofくらいunsafeでなくても使わせてくれよ return(Win32.GetCommState(handle, ref dcb)); }
public void ApplySerialParam(SerialTerminalParam param) { //param�̓�e��DCB��X�V���ăZ�b�g���Ȃ��� Win32.DCB dcb = new Win32.DCB(); CommunicationUtil.FillDCB(_fileHandle, ref dcb); CommunicationUtil.UpdateDCB(ref dcb, param); if(!Win32.SetCommState(_fileHandle, ref dcb)) throw new ArgumentException(GEnv.Strings.GetString("Message.SerialTerminalConnection.ConfigError")); _param = param; //SetCommState������������X�V }