示例#1
0
文件: Udp.cs 项目: PeterSev/7637-WS4
        /// <summary>
        /// Конструктор класса UDP
        /// </summary>
        /// <param name="servicePort">локальный служебный порт (ПИ)</param>
        /// <param name="debugPort">локальный отладочный порт (ПИ)</param>
        /// <param name="portSendTo">удаленный служебный порт (ПУС)</param>
        public Udp(int servicePort, int debugPort, int portSendTo)
        {
            //--УДАЛИТЬ нужно! Это временная отладка для другого проекта!
            //servicePort = 0; portSendTo = 40100;
            //strIPAddr = "192.168.0.100";
            //-------------------------------------------


            socketService          = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socketDebug            = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _addr                  = IPAddress.Parse(strIPAddr);
            _servicePort           = servicePort;
            _debugPort             = debugPort;
            _portSendTo            = portSendTo;
            state_rx               = STATE_RX.DESCR;
            command_in_servicePort = new UDPCommand();
            command_in_debugPort   = new UDPCommand();
            remotePoint            = new IPEndPoint(_addr, _portSendTo);
            bIsClosed              = false;
            listenTaskDebugPort    = new Task(ListenDebugPort);  //Запускаем прослушивание портов в отдельных потоках
            listenTaskDebugPort.Start();

            listenTaskServicePort = new Task(ListenServicePort);
            listenTaskServicePort.Start();

            token = cancelTokenSource.Token;
        }
示例#2
0
        public void SendCommand(Command command_out)
        {
            try
            {
                if (command_out != null)
                {
                    if (udpClient.Available > 1) //вычитываем из порта все если там что-то есть
                    {
                        byte[] tmp = new byte[udpClient.Available];
                        udpClient.Receive(tmp);
                    }

                    int n = udpClient.SendTo(command_out.GetCommandByteBuf(), endPointTo);

                    //command_in = command_out;
                    command_in            = new Command(1000);
                    command_in.index      = command_out.index;
                    command_in.set_or_get = command_out.set_or_get;
                    state_rx = STATE_RX.ADDR;
                    time     = (long)command_in.timeOut;
                    com_timer.Start();
                }
            }
            catch (Exception ex) { throw ex; }
        }
示例#3
0
        public void SendCommand(CmdPar command_out, MainWindow mWindow)
        {
            try
            {
                if (command_out != null)
                {
                    if (!uart.IsOpen)
                    {
                        return;
                    }

                    uart.DiscardInBuffer();
                    uart.DiscardOutBuffer();

                    buf = command_out.GetBufToSend();
                    if (mainWindow.LogFileSave)
                    {
                        mainWindow.frmLog.WriteLine(buf, mainWindow, 0);
                    }
                    uart.Write(buf, 0, buf.Length);
                    showBufferWasSent(buf);

                    //не создавать тут экземпляр command_in, а создавать при приеме сообщения из uart в методе
                    //DataReceived(), т.к. неизвестна длина блока данных
                    //command_in = new Cmd();

                    state_rx = STATE_RX.START;
                    //time = timeout;
                    //timer.Start();
                }

                //if (!uart.IsOpen) uart.Close();
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                Debug.WriteLine("SendCommand() Exception error", ex.ToString());
            }
        }
