Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 12.02.2018
Сообщений: 13

Сформировать правильный вызов класса из библиотеки

08.02.2019, 20:31. Показов 2475. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи. Начинаю осваивать C# и столкнулся с одной проблемой:
Есть необходимость в использовании библиотеки для устройств Овен (OwenioNET) и небольшой формы Windows для посылки команд устройству по RS232. Изначально, используя мануал к библиотеке написал небольшую консольную программку и никаких проблем не испытывал - всё работало по плану. Перешёл к созданию нового проекта, используя уже форму и столкнулся с некоторыми проблемами, а именно с созданием объекта.

Вот пример рабочей консольной программы:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using OwenioNet;
using OwenioNet.IO;
using OwenioNet.Log;
using OwenioNet.Exceptions;
using OwenioNet.Types;
using OwenioNet.DataConverter.Converter;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // получаем список доступных портов 
            string[] ports = SerialPort.GetPortNames();
            Console.WriteLine("Выберите порт:");
            // выводим список портов
            for (int i = 0; i < ports.Length; i++)
            {
                Console.WriteLine("[" + (i+1).ToString() + "] " + ports[i].ToString());
            }
            string n = Console.ReadLine();
            int num = int.Parse(n);
 
 
            SerialPortAdapter port = new SerialPortAdapter(num, 115200, Parity.None, 8, StopBits.One);
 
            try
            {
                if (port.IsOpened != true)
                {
                    port.Open();
                    Console.WriteLine("Открываем порт " + num);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
 
            var owenProtocol = OwenProtocolMaster.Create(port);
 
            if (port.IsOpened != true)
            {
                Console.WriteLine("Ошибка открытия порта: {0}", port.ToString());
            }
            else Console.WriteLine("Порт открыт");
 
            byte[] dataFromDevice = new byte[] { 0x00 };
 
            try
            {
                dataFromDevice = owenProtocol.OwenRead(0x265, AddressLengthType.Bits8, "dr.dG");
            }
            catch (Exception)
            {
                Console.WriteLine("Ничего не прочитали. Что-то пошло не так...");
            }
            var converterUI = new ConverterDecDotU();
            var value = converterUI.ConvertBack(dataFromDevice);
            Console.WriteLine("Значение - {0}", value.ToString());
            port.Close();
            Console.WriteLine("Порт закрыт");
            Console.ReadKey();
        }
    }
}

Какой здесь результат, вызовом
C#
1
dataFromDevice = owenProtocol.OwenRead(0x265, AddressLengthType.Bits8, "dr.dG");
если устройство не подключено, по всей видимости, по алгоритму библиотеки делается 3 запроса, и если ответ всё-таки не пришёл, генерируем ошибку, там у меня просто "Что-то пошло не так" ну и т.д..

Вот уже пример с формой. Условно в конструкторе создана кнопка и Сериал порт.:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using OwenioNet;
using OwenioNet.IO;
using OwenioNet.Log;
using OwenioNet.Exceptions;
using OwenioNet.Types;
using OwenioNet.DataConverter.Converter;
 
namespace OwenScales
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
 
        public static int i = 0;
        public static bool actBlock1 = false;
        public static bool actBlock2 = false;
        public static bool actBlock3 = false;
        public static bool actBlock4 = false;
        public static bool actBlock5 = false;
        public IOwenProtocolMaster owenProtocol;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            cBoxComPort.Items.AddRange(ports);
        }
 
        private void btnConnect_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = cBoxComPort.Text;
            serialPort1.BaudRate = Convert.ToInt32(cBoxComSpeed.Text);
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Parity = Parity.Even;
            serialPort1.Open();
            progressBar1.Value = 100;
            try
            {
                owenProtocol = OwenProtocolMaster.Create(serialPort1);
                byte[] dataFromDevice = owenProtocol.OwenRead(20, AddressLengthType.Bits8, "dr.dG");
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
            serialPort1.Close();
            createOwen();
            timer1.Start();
        }
и т.д.


