/// <summary> /// 回应数据 /// </summary> /// <param name="msg"></param> public void BackMsg(Message msg) { if (msg == null) { return; } lock (this) { try { isbuzy = true; if ((System.DateTime.Now - LastSend).TotalMilliseconds < 6) { System.Threading.Thread.Sleep(6);//如果连续发送需要间隔6毫秒 } if (msg is ITransMsg) { (msg as ITransMsg).TransID = LastReciveTransID; } byte[] data = msg.GetMsgData(); OnIODebug?.Invoke(msg.ToString(), data); backMsg = null; LastSend = System.DateTime.Now; serialPort.Write(data, 0, data.Length); } catch (Exception ex) { throw ex; } finally { isbuzy = false; } } }
/// <summary> /// 发送并等待回应 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="msg"></param> /// <param name="timeout"></param> /// <returns></returns> public T SendAndBackMsg <T>(Message msg, int timeout) where T : Message { lock (this) { try { isbuzy = true; if ((System.DateTime.Now - LastSend).TotalMilliseconds < 6) { System.Threading.Thread.Sleep(6);//如果连续发送需要间隔6毫秒 } if (msg is ITransMsg && !msg.MsgDataPacked) { (msg as ITransMsg).TransID = GetNextTransID(); } byte[] data = msg.GetMsgData(); OnIODebug?.Invoke("发送\r\n" + msg.ToString(), data); backMsg = null; LastSend = System.DateTime.Now; serialPort.Write(data, 0, data.Length); resetEvent.Reset(); if (!resetEvent.WaitOne(timeout)) { throw new Exception("接收数据超时"); } if (!(backMsg is T)) { throw new Exception("回应的数据与预期不一致"); } return(backMsg as T); } catch (Exception ex) { throw ex; } finally { isbuzy = false; } } }