示例#4
0
        //прием данных по тику таймера обмена 2 мс
        void timer_Tick(object sender, EventArgs e)
        {
            return;//not use data receive/processing on the timer tick since we are using uart.receive event

            if (!active)
            {
                timer.Stop();
                uart.DiscardInBuffer();
                return;
            }
            if (!uart.IsOpen)
            {
                timer.Stop();
                uart.DiscardInBuffer();
                return;
            }
            if (state_rx == STATE_RX.START)
            {
                if (uart.BytesToRead >= 1)
                {
                    command_in.START = (byte)uart.ReadByte();
                    if (command_in.START == 0x5a)
                    {
                        state_rx = STATE_RX.ADDRESS;
                    }
                    else
                    {
                        //неправильный стартовый байт
                        command_in.result = CmdResult.BAD_START_BYTE;
                        timer.Stop();
                        uart.DiscardInBuffer();
                        //вызов метода uart_received(Cmd com_in) в MainWindow через делегат RcvdMsg для отображения информации
                        received(command_in);
                    }
                }
            }
            if (state_rx == STATE_RX.ADDRESS)
            {
                if (uart.BytesToRead >= 1)
                {
                    command_in.ADDRESS = (byte)uart.ReadByte();

                    state_rx = STATE_RX.DATALENGTH;
                }
            }
            if (state_rx == STATE_RX.DATALENGTH)
            {
                if (uart.BytesToRead >= 2)
                {
                    for (int i = 0; i < 2 /*command_in.LENGTH.Length*2*/; i++)
                    {
                        command_in.LENGTH[i] = (byte)uart.ReadByte();
                    }

                    state_rx = STATE_RX.CHKSUM1;
                }
            }
            if (state_rx == STATE_RX.CHKSUM1)
            {
                if (uart.BytesToRead >= 2)
                {
                    byte [] checksum1Arr = new byte[2];
                    checksum1Arr[0] = (byte)uart.ReadByte();
                    checksum1Arr[1] = (byte)uart.ReadByte();

                    command_in.CHECKSUM1 = BitConverter.ToUInt16(checksum1Arr, 0);

                    byte[] b = command_in.GetBufToSend();

                    if (checksum1Arr[0] != b[4] || checksum1Arr[1] != b[5])
                    {
                        command_in.result = CmdResult.BAD_CHKSUM1;
                    }
                    else
                    {
                        state_rx = STATE_RX.DATA;
                    }

                    //timer.Stop();
                    //uart.DiscardInBuffer();
                    //received(command_in);
                }
            }
            if (state_rx == STATE_RX.DATA)
            {
                if (uart.BytesToRead >= command_in.DATA.Length)
                {
                    for (int i = 0; i < 12 /*command_in.DATA.Length*/; i++)//должно быть 10 байт, а не 12 ? длина пакета данных 10 байт для ГСП
                    {
                        command_in.DATA[i] = (byte)uart.ReadByte();
                    }
                    state_rx = STATE_RX.CHKSUM2;
                }
            }
            if (state_rx == STATE_RX.CHKSUM2)
            {
                if (uart.BytesToRead >= 2)
                {
                    byte[] checksum2Arr = new byte[2];
                    checksum2Arr[0] = (byte)uart.ReadByte();
                    checksum2Arr[1] = (byte)uart.ReadByte();

                    command_in.CHECKSUM2 = BitConverter.ToUInt16(checksum2Arr, 0);

                    byte[] b = command_in.GetBufToSend();

                    if (checksum2Arr[0] != b[GSP_PACKET_SIZE - 2] || checksum2Arr[1] != b[GSP_PACKET_SIZE - 1])
                    {
                        command_in.result = CmdResult.BAD_CHKSUM2;
                    }
                    else
                    {
                        command_in.result = CmdResult.SUCCESS;
                    }

                    timer.Stop();
                    uart.DiscardInBuffer();
                    received(command_in);
                }
            }

            if (time <= 0)
            {
                command_in.result = CmdResult.TIMEOUT;
                timer.Stop();
                uart.DiscardInBuffer();
                received(command_in);
            }
            time -= (uint)timer.Period;
            return;
        }
示例#5
0
        void DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte   START   = 0;
            byte   ADDRESS = 0;
            ushort data_length;

            byte[] LENGTH = new byte[2];

            if (uart == null)
            {
                return;
            }

            try
            {
                if (state_rx == STATE_RX.START)
                {
                    if (uart.BytesToRead >= 1)
                    {
                        //command_in.START = (byte)uart.ReadByte();
                        START = (byte)uart.ReadByte();
                        if (START == 0x5a)
                        {
                            state_rx = STATE_RX.ADDRESS;
                        }
                        else
                        {
                            //неправильный стартовый байт
                            command_in        = new Cmd();
                            command_in.result = CmdResult.BAD_START_BYTE;
                            //timer.Stop();
                            uart.DiscardInBuffer();
                            //вызов метода uart_received(Cmd com_in) в MainWindow через делегат RcvdMsg для отображения информации
                            received(command_in);
                        }
                    }
                }
                if (state_rx == STATE_RX.ADDRESS)
                {
                    if (uart.BytesToRead >= 1)
                    {
                        ADDRESS = (byte)uart.ReadByte();
                        //command_in.ADDRESS = (byte)uart.ReadByte();

                        state_rx = STATE_RX.DATALENGTH;
                    }
                }
                if (state_rx == STATE_RX.DATALENGTH)
                {
                    if (uart.BytesToRead >= 2)
                    {
                        for (int i = 0; i < 2; i++)
                        {
                            LENGTH[i] = (byte)uart.ReadByte();
                        }
                        //command_in.LENGTH[i] = (byte)uart.ReadByte();

                        //создание command_in с размером блока данных, полученных в сообщении
                        //*2 так как размер поля данных в сообщении передается в 16-битных словах
                        data_length = BitConverter.ToUInt16(LENGTH, 0);
                        if (data_length * 2 > uart.BytesToRead)
                        {
                            throw new OverflowException();
                        }
                        command_in         = new Cmd(2 * BitConverter.ToUInt16(LENGTH, 0));
                        command_in.START   = START;
                        command_in.ADDRESS = ADDRESS;
                        for (int i = 0; i < 2; i++)
                        {
                            command_in.LENGTH[i] = LENGTH[i];
                        }
                        state_rx = STATE_RX.CHKSUM1;
                    }
                }
                if (state_rx == STATE_RX.CHKSUM1)
                {
                    if (uart.BytesToRead >= 2)
                    {
                        byte[] checksum1Arr = new byte[2];
                        checksum1Arr[0] = (byte)uart.ReadByte();
                        checksum1Arr[1] = (byte)uart.ReadByte();

                        command_in.CHECKSUM1 = BitConverter.ToUInt16(checksum1Arr, 0);

                        byte[] b = command_in.GetBufToSend();

                        if (checksum1Arr[0] != b[4] || checksum1Arr[1] != b[5])
                        {
                            command_in.result = CmdResult.BAD_CHKSUM1;
                        }
                        else
                        {
                            state_rx = STATE_RX.DATA;
                        }

                        //timer.Stop();
                        //uart.DiscardInBuffer();
                        //received(command_in);
                    }
                }
                if (state_rx == STATE_RX.DATA)
                {
                    if (uart.BytesToRead >= command_in.DATA.Length)
                    {
                        for (int i = 0; i < command_in.DATA.Length; i++)//длина пакета вх. данных 12 байт для ГСП, 8 для ЛД...
                        {
                            command_in.DATA[i] = (byte)uart.ReadByte();
                        }
                        state_rx = STATE_RX.CHKSUM2;
                    }
                }
                if (state_rx == STATE_RX.CHKSUM2)//2 байта контр. сумма
                {
                    if (uart.BytesToRead >= 2)
                    {
                        byte[] checksum2Arr = new byte[2];
                        checksum2Arr[0] = (byte)uart.ReadByte();
                        checksum2Arr[1] = (byte)uart.ReadByte();

                        command_in.CHECKSUM2 = BitConverter.ToUInt16(checksum2Arr, 0);

                        byte[] b = command_in.GetBufToSend();

                        if (checksum2Arr[0] != b[GSP_PACKET_SIZE - 2] || checksum2Arr[1] != b[GSP_PACKET_SIZE - 1])
                        {
                            command_in.result = CmdResult.BAD_CHKSUM2;
                        }
                        else
                        {
                            command_in.result = CmdResult.SUCCESS;
                        }

                        //timer.Stop();
                        uart.DiscardInBuffer();
                        buf = command_in.GetBufToSend();
                        if (mainWindow.LogFileSave)
                        {
                            mainWindow.frmLog.WriteLine(buf, mainWindow, 1);
                        }
                        received(command_in);//Возбуждаем событие received и передаем ему данные, прием в MainWindow.uart_received()
                    }
                }
            }
            catch (Exception exc)
            {
                Debug.WriteLine("DataReceived() Exception error", exc.ToString());
                Debug.WriteLine("time: {0}.", DateTime.Now);
            }

            /*if (time <= 0)
             * {
             *  command_in.result = CmdResult.TIMEOUT;
             *  timer.Stop();
             *  uart.DiscardInBuffer();
             *  received(command_in);//Возбуждаем событие received и передаем ему данные, прием в MainWindow.uart_received()
             * }
             * time -= (uint)timer.Period;*/
            return;
        }
