реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Терминал, вывод данных
Lodyr
сообщение Dec 12 2013, 12:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 7-05-06
Пользователь №: 16 863



Всех приветствую!
Учусь программировать, опыта мало совсем
Пишу программку наподобие гипрертерминала виндоус или putty. Пишу в с++ builder
проблема с выводом полученных данных в мемо, никак не догоню как это сделать
подсоединяюсь к девайсам через UART, разные девайсы выводят инфу в разном формате

данные принимаются в буфер и дальше оттуда их надо выводить в мемо
формат данных от разных устройств разный, выводить надо в аски

вместо ... идет какой-то текст
проблема, как распознавать переводы строк
ниже приведенные примеры, это вывод данных в хексе

принтер 1
0D 0A 0D 0A ... 0D 0A 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D 0D 0A 0D ...
0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D 0D 0A 0D ... 0D 0A 0D
... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D 0D 0A 0D ... 0D 0A
0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D
... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ... 0D 0A 0D ...

принтер 2
0A 0D ... 0A 0D ... 0A 0D ... 0A 0D ... 0A 0D ... 0A 0D ... 0A 0D ...
0D 0A ... 0D 0A ... 0D 0A ... 0D 0A 0D ... 0D 0A 0D ...

спутниковый тюнер на линуксе
00 0D ... 00 ... 0D 0A 0D ... 0A 0D ... 0A 0D ... 0A 0D ... 0A 0D ...
0A 0D ... 0A 0D 0A 0D ... 0A 0D ... 0A 0D ... 0A 0D

с принтерами проблема, что нет конца строки у последних данных
на девайсе на линуксе еще проблема, что он шлет 00 байтики, с ними то же что-то надо делать

Для тестирования проги использовал строку вида ...\r\n...\r\n с эти проблем нет, все работает
на реальных девайсах оказалось все не так.

вот полностью пример, что приходит от принтера 2
Код
0A 0D 5B 48 57 49 43 5D 0A 0D 31 50 4C 4C 0A 0D  ..[HWIC]..1PLL..
32 49 4F 43 0A 0D 33 53 44 52 41 4D 0A 0D 34 47  2IOC..3SDRAM..4G
50 49 4F 0A 0D 35 41 48 42 0A 0D 5B 45 4E 44 5D  PIO..5AHB..[END]
5B 59 5D                                         [Y]
0D 0A 44 65 63 6F 6D 70 72 65 73 73 69 6F 6E 20  ..Decompression
2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 0D 0A 2D 2D 3E  ***********..-->
3E 3E 3E 20 47 4F 20 4B 65 72 6E 65 6C 0D 0A 6A  >>> GO Kernel..j
75 6D 70 5F 45 78 65 63 43 6F 64 65 28 29 20 3A  ump_ExecCode() :
20 75 6C 5F 61 64 64 72 20 2D 20 30 78 30 32 30   ul_addr - 0x020
30 38 30 30 30 0D 0A 0D 20 49 6E 69 74 69 61 6C  08000... Initial
69 7A 65 57 44 54 0D 0A 0D 5B 30 78 32 30 37 38  izeWDT...[0x2078
35 36 34 5D                                      564]

вот ф-ция, которая выводит данные в мемо
Код
//---------------------------------------------------------------------------
void __fastcall TForm1::ProcessPortData( )
{
    if( !Port->Recv_Buff_Ex( 50 ) )
    {
        Form1->PrintText( (char*)Port->rd_buff );

        Port->ClearRecvData();

        Form1->PrintText( Port->LastErrorStr );
    }
    else
    {
        if( strstr( (char*)( Port->rd_buff + Port->CountRecv - 2 ), "\r\n" ) )
        {
            Port->rd_buff[ Port->CountRecv - 2 ] = '\0';

            Form1->PrintText( (char*)Port->rd_buff );

            Port->ClearRecvData();
        }
    }

    return;
}
//---------------------------------------------------------------------------

идея была вот такая
так как мы не знаем, что нам придет в порт и что мы будем считывать, то я ориентировался на то, что при выводе аски, строки должны заканчиваться на перевод строки или окончание строки
попало сколько то байт в внутренний буфер порта, проверяем есть ли перевод строки, если есть выводим данные, чистим буфер
если нет, снова вызывается ф-ция читающая буфер ... на самом деле она вызывается постоянно в цикле в другом потоке и постепенно наполняет буфер
затем происходит, проверка, и если есть перевод строки, то вывод
если буфер переполняется, то выводится весь буфер и очищается

в общем помогите, кто чем может, а то уже месяц туплю
Спасибо!
Go to the top of the page
 
+Quote Post
smalcom
сообщение Dec 12 2013, 19:28
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



