Exemplo n.º 1
0
        /*-----------------------------------------连接部分函数---------------------------------------*/
        //连接服务器
        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);
        }
Exemplo n.º 2
0
        /*********************************************************************************************/
        #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)); }
                                }
                            }
                        }
                    }
                }
            }
        }