Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > .NET фреймворки > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 15.07.2019, 10:11   #1
Atomnsq
 
Регистрация: 30.03.2010
Сообщений: 7
По умолчанию Сортировка данных получаемые с COM порта

Нужна помощь отцов C#.
Есть устройство (электронные весы) отправляющее в COM порт данные. Все данные выводятся на RichTextBox.
Помимо нужных цифр, вываливается много не нужных значений. Возможно ли как то отсортировать их? Также вопрос, возможно ли изменить интервал получения данных(слишком уж быстро COM порт отправляет значения). В приложение прикрепил проект в zip архиве и скрин с образцом данных получаемые COM портом(красным подчеркнут нужный сектор).

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Timers;
using System.IO;
 
namespace WindowsFormsApp10
{
    public partial class Form1 : Form
    {
        public string data { get; set; }
        public Form1()
        {
            InitializeComponent();
            configrations();
        }
 
        public void configrations()
        {
            portConfig.Items.AddRange(SerialPort.GetPortNames());
            baudrateConfig.DataSource = new[] { "115200", "19200", "230400", "57600", "38400", "9600", "4800" };
            parityConfig.DataSource = new[] { "None", "Odd", "Even", "Mark", "Space" };
            databitsConfig.DataSource = new[] { "5", "6", "7", "8" };
            stopbitsConfig.DataSource = new[] { "1", "2", "1.5" };
            flowcontrolConfig.DataSource = new[] { "None", "RTS", "RTS/X", "Xon/Xoff" };
            baudrateConfig.SelectedIndex = 5;//5
            parityConfig.SelectedIndex = 0;
            databitsConfig.SelectedIndex = 3;//3
            stopbitsConfig.SelectedIndex = 0;
            flowcontrolConfig.SelectedIndex = 0;
 
            
            mySerial.DataReceived += rx_data_event;
 
            backgroundWorker1.DoWork += new DoWorkEventHandler(update_rxtextarea_event);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            /*Подключиться к порту*/
            if (!mySerial.IsOpen)
            {
                if (Serial_port_config())
                {
                    try
                    {
                        mySerial.Open();
                    }
                    catch
                    {
                        alert("Не могу открыть " + mySerial.PortName + " порт, он используется");
                        return;
                    }                   
 
                    UserControl_state(true);
                }
            }
 
            /*Отключиться от порта*/
            else if (mySerial.IsOpen)
            {
                try
                {
                    mySerial.Close();
                    mySerial.DiscardInBuffer();
                    mySerial.DiscardOutBuffer();
                }
                catch {/*игнор*/}                
 
                UserControl_state(false);
            }
        }       
 
        private void alert(string text)
        {
            alert_messege.Icon = Icon;
            alert_messege.Visible = true;
            alert_messege.ShowBalloonTip(5, "Ошибка:", text, ToolTipIcon.Error);
        }
 
        private void UserControl_state(bool value)
        {
            serial_options_group.Enabled = !value;
 
            if (value)
            {
                connect.Text = "Отключиться ";
            }
            else
            {
                connect.Text = "Подключиться";
            }
        }
 
        private bool Serial_port_config()
        {
            try { mySerial.PortName = portConfig.Text; }
            catch { alert("Нет доступных портов"); return false; }
            mySerial.BaudRate = (Int32.Parse(baudrateConfig.Text));
            mySerial.StopBits = (StopBits)Enum.Parse(typeof(StopBits), (stopbitsConfig.SelectedIndex + 1).ToString(), true);
            mySerial.Parity = (Parity)Enum.Parse(typeof(Parity), parityConfig.SelectedIndex.ToString(), true);
            mySerial.DataBits = (Int32.Parse(databitsConfig.Text));
            mySerial.Handshake = (Handshake)Enum.Parse(typeof(Handshake), flowcontrolConfig.SelectedIndex.ToString(), true);
            mySerial.ReadTimeout = 2000; // пытался уменьшить скорость отправки сообщений
 
            return true;
        }
 
