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"); } } }
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); } }
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"); } }
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; })); }
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(); } }