public void WriteComm(SerWriteInfo wi) { if (wi == null) { return; } lock (_writeQueueLock) { _writeQueue.Add(wi); Monitor.Pulse(_writeQueueLock); } /* * new Thread(() => * { * if (m_hCommPort == IntPtr.Zero) return; * NativeOverlapped ov = new System.Threading.NativeOverlapped(); * if (!GWin32.WriteFileEx(m_hCommPort, buf, (uint)buf.Length, ref ov, (uint err, uint b, ref NativeOverlapped c) => * { * if (err != 0) reject("Write come done " + err); * resolve(b); * })) * { * reject("failed write comm " + getWinErr()); * } * // IOCompletion routine is only called once this thread is in an alertable wait state. * gwait(); //only with thread * }).Start(); */ }
public bool canOverRide(SerWriteInfo wr) { if (OverRideInfo != null && wr.OverRideInfo != null) { return(OverRideInfo.canOverRide(wr.OverRideInfo)); } return(false); }
public void Start(IComApp app) { GWin32.PurgeComm(m_hCommPort, 0x0004 | 0x0008); app.OnStart(this); if (_thread != null) { return; } threadStarted = true; new Thread(() => { bool inWrite = false; uint writeErr = 0; uint writeOk = 0; NativeOverlapped ov = new System.Threading.NativeOverlapped(); while (threadStarted) { if (m_hCommPort == null || m_hCommPort.IsInvalid) { break; } SerWriteInfo wi = null; lock (_writeQueueLock) { if (_writeQueue.Count == 0) { Monitor.Wait(_writeQueueLock); } while (inWrite) { Thread.Sleep(100); Console.WriteLine("in write wait"); } wi = _writeQueue[0]; _writeQueue.RemoveAt(0); } //if (wi.Done != null) try { wi.Done(0, "no buf"); } catch { }; //continue; if (wi == null || wi.buf == null || wi.buf.Length == 0) { if (wi.Done != null) { try { wi.Done(0, "no buf"); } catch { } } ; continue; } inWrite = true; ResetOverlapped(ov); var writeRes = GWin32.WriteFileEx(m_hCommPort, wi.buf, (uint)wi.buf.Length, ref ov, (uint err, uint b, ref NativeOverlapped c) => { writeErr = err; writeOk = b; inWrite = false; }); if (!writeRes) { //Console.WriteLine("failed write comm " + getWinErr()); if (wi.Done != null) { try { wi.Done(255, "failed write comm " + getWinErr()); } catch { } } ; inWrite = false; } // IOCompletion routine is only called once this thread is in an alertable wait state. gwait(); //only with thread if (writeRes) { if (wi.Done != null) { try { wi.Done(writeErr, writeErr == 0 ? writeOk.ToString() : "WriteError"); } catch { } } } } Console.WriteLine("Com Write Queue done"); }).Start(); _thread = new Thread(() => { var tbuf = new byte[2048]; var buf1 = new byte[1]; NativeOverlapped ovo = new System.Threading.NativeOverlapped(); try { while (threadStarted) { SetTimeout(0); //set always wait GWin32.SetLastError(0); ResetOverlapped(ovo); GWin32.ReadFileEx(m_hCommPort, buf1, (uint)buf1.Length, ref ovo, (uint err, uint len, ref NativeOverlapped ovoo) => { if (err != 0) { Console.WriteLine("read got err " + err); } else { SetTimeout(); uint numRead; NativeOverlapped ov = new System.Threading.NativeOverlapped(); ov.EventHandle = GWin32.CreateEvent(IntPtr.Zero, true, false, null); if (!GWin32.ReadFile(m_hCommPort, tbuf, (uint)tbuf.Length, out numRead, ref ov)) { if (GWin32.GetLastError() == 997) //IO Pending { GWin32.WaitForSingleObject(ov.EventHandle, GWin32.INFINITE); } else { Console.WriteLine("read got err " + getWinErr()); } GWin32.GetOverlappedResult(m_hCommPort, ref ov, out numRead, true); } GWin32.CloseHandle(ov.EventHandle); ov.EventHandle = IntPtr.Zero; //Console.WriteLine("got data " + numRead); var buf = new byte[1 + numRead]; buf[0] = buf1[0]; if (numRead > 0) { Array.Copy(tbuf, 0, buf, 1, numRead); app.OnData(buf); } //Console.WriteLine(BitConverter.ToString(buf)); } }); var le = GWin32.GetLastError(); if (le != 0) { _thread = null; Console.WriteLine("Read Error " + le); break; } gwait(); } } catch (InvalidOperationException iv) { _thread = null; threadStarted = false; if (onErr != null) { onErr.OnError("InvalidOperationException " + iv.Message, true); return; } Console.WriteLine("InvalidOperationException " + iv.Message); } Close(); onErr.OnError("thread done", true); Console.WriteLine("thread done"); }); _thread.Start(); }