        private void rx_data_event(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (mySerial.IsOpen)
            {
                try
                {
                    int dataLength = mySerial.BytesToRead;
                    byte[] dataRecevied = new byte[dataLength];
                    int nbytes = mySerial.Read(dataRecevied, 0, dataLength);
                    if (nbytes == 0) return;
 
                    this.BeginInvoke((Action)(() =>
                    {
                        data = System.Text.Encoding.Default.GetString(dataRecevied);
                        if (!backgroundWorker1.IsBusy)
                        {
                            backgroundWorker1.RunWorkerAsync();
                        }
 
                        //data = BitConverter.ToString(dataRecevied);
                    }));
                }
                catch { alert("Не могу открыть форму " + mySerial.PortName + " порт занят!"); }
            }
        }
 
        /* Добавление текста в текстовое поле*/
        private void update_rxtextarea_event(object sender, DoWorkEventArgs e)
        {
            this.BeginInvoke((Action)(() =>
            {
                if (rx_textarea.Lines.Count() > 5000)
                    rx_textarea.ResetText();
                rx_textarea.AppendText("[RX]> " + data);
            }));
        }
    }    
}
Изображения
Тип файла: jpg выделеный сектор.jpg (54.3 Кб, 136 просмотров)
Вложения
Тип файла: zip WindowsFormsApp10.zip (213.2 Кб, 13 просмотров)
Atomnsq вне форума Ответить с цитированием
Старый 15.07.2019, 10:19   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,714
По умолчанию

Если честно, не совсем понял.
Начинать надо с документации на весы
Black Fregat вне форума Ответить с цитированием
Старый 15.07.2019, 12:02   #3
Atomnsq
 
Регистрация: 30.03.2010
Сообщений: 7
По умолчанию документация по данному типу подключения

Хочу выдернуть только с 5 по 10 байт. На рисунке выделено красным.
Мне хотелось бы узнать, возможно ли это теоретически? Может я пытаюсь сделать, то что не реализовать.

Устройство может работать также через modbus. Там есть адрес регистра, но прикрутить по нормальному не получилось(данные я не получаю).
Изображения
Тип файла: jpg описание весов.jpg (68.9 Кб, 130 просмотров)
Atomnsq вне форума Ответить с цитированием
Старый 15.07.2019, 12:45   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

А в чем проблема из массива в 18 байт взять 6?
p51x вне форума Ответить с цитированием
Старый 15.07.2019, 12:55   #5
Atomnsq
 
Регистрация: 30.03.2010
Сообщений: 7
По умолчанию

Не знаю как возможно это сделать непосредственно в данной задаче.
Atomnsq вне форума Ответить с цитированием
Старый 15.07.2019, 13:05   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

В какой этой задаче? Эта задача ничем абсолютно не отличается от любой другой. У вас есть массив dataRecevied из 18 байт. Вот и возьмите интересующие.
p51x вне форума Ответить с цитированием
Старый 15.07.2019, 13:22   #7
Atomnsq
 
Регистрация: 30.03.2010
Сообщений: 7
По умолчанию

Если бы мог я бы сюда не писал
Atomnsq вне форума Ответить с цитированием
Старый 15.07.2019, 13:33   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,164
По умолчанию

Обычно массивы проходят уроке на 5.
https://metanit.com/sharp/tutorial/2.4.php
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 15.07.2019, 13:56   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

Цитата:
Сообщение от Atomnsq Посмотреть сообщение
Код:
this.BeginInvoke((Action)(() =>
                    {
                        data = System.Text.Encoding.Default.GetString(dataRecevied);
попробуйте так написать

Код:
data = System.Text.Encoding.Default.GetString(dataRecevied.Skip(4).Take(6).ToArray());
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.07.2019, 14:13   #10
Atomnsq
 
Регистрация: 30.03.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте так написать

Код:
data = System.Text.Encoding.Default.GetString(dataRecevied.Skip(4).Take(6).ToArray());
Задумка интересная, но к сожалению результат тот же. Выгоняет весь массив.
Atomnsq вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Matlab обработать данные получаемые по bluetooth? AndruF Помощь студентам 0 19.09.2016 02:21
Считывание данных с Com-порта avovana Микроконтроллеры, робототехника, схемотехника, 3D принтеры 72 21.09.2014 14:03
Получение данных с USB порта на VBA motorway Microsoft Office Excel 2 31.03.2013 17:18
Приём данных с COM порта Евгений55 Microsoft Office Excel 3 05.01.2013 15:46
Чтение данных с COM порта 232 Dimitr_88 Общие вопросы C/C++ 10 03.09.2010 09:39


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840