Пример #1
0
        private void OpenPort_button_Click(object sender, EventArgs e)
        {
            if (!_serialPort.IsOpen)
            {
                // Если порт закрыт, прописываем в него параметры с формы и открываем.
                //int[] BaudRate = { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 };
                int[]      port_databits = { 5, 6, 7, 8 };
                Parity[]   port_parity   = { Parity.Even, Parity.Mark, Parity.None, Parity.Odd, Parity.Space };
                StopBits[] port_stopbits = { StopBits.None, StopBits.One, StopBits.OnePointFive, StopBits.Two };
                _serialPort.PortName = Port_comboBox.Text;
                //_serialPort.BaudRate = BaudRate[BaudRate_comboBox.SelectedIndex];
                _serialPort.Parity   = port_parity[Parity_comboBox.SelectedIndex];
                _serialPort.StopBits = port_stopbits[StopBits_comboBox.SelectedIndex];
                _serialPort.DataBits = port_databits[DataBits_comboBox.SelectedIndex];
                _serialPort.BaudRate = Int32.Parse(BaudRate_comboBox.Text);

                //Открываем порт
                _serialPort.Open();
                //Если порт благополучно открывается делаем кнопку открытия недоступной,
                //а кнопку закрытия напротив доступной, а в консоль выводим сообщение
                //с датой и временем открытия порта
                if (_serialPort.IsOpen)
                {
                    OpenPort_button.Enabled  = false;
                    ClosePort_button.Enabled = true;
                    Console_textBox.AppendText("Port opened at " + DateTime.Now + "\r\n");
                }
            }
        }
Пример #2
0
        private void Send_button_Click(object sender, EventArgs e)
        {
            /**
             * Собираем строку запроса
             * Поле DataSet состоит из двух указателей. Первый имеет следующую структуру:
             * HT Ссылочный номер канала HT Ссылочный номер параметра FF
             * Временной срез определяется вторым указателем. Его структура такова:
             * HT День HT Месяц HT Год HT Час HT Минуты HT Секунды FF
             * Формат запроса = пробел - HT (09h), ! - FF (0Ch)
             *  HT_Channel_HT_Parameter_FFHT_Day_HT_Mounth_HT_Year_HT_Hour_HT_Minutes_HT_Seconds_FF
             *  где Channel -канал, Parameter - параметр, Day - день, Mounth - месяц, Year - год, Hour - часы, Minutes - минуты, Seconds - секунды
             **/

            //Инициализируем переменные адресов данные из полей на форме,
            //К адресу SAD побитово добавляем 128, или 80h
            //А поле FNC переводим из шестнадцатеричной системы в десятичную
            byte[] Head = work_msg.MakeHead((byte)DAD_numericUpDown.Value, (byte)SAD_numericUpDown.Value, byte.Parse(FNC_comboBox.Text, System.Globalization.NumberStyles.HexNumber), "");
            byte   SAD  = (byte)((byte)SAD_numericUpDown.Value | 0x80);
            byte   DAD  = (byte)DAD_numericUpDown.Value;
            byte   FNC  = byte.Parse(FNC_comboBox.Text, System.Globalization.NumberStyles.HexNumber);

            //Инициализируем строку сообщения из соответствующего текстового поля на форме
            //и заменяем в ней пробелы на \t (09h), а знаки ! на \f (0Ch)
            string SendMsg = Send_textBox.Text.Replace(" ", "\t").Replace("!", "\f");

            //Вызываем метод CreateMessage для создания цельного сообщения из кусочков
            //и записываем его в байтовый массив msg
            byte[] msg = bus.CreateMessage(DAD, SAD, FNC, SendMsg);

            //Вызываем методы очищения стека и  добавляем туда сообщение
            bus.StackClear();
            bus.AddToStack(msg);
            //Если выбран режим отображения в шестнадцатеричном виде то выводим содержимое стека в виде
            //шестнадцатеричных чисел, иначе в текстовом виде
            if (HEX_radioButton.Checked)
            {
                Console_textBox.AppendText(bus.StackToHEX() + "\r\r\n");
            }
            else if (Text_radioButton.Checked)
            {
                Console_textBox.AppendText(bus.StackToString() + "\r\r\n");
            }
            //Вызываем метод очищения стека
            bus.StackClear();
            //Если COM-порт открыт, то пишем содержимое массива msg в порт,
            //если порт не доступен, выводим сообщение об ошибке
            if (_serialPort.IsOpen)
            {
                _serialPort.Write(msg, 0, msg.Length);
            }
            else
            {
                MessageBox.Show("Порт не открыт", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Пример #3
0
 private void ClosePort_button_Click(object sender, EventArgs e)
 {
     //Если CJOM-порт открыт то закрываем его и выводим в консоль сообщение об этом,
     //а кнопку закрытия делаем неактивной, а открытия активной
     if (_serialPort.IsOpen)
     {
         _serialPort.Close();
         ClosePort_button.Enabled = false;
         OpenPort_button.Enabled  = true;
         Console_textBox.AppendText("Port closed at " + DateTime.Now + "\r\n");
     }
 }
Пример #4
0
        private void Lol()
        {
            Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText("Опрос Начат" + "\r\n"); }));
            Thread.Sleep(2000);
            for (int i = 8; i < 12; i++)
            {
                work_msg.SetSendFlag();
                if (work_msg.isSendFlag())
                {
                    Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText("Запрос данных..." + "\r\n"); }));

                    byte   SAD     = (byte)((byte)SAD_numericUpDown.Value | 0x80);
                    byte   DAD     = (byte)DAD_numericUpDown.Value;
                    byte   FNC     = 0x18;
                    string SendMsg = "\t0\t65530\f\t5\t2\t20\t" + i + "\t0\t0\f";
                    byte[] msg     = bus.CreateMessage(DAD, SAD, FNC, SendMsg);
                    bus.StackClear();
                    bus.AddToStack(msg);
                    if (HEX_radioButton.Checked)
                    {
                        Console_textBox.Invoke(new Action(() => {
                            Console_textBox.AppendText(bus.StackToHEX() + "\r\r\n");
                        }));
                    }
                    else if (Text_radioButton.Checked)
                    {
                        Console_textBox.AppendText(bus.StackToString() + "\r\r\n");
                    }
                    bus.StackClear();
                    if (_serialPort.IsOpen)
                    {
                        _serialPort.Write(msg, 0, msg.Length);
                    }
                    else
                    {
                        Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText("Ошибка: порт не открыт!"); }));
                        break;
                        //MessageBox.Show("Порт не открыт", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                while (work_msg.isSendFlag())
                {
                    Thread.Sleep(1000);
                }
            }
            Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText("Опрос завершён" + "\r\n"); }));
            auto_button.Invoke(new Action(() => { auto_button.Enabled = true; }));
        }