чтото непонятно в чём проблема((
Go to the top of the page
 
+Quote Post
Lodyr
сообщение Dec 12 2013, 21:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 7-05-06
Пользователь №: 16 863



есть буфер с постоянно пополняющимися данными приходящими из ком порта, его надо вывести в мемо
т.е. визуально должен быть вот такой вывод
Код
  
[HWIC]
1PLL
2IOC
3SDRAM
4GPIO
5AHB
[END][Y]
Decompression***********
-->>>> GO Kernel
jump_ExecCode() : ul_addr - 0x02008000
InitializeWDT
[0x2078564]


в общем надо написать терминал для связи с девайсами
они же что-то отвечают, вот это что-то и надо выводить в мемо
т.е. то же самое что делает и виндовый терминал


Сообщение отредактировал Lodyr - Dec 12 2013, 21:49
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 12 2013, 21:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



отмена, не так понял sm.gif

в чем проблема-то?

парсить на предмет 0x0A, если оно - следующее состояние, ждем 0x0D. Если не оно - оба символа в мемо и опять ждем 0x0A. Если был 0x0D - начинаем новую строку в мемо и ждем 0x00 или как там
если не 0 - выводим в строку мемо и опять ждем 0x0A
там же можно всякие тайм-ауты ловить и их в логику обработки вкручивать (это к теме "нет перевода строки"). Нет передачи там 50-100мс - сами генерим перевод строки

а вообще неплохо бы автоматы почитать... Мура, Мили..
сразу логика работы построится и все будет очень просто
Go to the top of the page
 
+Quote Post
Lodyr
сообщение Dec 12 2013, 22:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 7-05-06
Пользователь №: 16 863



Цитата(toweroff)
парсить на предмет 0x0A, если оно - следующее состояние, ждем 0x0D.

так вот как раз проблема с определением перевода строки
чуть выше приведены ответы от трех разных девайсов и все по-разному переводят строки
да вот даже в этом примере, который чуть выше, если обратите внимание, аппарат шлет три разных вида перевода строки
0A0D
0D0A
0D0A0D
почему так?
Оба примера с принтеров самсунг.

Цитата
а вообще неплохо бы автоматы почитать... Мура, Мили..
сразу логика работы построится и все будет очень просто

спасибо, поищу

Сообщение отредактировал Lodyr - Dec 12 2013, 22:13
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 13 2013, 06:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Lodyr @ Dec 13 2013, 02:09) *
аппарат шлет три разных вида перевода строки

0A - LF - Line Feed
0D - CR - Carriage return

Почему-то некоторые считают, что перевод строки - пара приведенных выше кодов.

Для классических терминалов:
Символ LF (код 0A) собственно и есть "перевод строки" - курсор остаётся в той же позиции, но на строке ниже.
Символ CR (код 0D) оставляет курсор в той же строке, где он находился, но курсор передвигается на начало строки (в первую позицию строки).

В своей программе сделайте реакцию на эти символы в соответствии с их назначением, и - будет Вам счастье rolleyes.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 13 2013, 06:33
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Палыч @ Dec 13 2013, 10:13) *
Для классических терминалов:
Символ LF (код 0A) собственно и есть "перевод строки" - курсор остаётся в той же позиции, но на строке ниже.
Символ CR (код 0D) оставляет курсор в той же строке, где он находился, но курсор передвигается на начало строки (в первую позицию строки).

у меня знакомый, старичок уже, до сих пор называет клавиши "Ввод" и "Enter" не иначе, как "Возврат каретки" sm.gif
Принтеру действительно нужно два кода - вернуть головку в начало и провернуть барабан
Go to the top of the page
 
+Quote Post
Lodyr
сообщение Dec 13 2013, 08:42
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 7-05-06
Пользователь №: 16 863



Спасибо, Вам!
Действительно рассматривал эти символы как пару. Попробую переделать с учетом, что каждый символ отвечает за свое.
Так же попробую пересмотреть таймауты. У меня они сейчас выставлены на максимуме. Порт читаю в синхронном режиме, а время чтения задается при вызове ф-ции Recv_Buff_Ex( timeout ).
Спасибо!

Сообщение отредактировал Lodyr - Dec 13 2013, 08:58
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 13 2013, 09:31
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Lodyr @ Dec 12 2013, 16:00) *
он шлет 00 байтики, с ними то же что-то надо делать

О назначении управляющих символов можно прочитать, например, в Викопедии.
Go to the top of the page
 
+Quote Post
Lodyr
сообщение Dec 13 2013, 09:54
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 7-05-06
Пользователь №: 16 863



Спасибо!
у меня еще вопрос будет, по установке контроля потока: аппаратный, программный, нет. Пока чего-то то же не догоняю. Но это позже, с выводом разберусь-)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016