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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 15.07.2019, 11:11   #1
Atomnsq
 
Регистрация: 31.03.2010
Сообщений: 7
Репутация: 10
По умолчанию Сортировка данных получаемые с 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
Просмотров: 65
Размер:	54.3 Кб
ID:	97218  
Вложения
Тип файла: zip WindowsFormsApp10.zip (213.2 Кб, 10 просмотров)
Atomnsq вне форума   Ответить с цитированием
Старый 15.07.2019, 11:19   #2
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,466
Репутация: 1021
По умолчанию

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

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

Устройство может работать также через modbus. Там есть адрес регистра, но прикрутить по нормальному не получилось(данные я не получаю).
Миниатюры
Нажмите на изображение для увеличения
Название: описание весов.jpg
Просмотров: 62
Размер:	68.9 Кб
ID:	97219  
Atomnsq вне форума   Ответить с цитированием
Старый 15.07.2019, 13:45   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,679
Репутация: 2631
По умолчанию

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

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

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Matlab обработать данные получаемые по bluetooth? AndruF Помощь студентам 0 19.09.2016 03: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


20:58.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.