Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2019, 10:11   #1
Atomnsq
 
Регистрация: 31.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 Кб, 17 просмотров)
Atomnsq вне форума Ответить с цитированием
Старый 15.07.2019, 10:19   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

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

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

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

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

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

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

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

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

Цитата:
Сообщение от 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
 
Регистрация: 31.03.2010
Сообщений: 7
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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