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

serial port

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

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

Использую стандартные классы .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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2011, 16:42
Ответы с готовыми решениями:

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

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

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

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

19
Эксперт .NET
17438 / 12830 / 3361
Регистрация: 17.09.2011
Сообщений: 21,108
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
17438 / 12830 / 3361
Регистрация: 17.09.2011
Сообщений: 21,108
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
17438 / 12830 / 3361
Регистрация: 17.09.2011
Сообщений: 21,108
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
17438 / 12830 / 3361
Регистрация: 17.09.2011
Сообщений: 21,108
22.10.2011, 11:41 8
b.dulat, а можно глянуть часть кода, где вы инициализируете порт?
0
Mobile Developer
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
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru