0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
1
.NET 2.x

serial port

19.10.2011, 16:42. Показов 5296. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

Использую стандартные классы .net для работы с ком портом.
Работу с портом прослушал программой Portmon. Вот кусочек прослушки:
22 12:52:53 ConsoleApplicat IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
23 12:52:53 ConsoleApplicat IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
24 12:52:53 ConsoleApplicat IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:8 Replace:80 XonLimit:1024 XoffLimit:1024

Возник вопрос как изменить в .net значения у IOCTL_SERIAL_SET_CHAR.
Хочу изменить так IOCTL_SERIAL_SET_CHAR = EOF:1 ERR:40 BRK:40 EVT:0 XON:11 XOFF:13
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.10.2011, 16:42
Ответы с готовыми решениями:

Serial port. Изменение значений
Здравствуйте! Месяц назад я начал учить C#. Моя задача - считать значения с серийного порта, а...

Прием и передача строки Serial Port
Пишу прогу на подобии терминала серийного порта. Встала делема и похожего варианта кода я не нашел,...

Serial Port, описание устройства,предоставленное шиной
Здравствуйте, подобные темы уже обсуждались на форуме, но я так и не смогла найти ответ. Как...

Принимаемые данные с датчика через Serial port преобразовать в RGB
Всем доброго времени суток! Стоит одна задача. Необходимо, получая строки с датчика цвета,...

19
Эксперт .NET
 Аватар для kolorotur
17794 / 12945 / 3381
Регистрация: 17.09.2011
Сообщений: 21,228
19.10.2011, 17:09 2
Насколько мне известно, штатными средствами - никак.
Может быть можно сделать через WinAPI, но я в нем не силен.
А можно поинтересоваться для чего нужно менять значения?
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
20.10.2011, 08:01  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Насколько мне известно, штатными средствами - никак.
Может быть можно сделать через WinAPI, но я в нем не силен.
А можно поинтересоваться для чего нужно менять значения?
пишу программу с ком портом . и смотрю тоже как успешно работает другая программа написанная на делфи. вот ищу разницу. так как исходника нету.
А может есть сторонняя свободная библиотека с богатыми пропрети на все настройки порта все такое не используя winapi.
0
Эксперт .NET
 Аватар для kolorotur
17794 / 12945 / 3381
Регистрация: 17.09.2011
Сообщений: 21,228
20.10.2011, 22:42 4
b.dulat, вы знаете, я работал со множеством различных протоколов, реализуемыех через серийный порт и никогда не имел проблем с "несовпадением" приведенных вами значений.
Если реализовать конкретный протокол и проводить обработку полученных байт самостоятельно, проблем быть не должно со штатным SerialPort.
Что касается сторонних библиотек - не интересовался, но вроде как видел что-то подобное пару раз.
Погуглите .NET serial port library
1
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
21.10.2011, 16:16  [ТС] 5
Сейчас делаю печать(термо принтер). работаю как говорил с ком портом.
Записываю команду на порт и жду ответа от принтера - LabelPrinted. Так вот ответ идет от принтера 250 мили сек. И за 1 сек печатаю всего 3 этикетки. А должно быть 10. А в той программе на делфи ответ приходит очень быстро. Вот не могу понять какая разница между ними. Почему ответ от принтера может идти долго?
0
Эксперт .NET
 Аватар для kolorotur
17794 / 12945 / 3381
Регистрация: 17.09.2011
Сообщений: 21,228
21.10.2011, 21:01 6
b.dulat, именно ответ приходит долго или обработка команды занимает длительное время?
Не так давно реализовывал протокол VDCP, так там контроллер посылает запрос девайсу каждые 40 мсек, причем по спецификации девайс должен начать отправку ответа не позднее чем через 6 мсек после получения последнего байта команды. Использовал System.Net.Ports.SerialPort - никаких проблем не возникало.
Остальные настройки порта совпадают с дельфийскими? Может стоит глянуть на реализацию получения команды - проблема может быть там.
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
22.10.2011, 06:34  [ТС] 7
kolorotur, скорее всего все таки ответ приходит долго, а не само распечатывание. Если не ждать ответа и отправлять, печать идет быстро.
Не совпадает настройки IOCTL_SERIAL_SET_CHAR, IOCTL_SERIAL_SET_TIMEOUTS.
Реализация получения ответа такая: у класса ком порта есть ивент DataReceived. не него подписался. в методе выполняю ReadExisting(). дальше смотрю этот ли ответ.


Вот что то вроде лога печати 3-х этикеток, фиксировал время:
1Begin-время начало печати 1 этикетки. Вход в цикл.
DO Write() 1- время до команды записи в порт Write(string).
Write() 1 время после команды записи в порт Write(string).
DataReceived:- время когда пришло ответ
Получили ответ :time1=0,2499968sec; - время после записи и до получения ответов:
C#
1
2
3
4
While(!islabelprinted|| !isendofbatch)
{}
islabelprinted = false;
isendofbatch = false;
1End-время выхода с цикла 1.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1Begin **********05:52:50.468
05:52:50.484DO Write() 1
05:52:50.531 Write() 1
05:52:50.765 DataReceived: Label printed
05:52:50.781 DataReceived: batch end
05:52:50.781 I=1 Получили ответ :time1=0,2499968sec; islabelprinted=True; isendofbatch=True
1End**********05:52:50.781 Total = 0,3124992sec;
2Begin **********05:52:50.781
05:52:50.781DO Write() 2
05:52:50.828 Write() 2
05:52:51.46 DataReceived: Label printed
05:52:51.62 DataReceived: batch end
05:52:51.62 I=2 Получили ответ :time1=0,2343808sec; islabelprinted=True; isendofbatch=True
2End**********05:52:51.62 Total = 0,2812544sec;
3Begin **********05:52:51.62
05:52:51.62DO Write() 3
05:52:51.93 Write() 3
05:52:51.328 DataReceived: Label printed
05:52:51.328 DataReceived: batch end
05:52:51.328 I=3 Получили ответ :time1=0,2343808sec; islabelprinted=True; isendofbatch=True
3End**********05:52:51.328 Total = 0,2656256sec;
0
Эксперт .NET
 Аватар для kolorotur
17794 / 12945 / 3381
Регистрация: 17.09.2011
Сообщений: 21,228
22.10.2011, 11:41 8
b.dulat, а можно глянуть часть кода, где вы инициализируете порт?
0
Mobile Developer
 Аватар для lifestyle
238 / 234 / 18
Регистрация: 10.05.2009
Сообщений: 917
22.10.2011, 16:06 9
Цитата Сообщение от b.dulat Посмотреть сообщение
Хочу изменить так IOCTL_SERIAL_SET_CHAR = EOF:1 ERR:40 BRK:40 EVT:0 XON:11 XOFF:13
С помощью API функции SetCommState с использованием структуры DCB которая и предоставляет возможность настройки IOCTL_SERIAL_SET_CHAR
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
24.10.2011, 08:00  [ТС] 10
вот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            port = new SerialPort("COM1", 38400, Parity.None, 8, StopBits.One);
            port.Handshake = Handshake.RequestToSend;
            port.Encoding = System.Text.Encoding.GetEncoding(1251);
            port.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
            if (!port.IsOpen)
                port.Open();
 
 
        void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                string s = port.ReadExisting();
                if (s.IndexOf((char)30) != -1)
                {
                    islabelprinted = true;
                    Console.WriteLine(DateTime.Now.ToString("hh:mm:ss") + "." + DateTime.Now.Millisecond.ToString() + " DataReceived: Label printed");
                }
                if (s.IndexOf((char)31) != -1)
                {
                    isendofbatch = true;
                    Console.WriteLine(DateTime.Now.ToString("hh:mm:ss") + "." + DateTime.Now.Millisecond.ToString() + " DataReceived: batch end");
                }
        }
лог моей программы на Portmon:
C#
1
2
3
4
5
6
7
8
9
10
20  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_BAUD_RATE  Serial0 SUCCESS Rate: 38400 
21  9:52:10 WindowsFormsApp IOCTL_SERIAL_CLR_DTR    Serial0 SUCCESS     
22  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_LINE_CONTROL   Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
23  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_CHAR   Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13    
24  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_HANDFLOW   Serial0 SUCCESS Shake:8 Replace:80 XonLimit:1024 XoffLimit:1024 
25  9:52:10 WindowsFormsApp IOCTL_SERIAL_CLR_DTR    Serial0 SUCCESS     
26  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_TIMEOUTS   Serial0 SUCCESS RI:-1 RM:-1 RC:-2 WM:0 WC:0 
27  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_WAIT_MASK  Serial0 SUCCESS Mask: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING   
28  9:52:10 WindowsFormsApp IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 4096 OutSize: 2048  
29  9:52:10 WindowsFormsApp IOCTL_SERIAL_WAIT_ON_MASK   Serial0
лог программы на делфи(работает на win2k):
C#
1
2
3
4
5
6
7
8
5   0.00000168  DelphiApp.exe   IOCTL_SERIAL_GET_HANDFLOW   Serial0 SUCCESS     
6   0.00000922  DelphiApp.exe   IOCTL_SERIAL_SET_BAUD_RATE  Serial0 SUCCESS Rate: 38400 
7   0.00000447  DelphiApp.exe   IOCTL_SERIAL_CLR_DTR    Serial0 SUCCESS     
8   0.00000307  DelphiApp.exe   IOCTL_SERIAL_SET_LINE_CONTROL   Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8  
9   0.00000168  DelphiApp.exe   IOCTL_SERIAL_SET_CHAR   Serial0 SUCCESS EOF:1 ERR:40 BRK:40 EVT:0 XON:11 XOFF:13    
10  0.00000978  DelphiApp.exe   IOCTL_SERIAL_SET_HANDFLOW   Serial0 SUCCESS Shake:8 Replace:80 XonLimit:1024 XoffLimit:1024 
11  0.00000140  DelphiApp.exe   IOCTL_SERIAL_SET_TIMEOUTS   Serial0 SUCCESS RI:-1 RM:0 RC:0 WM:100 WC:1000  
12  0.00000503  DelphiApp.exe   IOCTL_SERIAL_SET_WAIT_MASK  Serial0 SUCCESS Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL
0
 Аватар для ITDeveloper
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
24.10.2011, 08:13 11
Можно все быстро и через WinApi реализовать! Исходники для программ передачи/приёма символов через com-порты
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 08:13 12
b.dulat, я тож всегда юзал и юзаю стандартный класс и проблем не возникало. А можно взглянуть на спецификацию протокола?...
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
24.10.2011, 08:25  [ТС] 13
Цитата Сообщение от SNOOPYKZ Посмотреть сообщение
b.dulat, я тож всегда юзал и юзаю стандартный класс и проблем не возникало. А можно взглянуть на спецификацию протокола?...
какого протокола? ком порт RS-232. или что именно?
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 08:26 14
Цитата Сообщение от b.dulat Посмотреть сообщение
какого протокола? ком порт RS-232. или что именно?
Именно RS-232. А протоколы разные и ни когда проблем не было.
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
24.10.2011, 08:33  [ТС] 15
Цитата Сообщение от SNOOPYKZ Посмотреть сообщение
Именно RS-232. А протоколы разные и ни когда проблем не было.
если честно не знаю что такой протокол ком порта. подскажите какие бывают. и откуда взять? спасибо
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 08:43 16
Цитата Сообщение от b.dulat Посмотреть сообщение
если честно не знаю что такой протокол ком порта. подскажите какие бывают. и откуда взять? спасибо
Протокол - понятие условное, под ним подразумеваются правила посылки/приемам данных и их последовательность. Но все всегда сводится к одному - 1/0 на пины 2 и 3

Под правилами посылки/приемам данных подразумевается договоренность, что, например,
  • у девайса 1, первым будет идти байт размера всего пакета, а потом сами байты пакета
  • у девайса 2, первым будут идти 2 байта размера всего пакета, а потом сами байты пакета, а в конце 2 байта котрольной суммы

И то и и другое - договоренность, заранее оговоренные "правила игры" - общения. Но(!), как я уже сказал, все всегда сводится к байтам, а они к 1/0 на пинах 2 и 3 RS-232

говоря простым языком
"Правила приема/передачи данных" - этож целых ТРИ слова!
Зачем "платить больше"(?!), если можно сказать - "протокол", а это ОДНО слово, а не ТРИ
1
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
24.10.2011, 08:58  [ТС] 17
Цитата Сообщение от SNOOPYKZ Посмотреть сообщение
Протокол - понятие условное, под ним подразумеваются правила посылки/приемам данных и их последовательность. Но все всегда сводится к одному - 1/0 на пины 2 и 3

Под правилами посылки/приемам данных подразумевается договоренность, что, например,
  • у девайса 1, первым будет идти байт размера всего пакета, а потом сами байты пакета
  • у девайса 2, первым будут идти 2 байта размера всего пакета, а потом сами байты пакета, а в конце 2 байта котрольной суммы

И то и и другое - договоренность, заранее оговоренные "правила игры" - общения. Но(!), как я уже сказал, все всегда сводится к байтам, а они к 1/0 на пинах 2 и 3 RS-232

говоря простым языком
"Правила приема/передачи данных" - этож целых ТРИ слова!
Зачем "платить больше"(?!), если можно сказать - "протокол", а это ОДНО слово, а не ТРИ
вложил programmers manual принтера. на странице 227 есть General Purpose Input Output (GPIO) Port Applications. Это именно то описание?
Вложения
Тип файла: pdf 88231601_h.pdf (4.21 Мб, 63 просмотров)
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 09:08 18
Цитата Сообщение от b.dulat Посмотреть сообщение
вложил programmers manual принтера. на странице 227 есть General Purpose Input Output (GPIO) Port Applications. Это именно то описание?
Классная дока для принтера, тока много "воды".
Тебе надо прочитать для начала:
  • Typical Data Flow Sequence
  • Label Header Commands
  • Attention-Getters
  • Alternate Control Code Modes
  • Alternate Line Terminator Example
  • Immediate Command Functions

Весь протокол основывается на
Байт 1 - команда
Байт 2-N - параметры
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 9
24.10.2011, 13:26  [ТС] 19
Цитата Сообщение от SNOOPYKZ Посмотреть сообщение
Классная дока для принтера, тока много "воды".
Тебе надо прочитать для начала:
  • Typical Data Flow Sequence
  • Label Header Commands
  • Attention-Getters
  • Alternate Control Code Modes
  • Alternate Line Terminator Example
  • Immediate Command Functions

Весь протокол основывается на
Байт 1 - команда
Байт 2-N - параметры
через эти команды и формируется разметка. В принципе это все используется.
а что насчет того что принтер отвечает так долго? пробовал скорость у порта ставить 115000. все равно медленно
0
102 / 102 / 13
Регистрация: 22.10.2011
Сообщений: 328
24.10.2011, 13:45 20
Цитата Сообщение от b.dulat Посмотреть сообщение
а что насчет того что принтер отвечает так долго? пробовал скорость у порта ставить 115000. все равно медленно
А ты попробуй убрать все лишнее, оставь только NAK и посмотри на скорость. Если
1. открыть порт
2. послать туда 10 000 NAK-ов
3. закрыть порт

будет проходить долго, то тогда действительно, стоит обратить взор в сторону класса SerialPort
А если же быстро, то у тебя просто код так тормозит.

Есть еще один момент:
Порой девайс выдает много-много байт ответа. Кто-то собирает данные путем цикла с по-байтовым чтением и это долго. А кто-то читает массивами (например byte[1024]) и это намного быстрее.
0
24.10.2011, 13:45
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.10.2011, 13:45
Помогаю со студенческими работами здесь

Serial port. Можно ли определить подключено ли внешнее устройство?
Вопрос такой Можно ли определить подключено ли внешнее устройство? К PC подключаем USB/RS-232 9...

HDD serial number
Привет. Тема не нова, но всё-таки не понимаю одной вещи. Есть код для получения HDD s/n на c#: ...

Реалтаймовое чтение из Serial порта
Суть такова. Надо читать из COM порта во времени приближенном к реальному. Чтение с помощью...

Работа с массивом, принимаемым по serial interface, как с типом данных byte
Здравствуйте, обращался к программистам, но мой вопрос их ставил в тупик. Принимаю от электронного...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru