Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / правильный парсинг данных приходящих с com порта. / 9 сообщений из 9, страница 1 из 1
10.07.2017, 06:49
    #39485441
Помидор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
Добрый день форумчане программисты. Нужна ваша помощь.
Устройство подключено к компьютеру через com порт. Данные получаю, с этим проблем нету.
Код читается этим блоком.
Код: 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.
#region comPort_DataReceived
        /// <summary>
        /// method that will be called when theres data waiting in the buffer
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //determine the mode the user selected (binary/string)
            switch (CurrentTransmissionType)
            {
                //user chose string
                case TransmissionType.Text:
                    //read data waiting in the buffer
                    string msg = comPort.ReadExisting();
                    //display the data to the user
                    DisplayData(MessageType.Incoming, msg + "\n");
                    break;
                //user chose binary
                case TransmissionType.Hex:
                    //retrieve number of bytes in the buffer
                    int bytes = comPort.BytesToRead;
                    //create a byte array to hold the awaiting data
                    byte[] comBuffer = new byte[bytes];
                    //read the data and store it
                    comPort.Read(comBuffer, 0, bytes);
                    //display the data to the user
                    DisplayData(MessageType.Incoming, ByteToHex(comBuffer) + "\n");
                    break;
                default:
                    //read data waiting in the buffer
                    string str = comPort.ReadExisting();
                    //display the data to the user
                    DisplayData(MessageType.Incoming, str + "\n");
                    break;
            }
        }
        #endregion



А именно этой строкой
Код: c#
1.
2.
3.
4.
//read data waiting in the buffer
                    string msg = comPort.ReadExisting();
                    //display the data to the user
                    DisplayData(MessageType.Incoming, msg + "\n");



Вот как выглядит одно целое сообщение отправляемое устройством
Код: plaintext
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.
QDSNO	40
DATE	20170626
TIME	113900
DOC	
OPID	0
MODE	32
WRN	0
PM1	11
PM2	131
RM1	33

WM1	19
WM2	41
WM3	65
PART	5
EM1	41
BM1	59
PARN	29
P01	5,58	0
P02	4,90	0
P03	 129	0
P04	37,31	0
P05	  76	0
P06	26,2	2
P07	 345	0
 {!!!!!} 
P08	 244	0
P09	0,17	0
P10	 6,9	2
P11	 8,0	0
P12	35,2	0
P13	44,5	1
P14	14,1	0
P15	3,11	0
P16	0,47	0
P17	1,85	2
P18	55,8	1
P19	 8,
 {!!!!!} 
5	1
P20	33,1	2
P21	 8,0	0
P22	 5,0	2
P24	0,08	0
P25	0,06	0
P26	 1,5	0
P27	 1,1	0
P28	4900	0
P29	4900	0
AGE	0

Там где видите знак {!!!!!} означает что буфер чтения заполнился и данные считались в переменную. Это произошло в три раза, то есть одно сообщение считалось тремя блоками. А если больше одного сообщения отправит устройство, то в буфер могут попасть конец одного сообщения и начала другого сообщения.
Как мне правильно распарсить данные, найти нужный момент для этого? Ведь нужное мне сообщение разделилось в 3 три блока, а размер сообщения пока неизвестно.
Любые идеи, размышления будут полезны. У меня самого опыта работы с com портами нету. Но работу надо сделать.
...
Рейтинг: 0 / 0
10.07.2017, 09:18
    #39485488
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
Спросить у разработчиков устройства (найти в документации по устройству), как определить конец сообщения для этого конкретного устройства...
...
Рейтинг: 0 / 0
10.07.2017, 10:43
    #39485549
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
COM-порт выдает поток байт, а дальше сам режь/клей сообщения.
Полученный блок данных может обрываться на любом символе.
Как понимаю это текст с переводами строк, парси буфер построчно выискивая "\n". Если буфер кончился, а "\n" не было, значит это часть строки, ставь ее в начало следующего буфера и дальше читай из порта.
...
Рейтинг: 0 / 0
10.07.2017, 11:05
    #39485573
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
Помидор,

Изучить технологию конечного автомата . Помнить указатель на буфер и шаг парсинга независимо от состояния читающего потока.
...
Рейтинг: 0 / 0
10.07.2017, 11:23
    #39485588
Помидор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
BarloneСпросить у разработчиков устройства (найти в документации по устройству), как определить конец сообщения для этого конкретного устройства...
Сейчас занимаюсь этим, но они точно в эту неделю не ответят. А хочется быстрее, время поджимает.

Dima TCOM-порт выдает поток байт, а дальше сам режь/клей сообщения.
Полученный блок данных может обрываться на любом символе.
Как понимаю это текст с переводами строк, парси буфер построчно выискивая "\n". Если буфер кончился, а "\n" не было, значит это часть строки, ставь ее в начало следующего буфера и дальше читай из порта.
Текст перевода строки я вставляю сам, а чтобы здесь это было заметно я обозначил конец буфера знаком {!!!!!}.
Вашу идею понял, буду искать конец сообщения. Она у меня выходила как абракадабра, до него есть строка age. Получается можно ориентироваться на это поле. Попробую.
...
Рейтинг: 0 / 0
10.07.2017, 11:33
    #39485604
Помидор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
SiemarglПомидор,

Изучить технологию конечного автомата . Помнить указатель на буфер и шаг парсинга независимо от состояния читающего потока.
Попробую. Хотел быстрым наскоком, ничего не понял.
...
Рейтинг: 0 / 0
10.07.2017, 11:39
    #39485613
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
ПомидорА если больше одного сообщения отправит устройство, то в буфер могут попасть конец одного сообщения и начала другого сообщения.Ну обычно устройства предпочитают отправлять данные в некоем предопределённом порядке... и зачастую этого достаточно для идентификации границы пакета данных. Тупо каждому полю пакета ставим в соответствие некий внутренний псевдономер, и уменьшение этого номера для текущего поля по сравнению с предыдущим означает, что пройдена граница пакета данных. Это даже при условии, что в пакете отсутствуют поля и/или маркеры начала/конца пакета.
...
Рейтинг: 0 / 0
10.07.2017, 15:38
    #39485830
Помидор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
Вот полное сообщение.
Код: plaintext
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.
VDSNO	120
DATE	20170707
TIME	112100
SID	17
PID	2074
NAME	
BIRTH	00000000
SEX	0
DOC	
OPID	0
MODE	32
WRN	0
PM1	11
PM2	158
RM1	40
WM1	17
WM2	42
WM3	67
PART	5
EM1	42
BM1	59
PARN	29
P01	5,01	0
P02	5,17	0
P03	 160	0
P04	45,42	0
P05	  88	0
P06	31,1	0
P07	 353	1
P08	 220	0
P09	0,20	0
P10	 9,1	0
P11	13,1	0
P12	41,0	0
P13	49,2	1
P14	13,2	0
P15	1,20	2
P16	0,31	0
P17	3,42	0
P18	23,9	2
P19	 6,1	0
P20	68,2	0
P21	 8,0	0
P22	 5,0	2
P24	0,04	0
P25	0,05	0
P26	 0,7	0
P27	 1,0	0
P28	4900	0
P29	4900	0
AGE	0
1F

Вроде есть начало (VDSNO 120) и конец (1F) сообщения. Только что они значат и как их ловить?
...
Рейтинг: 0 / 0
10.07.2017, 16:07
    #39485863
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
правильный парсинг данных приходящих с com порта.
ПомидорВроде есть начало (VDSNO 120) и конец (1F) сообщения.
Скорее VD и 1F
ПомидорТолько что они значат и как их ловить?
Алгоритм следующий:
1. Читаешь, пока не поймаешь [начало]
2. Очистка приемного буфера
3. Читаешь и складываешь в буфер, пока не поймаешь [конец]
4. Передаешь буфер на обработку (можно без символов [начало] и [конец])
5. Переход к п.1
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / правильный парсинг данных приходящих с com порта. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]