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

Информация с COM-порта

08.04.2014, 22:00. Показов 2078. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация заключается в следующем. Есть консольное приложение, которой через COM-порт отсылает данный на устройство. После этого, устройство отсылает ответную строку, и консольное приложение считывает данные.

Так вот, в чем вопрос. Устройство отсылает сообщение, в котором содержатся знаки не принадлежащие таблице ASCII. Например:
Ї ґ Ќ
Консоль вместо этих символов выводит вопросительные знаки. Так вот, как сделать так, чтобы в консольке выводились данные символы?

Использую serialPort.ReadLine() ..
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2014, 22:00
Ответы с готовыми решениями:

Теряется информация с com порта
Доброе время суток. Arduino посылает данные на com порт с частотой 1 раз в секунду, программа на C# считывает эти данные и выводит в...

Информация с COM порта принимается, нужно передать в массив сортировать и сделать уникальными строки
Добрый день. Осуществляю приём информации с устройства на виртуальный COM-порт. string InputData = null; delegate void...

Чтение из COM порта, При чтении из порта зависает read()
Каждому рано или поздно приходится программировать com порт. Вот и мой черед пришол. Я ужу умею: Откривать,закривать, писать. а читать не...

11
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.04.2014, 22:09
...использовать автозамену неотображаемых (непечатаемых) символов, так делает большинство терминалов. Или просто выводить их в HEX (аски-код символа).
0
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 8
08.04.2014, 22:16  [ТС]
получается, я делал так
C#
1
str=serialPort.ReadLine();
Потом, по алгоритму с МСДНа я переводил в HEX.. При выводе строки с HEX последовательностью, там было видно что все равно вопросительные знаки вместо символов..

Можете помочь кодом пожалуйста, кто знает..
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.04.2014, 22:18
При выводе строки с HEX последовательностью, там было видно что все равно вопросительные знаки вместо символов..
чушь. Значит неверен сам перевод в HEX.
0
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 8
08.04.2014, 23:40  [ТС]
Вот что у меня получается..
при выводе строки пришедшей с порта, выводится текст:
??GZ5\?ZMG?050?0?.P06?
а должен выводиться:
МGZ5_2ZMG405020b.P06
Я пробовал вывести так:
C#
1
2
3
var sb = new StringBuilder();
foreach (var bt in Encoding.Default.GetBytes(_serialPort.ReadLine()))
sb.AppendFormat("{0:X}", bt);
Но он все равно выводит коды вопросиков, вместо кодов непонятных символов..
0
2 / 2 / 2
Регистрация: 12.10.2011
Сообщений: 44
09.04.2014, 00:45
Насчет ReadLine - он, кажется, string выдает ответ, а string использует unicode кодировку. Скорей всего, в этом и проблема. Не ругайтесь, если что-то неправильно сказал.
А наоборот не пробовал: сначала получать ответ в байтах, а затем конвертировать в строку через Encoding.GetString?
Ну вот, например, получил ты с устройства ответ в байтах, записал в массив, а затем разбираешь его.
Массив х - байты, 2 - с какого места читать, 20 - сколько символов, ну там разные перегрузки есть
Firmware = Encoding.ASCII.GetString(x, 2, 20);
0
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 8
09.04.2014, 20:13  [ТС]
Все решилось строчкой
C#
1
_serialPort.Encoding = Encoding.GetEncoding(1251);
Добавлено через 5 часов 26 минут
Появилась новая проблемка. От устройства подключенному к COMпорту должны прийти данные большого объема, а буфер COMпорта ограничен 4КБайтами. Эти данные считываются, а как считать остальное?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.04.2014, 20:39
Буфер не приходит мгновенно, считывайте частями и накапливайте.
0
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 8
09.04.2014, 21:21  [ТС]
Там получается устройство шлет сразу, без остановки всю инфу, если я сделаю у себя в программе цикл, в котором буду считывать, и очищать буфер, получится снять всю инфу без потерь ?

и если да, то какое лучше условие поставить в while ?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.04.2014, 22:13
...какой цикл? У вас есть поток прихода данных, заводите буфер, скажем массив заданной длины на 8 килобайт, по приходу куска данных считываете столько сколько пришло, запоминаете сколько пришло и заносите в массив считанные данные, начиная с нулевой позиции, по приходу следующего куска продолжаете наполнение массива с позиции предыдущей.

Вариант два - динамический массив.
0
0 / 0 / 0
Регистрация: 08.04.2014
Сообщений: 8
09.04.2014, 23:43  [ТС]
Вот мой код, помогите пожалуйста исправить, чтобы шел прием полного объема инфы, а не только того, что попало в буфер порта..

C#
1
2
3
4
5
6
7
8
9
10
_serialPort.Open();
                _serialPort.WriteLine(message);
                Thread.Sleep(_serialPort.ReadTimeout);
                int byteRec = _serialPort.BytesToRead;
                byte[] messB = new byte[byteRec];
                _serialPort.Read(messB, 0, byteRec);
                _serialPort.DiscardInBuffer;
                Encoding e1=Encoding.Default;
                File.AppendAllText(fileName, e1.GetString(messB));
                _serialPort.Close();
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
10.04.2014, 00:02
Тут нет потока, мало того, вы даже не удосужились просмотреть свойства данной обертки serialPort, у которой есть событие приема данных. Среди прочего использовано такое уродство как слип, которое может привести к потере данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2014, 00:02
Помогаю со студенческими работами здесь

Написать программу- вводная информация в файле in.txt, выходная информация в out.txt
Написать программу- вводная информация в файле in.txt, выходная информация в out.txt. Срочнооо..

Удаление com порта
На ноуте ХР. К ноуту к com порту подключается проетор. Что можно сотворить программно, чтобы com порт не работал? И проектор не работал...

Название COM-порта
Определяю COM-порты. Получаю COM1, COM2, ... Как получить название устройства, подключенного к какому-либо COM-порту, такое как в...

Чтение COM - порта
Здравствуйте. Опишу для начала свой проект. У меня есть устройство АКИП. Я пишу программу для дистанционной работы с ним. Все хорошо,...

БД Порта на Lotus
Задачка мягко сказать тривиальная. Надо разместить все документы по одному судозаходу в один документ. Может у кого-то есть опыт в этой...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru