Учусь программировать, опыта мало совсем
Пишу программку наподобие гипрертерминала виндоус или 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]
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;
}
//---------------------------------------------------------------------------
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;
}
//---------------------------------------------------------------------------
идея была вот такая
так как мы не знаем, что нам придет в порт и что мы будем считывать, то я ориентировался на то, что при выводе аски, строки должны заканчиваться на перевод строки или окончание строки
попало сколько то байт в внутренний буфер порта, проверяем есть ли перевод строки, если есть выводим данные, чистим буфер
если нет, снова вызывается ф-ция читающая буфер ... на самом деле она вызывается постоянно в цикле в другом потоке и постепенно наполняет буфер
затем происходит, проверка, и если есть перевод строки, то вывод
если буфер переполняется, то выводится весь буфер и очищается
в общем помогите, кто чем может, а то уже месяц туплю
Спасибо!