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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2013, 14:49   #1
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию Windows Form, Virtual port

Всем доброго времени суток.
Имеется задачка: к ПК подключается устройство по USB, сказали что комп будет видеть это устройство как Virtual Port.
Мне это честно говоря ни о чем не говорит, поэтому подскажите пожалуйста где и что почитать или может есть какие то готовые решения: нужно будет отправлять команды на это устройство, а так же получать некоторые данные (в режиме реального времени постоянно будут идти какие-то данные), которые потом я уже буду отображать на форме.

Заранее спасибо.
AnDrOiD73 вне форума Ответить с цитированием
Старый 22.10.2013, 16:55   #2
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Виртуальный порт, это значит что можно будет обращаться к нему как com порту. В C# есть чудесный класс SerialPort (http://ivanp.ru/работа-с-com-портами-в-net-c/). Не arduino случаем?
bondik вне форума Ответить с цитированием
Старый 23.10.2013, 11:48   #3
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию

А я смогу получать только байты/массив байтов?
ну т.е. данных типа string там не будет?

Точно не знаю, но скорее нет чем да. Скорее всего собственная разработка.
AnDrOiD73 вне форума Ответить с цитированием
Старый 23.10.2013, 11:53   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

string это тоже байты
eval вне форума Ответить с цитированием
Старый 25.10.2013, 17:49   #5
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию

а, все верно, именно SerialPort мне и нужен.

Подразумевается что данные будут приходить в формате:
данные_1;данные2;...;данные_N;призн ак_конца_строки
данные_1;данные2;...;данные_N;призн ак_конца_строки
...
данные_1;данные2;...;данные_N;призн ак_конца_строки

Так же подразумевается что поток данных идет постоянно (устройство в текущий момент что-то обнаружило и тут же отправляет эти данные), хотя в какой то момент данные могут и закончиться.
Я хотел каждую строку записывать в переменную типа List<My_List> (ну через List.Add) предварительно отпарсив ее. Затем тут же на основании старых данных и только что поступивших я формирую отображение данных в DataGridView.

Так вот вопрос чтобы все это делать правильно мой код должен быть типа такого:
Код:
SerialPort _serialPort = new SerialPort();
_serialPort.PortName = "COM3";
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Open();

string s1 = SerialPortWorker();
AddInList(s1);

        string SerialPortWorker()
        {
            string message = "";
            while (true)
            {                
                try
                {
                   message = _serialPort.ReadLine();
                }
                catch (TimeoutException)
                {                                        
                    break;
                }
            }
            return message;            
        }

        void AddInList(string s)
        {
            //парсим s
            //Добавляем данные в List<My_List>
        }
Если это верно, то я ведь добавлю фактически только первую строчку в List и все, а мне нужно после чтения каждой строки добавлять ее в List, а затем из этого списка формировать другой и отображать в DataGridView.

Короче что-то я запутался %)
AnDrOiD73 вне форума Ответить с цитированием
Старый 25.10.2013, 18:04   #6
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию

т.е. напрашивается бесконечный цикл в котором:
Код:
string s1 = SerialPortWorker();
AddInList(s1);
Еще_одна_процедура_для_формирования_другого_списка_и_отображения_в_DataGridView()
Если так, то условием прерывания цикла должно быть нажатие на кнопку "Закрыть_порт" в которой происходит _serialPort.Close();
А на кнопку мы не сможем нажать потому что у нас бесконечный цикл. Значит нужно выполнять этот цикл в отдельном Thread? А цикл прервать когда значение какой нибудь переменной типа bool станет false (а такой мы ее можем сделать при нажатии на кнопку "Закрыть_порт").

Верно рассуждаю или бред? ))
AnDrOiD73 вне форума Ответить с цитированием
Старый 26.10.2013, 08:11   #7
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Бесконечный цикл в отдельном потоке (в винформс приложение) - верно мыслите. Переменная выключающая поток - тоже верно мыслите.

Еще бы почитать пару примеров про многопоточность - и все велосипеды отпадуть сами )
simples вне форума Ответить с цитированием
Старый 19.11.2013, 13:15   #8
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Прошу прощенья, что в старой теме...
Лучше всего использовать событие ( в данном случае:SerialPort.DataReceived) и в этом событие рождать поток, в котором что-либо делать с принятыми данными.
bondik вне форума Ответить с цитированием
Старый 17.12.2013, 12:13   #9
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию

Помогите пожалуйста разобраться что не так делаю.
Есть программа Terminal (https://sites.google.com/site/terminalbpp/). Подключаюсь в ней к устройству, ввожу "H:", ставлю галочку напротив "+CR", нажимаю "send" и устройство приняв эту команду отправляет нужный мне ответ.
Собственно это же мне надо получить в моей программе WindowsForms.
Пишу код:
Код:
            SerialPort port = new SerialPort();
            port.PortName = "COM16";
            port.BaudRate = 115200;
            port.Parity = Parity.None;
            port.DataBits = 8;
            port.StopBits = StopBits.One;
            port.ReadTimeout = 1000;
            port.WriteTimeout = 500;
            port.Open();
            string getTextConnect = "H:\r";
            ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
            byte[] b1 = ascii.GetBytes(getTextConnect);
            port.Write(b1, 0, b1.Length);
            string s1 = port.ReadExisting();
            MessageBox.Show(s1 + " " + s1.Length);
            port.Close();
MessageBox отображается пустым (длина s1 = 0), т.е. устройство не получило нужную команду и соответственно не ответило.
Может символ возврата каретки как то по другому нужно тут отправлять?

Интересный нюанс: если в программе Terminal не ставить галочку "+CR", а в строке ввода написать "H:\r", то ответ тоже не приходит. Наталкивает на мысль что символ возврата каретки какой то другой %)

Кто что знает подскажите пожалуйста.
p.s.: про DataReceived в курсе. там все аналогично получается.

Последний раз редактировалось AnDrOiD73; 17.12.2013 в 12:17.
AnDrOiD73 вне форума Ответить с цитированием
Старый 17.12.2013, 12:57   #10
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

ReadExisting - Reads all immediately available bytes, based on the encoding, in both the stream and the input buffer of the SerialPort object.

то бишь оно НЕ ждет ответа от устройства - а только показывает Вам что УЖЕ есть в приемном буфере (попробуйте паузу постваить в неск.секунд для проверки).
simples вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows Virtual PC genrix Windows 6 25.02.2013 00:13
iCore Virtual Accounts. Забудь про переустановку Windows. Alepro Софт 15 08.02.2011 07:22
virtual COM, Ethrnet and COM port Baron9186 Работа с сетью в Delphi 2 01.11.2010 10:37
Можно ли подключить к web form windows form? Manonia Windows Forms 0 20.10.2010 05:28
Windows form в C++ xnise Помощь студентам 1 15.09.2010 16:31