/// <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; }
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; } }
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()); } }
//прием данных по тику таймера обмена 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; }
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; }
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; } }