/*-----------------------------------------连接部分函数---------------------------------------*/ //连接服务器 public bool NetConnect(string ip, int port) { if (!isConnected) //若当前还未连接, 则进行连接 { try { client = new TcpClientWithTimeout(ip, port, 3000).Connect(); //带超时检测的连接 //client = new TcpClient(ip, port); networkStream = client.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); isConnected = true; //标志已连接上服务器 //写入网络连接记录到日志文件中 worklog.LogQueue_Enqueue(LogCommand.getNetRecord(NetRecordType.TcpConnect, "1")); Console.WriteLine("连接成功"); return(true); } catch (Exception ex) { //写入网络连接记录到日志文件中 worklog.LogQueue_Enqueue(LogCommand.getNetRecord(NetRecordType.TcpConnect, "2")); Console.WriteLine("LinkThread:" + ex.Message); log.Info(AppUtil.getExceptionInfo(ex)); isConnected = false; } } Thread.Sleep(10); return(false); }
/*********************************************************************************************/ #endregion #region 发送部分函数 /*-----------------------------------------发送部分函数---------------------------------------*/ //从发送队列中取出消息, 然后发送 private void SerialSend() { SerialSendMsg sendMsg; int SendQueueItemCount = 0; while (true) { SendQueueWaitHandle.WaitOne(); SendQueueItemCount = serialSendQueue.Count; //提取队列中消息的个数 if (serialPortIsOpen && (SendQueueItemCount > 0)) //若串口已打开, 且队列中有数据 { for (int i = 0; i < SendQueueItemCount; i++) { lock (serialSendQueue) { sendMsg = serialSendQueue.Dequeue(); } //从发送队列中取出消息 bool isSendSuccess = false; //发送出去 try { for (int n = 0; n < sendMsg.PackNumPerCmd; n++) { if (sendMsg.PacketData.Cmd == 0xFE) // 先提取修改信道命令 { comDevice.Write(sendMsg.PacketData.DataFiled, 0, 6); } else // 直接发送的命令 { comDevice.Write(sendMsg.PacketData.DataBytes, 0, sendMsg.PacketDataLength); //发送数据 } #if DEBUG //将发送消息投入调试发送队列中 if (SerialComDebug.isPauseDebug == false) //若当前不是暂停状态 { sendMsg.SendTime = DateTime.Now; //记录时间 this.DebugQueue_Enqueue(sendMsg); } #endif //写入串口发送记录到日志文件中 worklog.LogQueue_Enqueue(LogCommand.getSerialRecord(SerialRecordType.SerialSend, sendMsg)); Thread.Sleep(55); //底层串口每2个包发送的间隔不能小于50ms } isSendSuccess = true; } catch (Exception ex) { isSendSuccess = false; serialPortIsOpen = false; //串口未开启 Console.WriteLine(ex.Message); log.Info(AppUtil.getExceptionInfo(ex)); //写入串口断开记录到日志文件中 worklog.LogQueue_Enqueue(LogCommand.getSerialRecord(SerialRecordType.Disconnect, null)); } if (isSendSuccess) //若发送成功 { if (sendMsg.IsWaitAck) //若需要重发, 则记录本次发送时间, 并投入重发字典中 { sendMsg.SendTime = DateTime.Now; //记录时间 if (sendMsg.SendNumMax > 0) //将发送次数减1 { sendMsg.SendNumMax--; } sendMsg.PacketData.generateSendUType(); lock (resendDic) { try { resendDic.Add(sendMsg.PacketData.SendUType, sendMsg); //存入重发字典中 } catch (Exception ex) { Console.WriteLine(ex.Message); log.Info(AppUtil.getExceptionInfo(ex)); } } } } } } } }