Пример #5
0
        private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int ByteToRead = _serialPort.BytesToRead;

            byte[] buff = new byte[ByteToRead];

            _serialPort.Read(buff, 0, ByteToRead);

            Array.Copy(buff, 0, ByteBuffer, buffseek, ByteToRead);
            buffseek += ByteToRead;

            // Проверяем наличие начала, конца сообщения и его контрольных чисел
            // если успешно, то выполняем вложенный код
            if (work_msg.isFullMessage(ByteBuffer, buffseek))
            {
                // Находим индексы вхождения кодов soh, isi, stx и etx в буфере приёма
                int soh = work_msg.GetSOH(ByteBuffer);
                //int isi = work_msg.GetISI(ByteBuffer);
                int stx = work_msg.GetSTX(ByteBuffer);
                int etx = work_msg.GetETX(ByteBuffer);

                // Объявляем массив для целого сообщения и переносим в него сообщение из буфера приёма
                byte[] finalbuff = new byte[etx + 4];
                Array.Copy(ByteBuffer, soh, finalbuff, 0, etx + 4);

                // Объявляем и заполняем массивы заголовка, тела и контрольного числа
                byte[] Head = work_msg.GetHead(finalbuff, soh, stx);
                byte[] Body = work_msg.GetBody(finalbuff, stx, etx - stx + 2);
                byte[] CRC  = work_msg.GetBody(finalbuff, etx + 2, 2);

                string result = "";
                for (int i = 0; i < finalbuff.Length; i++)
                {
                    result += finalbuff[i].ToString("X2") + " ";
                }
                Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText("Message Received: => {" + result + " }"); }));

                // Меняем местами значения в массиве CRC и сравниваем его с подсчитанным функцией CrCode2 контрольным числом
                // Если коды верны, то выполняем вложенный код
                Array.Reverse(CRC);
                if (BitConverter.ToInt16(CRC, 0) == bus.CrCode2(finalbuff))
                {
                    Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText(" CRC: OK" + "\r\n"); }));
                }
                else
                {
                    Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText(" CRC: FAILED" + "\r\n"); }));
                }

                string[] result_str = work_msg.GetStrings(Body);
                for (int i = 0; i < result_str.Length; i++)
                {
                    Console_textBox.Invoke(new Action(() => { Console_textBox.AppendText(result_str[i] + "\r\n"); }));
                }
                //MessageBox.Show(bodyStr);

                Array.Clear(ByteBuffer, 0, ByteBuffer.Length);
                buffseek = 0;
                work_msg.DropSendFlag();
            }
        }