示例#6
0
        void com_timer_Tick(object sender, EventArgs e)
        {
            try
            {
                if (!active || !udpClient.Connected)
                {
                    com_timer.Stop();
                    rx_queue.Clear();
                    return;
                }

                if (udpClient.Available > 1)
                {
                    byte[] tmp = new byte[udpClient.Available];
                    udpClient.Receive(tmp);
                    foreach (byte b in tmp)
                    {
                        rx_queue.Enqueue(b);
                    }
                }

                if (state_rx == STATE_RX.ADDR) //считываем адрес
                {
                    byte[] tmp = new byte[2];
                    if (rx_queue.Count >= tmp.Length)
                    {
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            tmp[i] = rx_queue.Dequeue();
                        }
                        command_in.address = (ushort)((tmp[1] << 8) + (tmp[0]));
                        state_rx           = STATE_RX.CNT;
                    }
                }

                if (state_rx == STATE_RX.CNT) //считываем размер полученных данных
                {
                    byte[] tmp = new byte[2];
                    if (rx_queue.Count >= tmp.Length)
                    {
                        for (int i = 0; i < tmp.Length; i++)
                        {
                            tmp[i] = rx_queue.Dequeue();
                        }
                        command_in.count = (ushort)((tmp[1] << 8) + (tmp[0]));
                        state_rx         = STATE_RX.DATA;
                    }
                }

                if (state_rx == STATE_RX.DATA)              //считываем сами данные
                {
                    if (rx_queue.Count >= command_in.count) //принимаем данные согласно протоколу в размере command_in.count
                    {
                        command_in.SetDataNewSize(command_in.count);
                        for (int i = 0; i < command_in.count; i++)
                        {
                            command_in.data[i] = rx_queue.Dequeue();
                        }
                        command_in.result = CommandResult.Success;

                        com_timer.Stop();
                        rx_queue.Clear();

                        //вычитываем в никуда данные из буфера если там есть что-то
                        if (udpClient.Available > 0)
                        {
                            byte[] tmp = new byte[udpClient.Available];
                            udpClient.Receive(tmp);
                        }
                        received(command_in);
                    }
                    else //рукожопный костыль, созданный для приема команды НЕ по протоколу в количестве 14 байт данных (спасибо Захаренко, создавшему эту команду)
                    {
                        command_in.SetDataNewSize((ushort)rx_queue.Count);
                        int tmpCnt = rx_queue.Count;
                        for (int i = 0; i < tmpCnt; i++)
                        {
                            command_in.data[i] = rx_queue.Dequeue();
                        }
                        command_in.result = CommandResult.Success;

                        com_timer.Stop();
                        rx_queue.Clear();

                        //вычитываем в никуда данные из буфера если там есть что-то
                        if (udpClient.Available > 0)
                        {
                            byte[] tmp = new byte[udpClient.Available];
                            udpClient.Receive(tmp);
                        }
                        received(command_in);
                    }
                }

                if (time <= 0)
                {
                    command_in.result = CommandResult.Timeout;
                    com_timer.Stop();
                    rx_queue.Clear();
                    received(command_in);
                }
                time -= (uint)com_timer.Period;
                return;
            }
            catch (Exception ex) { throw ex; }
        }