Здесь аналогично при вызове
C#
1
dataFromDevice = owenProtocol.OwenRead(0x265, AddressLengthType.Bits8, "dr.dG");
происходит что-то невообразимое - всего лишь один запрос, после чего прога виснет намертво, без каких-либо ошибок.
Очень надеюсь на вашу помощь.
Описание библиотеки и сама библиотека прилагается
Вложения
Тип файла: pdf opisanie_biblioteki_owenionet.pdf (1.40 Мб, 9 просмотров)
Тип файла: zip owenionet.zip (32.6 Кб, 11 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2019, 20:31
Ответы с готовыми решениями:

Создание dll библиотеки в C#. Вызов классов этой библиотеки
мне нужно как то создать динамическую библиотеку класов в си шарп, основой этой библиотеки должен быть абстрактный класс, от которого будут...

Правильный асинхронный вызов
Здравствуйте. Есть json файл, который нужно асинхронно парсить при вызове первого Activity. Я сделал так, но это вряд ли правильно: ...

Правильный вызов потока
Доброго времени суток. Ребята подскажите! Создал поток. Вроде все должно работать. Но вот когда вызываю его то нечего не происходит (не...

7
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
08.02.2019, 20:52
Цитата Сообщение от 2sandro Посмотреть сообщение
Здесь аналогично при вызове
dataFromDevice = owenProtocol.OwenRead(0x265, AddressLengthType.Bits8, "dr.dG");
происходит что-то невообразимое
но адрес в проекте Windows Forms другой
0
0 / 0 / 0
Регистрация: 12.02.2018
Сообщений: 13
08.02.2019, 21:11  [ТС]
Ellizio, Извиняюсь, можно немного подробнее?
0
5 / 4 / 1
Регистрация: 09.01.2019
Сообщений: 12
08.02.2019, 21:37
Вот так вы читаете данные в консольном приложении:
Code
1
dataFromDevice = owenProtocol.OwenRead(0x265, AddressLengthType.Bits8, "dr.dG");
а вот так в приложении winforms:
Code
1
byte[] dataFromDevice = owenProtocol.OwenRead(20, AddressLengthType.Bits8, "dr.dG");
разницу в адресах (0х265 и 20) видите ? или так надо ?
0
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
08.02.2019, 21:38
2sandro, Вы говорите, что при вызове этого же метода в проекте WinForms приложение зависает. Только вот первый аргумент метода OwenRead() разный для консольного и winforms проектов. В первом случае - это 0x265, во втором - 0х14, если перевести в hex.

Изменился адрес или у Вас опечатка?
0
0 / 0 / 0
Регистрация: 12.02.2018
Сообщений: 13
08.02.2019, 21:47  [ТС]
Ellizio, в данном случае это не имеет значения. К порту ничего не подключено. Библиотека должна попытаться отправить 3 повторных запроса чтения данных, после чего сформирует ошибку. В forms этого не происходит - программа зависает после первого запроса. Если создать отдельно метод static и там прописать консольный вариант, то всё нормально. А вот из функции обработки кнопки не работает как надо. И я бы остановился на рабочем результате, но мне читать данные нужно отдельной функцией, т.е. там где открывается порт мне нужно просто
C#
1
owenProtocol = OwenProtocolMaster.Create(serialPort1);
. А чтение организовать отдельной функцией по событию таймера. Этот вариант forms я упростил для теста.
0
0 / 0 / 0
Регистрация: 12.02.2018
Сообщений: 13
09.02.2019, 22:13  [ТС]
Разобрался, необходимо использовать исключительно SerialPortAdapter, находящийся в библиотеке Овен и никакие другие serialPort.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
09.02.2019, 22:29
2sandro, этого бы никто и не узнал потому что приведенный вами пример не содержит ни объявления ни инициализации serialPort1, На будущее выкладывайте код полностью, от этого очень сильно зависит скорость ответов. Как говорится 99% процентов ответа содержится в самом вопросе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2019, 22:29
Помогаю со студенческими работами здесь

Правильный вызов метода
class Dict{ public List&lt;Word&gt; words; public Dict(){ words = new List&lt;Word&gt;(); } ...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...

Правильный вызов конструкторов родителей с параметрами
Всем привет. Кто подскажет как правильно вызвать конструкторы родителей с параметрами при множественном наследовании? Я делаю так: ...

Какой правильный вызов у функции getline()?
FILE *db; char file = &quot;Quiz.csv&quot;; string str; db = fopen(file, &quot;r&quot;); getline(db, str, &quot;/n&quot;); Quiz.cpp|90|error: no matching...

Вызов функции одной динамической библиотеки из другой динамической библиотеки
Добрый день! Помогите пожалуйста разобраться со следующим вопросом. Возможно ли из одной библиотеки передать параметры для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru