Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.08.2011, 21:11
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию Кракозябры в терминале, как избавиться?

Всем доброго вечара!
Хочу написать програмку для чтения информации с ком порта, пробовал писать через winapi, так же пробовал через компонент(BComPort), результат везде одниковый, хотя в hyper терминале и терминале Bray отображаеться все корректно...

вот кусок кода отвечающий за чтение
Код:
procedure TForm1.Button4Click(Sender: TObject);
Var
  RCBuf:PChar;        //Буфер данных для приема
  nToRead:Cardinal;   //Число байт для чтения
  nRead:Cardinal;     //Число прочитанных байт
  ComStat:TComStat;   //состояние порта
  Errs:Dword;
  i:integer;
  tmpDec,tmpHex:string;
begin
  ClearCommError(POrt,Errs,@ComStat);       //считываем состояние порта
  nToRead:=ComStat.cbInQue;                 //считываем число байт для чтения из структуры
  nToReadLabel.Caption:=IntToStr(nToRead);  //выводим на форму число байт для чтения
  ReadFile(Port,RCBuf^,nToRead,nRead,nil);  //считываем данные
  nReadLabel.Caption:=IntToStr(nRead);      //выводим на форму число прочитанных байт
  RichEdit1.Lines.Add( RCBuf);
  RcDataLabel.Caption:=RCBuf;
end;


http://imagepost.ru/?v=texpqnvoenetu...fampmxwkmu.JPG
Ответить с цитированием
  #2  
Старый 09.08.2011, 21:46
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Возможно, нужно использовать что то из серии OemToChar, для преобразования.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 09.08.2011, 22:19
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Возможно, нужно использовать что то из серии OemToChar, для преобразования.
Можно маленько по подробней? =)
Ответить с цитированием
  #4  
Старый 09.08.2011, 22:23
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Есть подозрение, что символы приходят в OEM кодировке, если так, то конвертируй их.
P.S. Посмотрел рисунок, похоже на юникод.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 09.08.2011 в 22:38.
Ответить с цитированием
  #5  
Старый 09.08.2011, 22:36
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

так там данные структурированные приходят... нужно как минимум знать протокол передачи данных с этого устройства, тупо чтением байт здесь не обойтись..
а что за терминал??
Ответить с цитированием
  #6  
Старый 09.08.2011, 22:53
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pilot_Red
так там данные структурированные приходят... нужно как минимум знать протокол передачи данных с этого устройства, тупо чтением байт здесь не обойтись..
а что за терминал??

На картинке 3 терминала, 2 из них работают) 3й мой, не знаю как заставить показывать что и те 2... данные приходят в одном и том же формате - заголовок "STARLINE " потом 8 байт динамической части, затем 6 бай статической и еще 2 байта динамики.. передача осуществляеться в таком же формате...

вот я только никак понять не могу как же воспользоватья функцией OemToChar

взодящие данные в string, далее они выводится в richedit
пишу так:
Код:
OemToChar(PAnsiChar(RCBuf), PWideChar(str));
RichEdit1.Lines.Add (str);
(вычитал на каком то форуме)
Приложение компилируеться без проблем, стоит только запросить данные порта, так сразу вылазиет ерор....
Ответить с цитированием
  #7  
Старый 09.08.2011, 23:06
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Формат кодировки может быть и 7-битным.
Код:
The OemToChar function translates a string from the OEM-defined character
set into either an ANSI or a wide-character string. (OEM stands for original
equipment manufacturer.) This function supersedes the OemToAnsi function. 

BOOL OemToChar(
    LPCSTR lpszSrc,	// pointer to string to translate 
    LPTSTR lpszDst 	// pointer to buffer for translated string  
   );	
 
Parameters

lpszSrc

Points to a null-terminated string of characters from the OEM-defined
character set. 

lpszDst

Points to the buffer for the translated string. If the OemToChar function is
being used as an ANSI function, the string can be translated in place by
setting the lpszDst parameter to the same address as the lpszSrc parameter.
This cannot be done if OemToChar is being used as a wide-character function. 
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 09.08.2011, 23:45
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию

если чесно, это мне совсем не очем не говорит)
Ответить с цитированием
  #9  
Старый 10.08.2011, 00:01
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Попробуй, кто знает что у тебя там.
Код:
function OemToAnsiStr(const OemStr: string): string;
begin
  SetLength(Result, Length(OemStr));
  if Length(Result) > 0 then
    OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result));
end;
Входной параметр - твоя строка, на выходе - ANSI-кодировка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 10.08.2011, 09:19
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию

Тоже самое, только кракозяблы другие показывать стал))
У меня delphi 2010, долго упиралось в "OemToCharBuff(PChar(OemStr), PChar(Result)..."
написал так
Код:
OemToCharBuff(PAnsiChar(OemStr), PWideChar(Result), Length(Result));
надеюсь это на работу не повлияло?
Скрин:
http://imagepost.ru/images/q/lj/qljs...tkacrirxzp.JPG

Перваяя строчка без использовании функции
Вторая с использованием...
Ответить с цитированием
  #11  
Старый 10.08.2011, 19:29
FlyInDream FlyInDream вне форума
Прохожий
 
Регистрация: 10.08.2011
Сообщения: 24
Репутация: 10
По умолчанию

Судя по вашей первой картинке вы копаете демку Terminal из компонента BComPort, вот переделанная функция:
Код:
procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  S: String;
  bptr: ^Byte;
  I: Integer;
  str: string;
begin
  BComPort1.ReadStr(S, Count);
  if cbCRLF.Checked and (S[Length(S)] = #13) then // Добавление перевода строки
    begin
      S := S + #10;
      Memo1.Lines.Add('');
    end;

  str:= '';
  bptr:= @S[1];
  for I := 0 to Length(S)-1 do
    begin
        str:= str + Char(bptr^);
      Inc(bptr);
    end;
  Memo1.Text:= Memo1.Text + str;
end;
BComPort хороший компонент, winapi при этом не нужен.
Ответить с цитированием
  #12  
Старый 11.08.2011, 14:00
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от FlyInDream
Судя по вашей первой картинке вы копаете демку Terminal из компонента BComPort, вот переделанная функция:
Код:
procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  S: String;
  bptr: ^Byte;
  I: Integer;
  str: string;
begin
  BComPort1.ReadStr(S, Count);
  if cbCRLF.Checked and (S[Length(S)] = #13) then // Добавление перевода строки
    begin
      S := S + #10;
      Memo1.Lines.Add('');
    end;

  str:= '';
  bptr:= @S[1];
  for I := 0 to Length(S)-1 do
    begin
        str:= str + Char(bptr^);
      Inc(bptr);
    end;
  Memo1.Text:= Memo1.Text + str;
end;
BComPort хороший компонент, winapi при этом не нужен.

пробовал и с bcomport-ом и через winapi все одна картина...
и с этим кодом тоже самое...
Ответить с цитированием
  #13  
Старый 23.08.2011, 01:45
Аватар для Graf33rus
Graf33rus Graf33rus вне форума
Прохожий
 
Регистрация: 25.03.2009
Сообщения: 10
Репутация: 10
По умолчанию

Скачал nrComm Lib Pro 8.30 for Delphi, все нормально принимается(в том виде в каком и должно), но засада в том что компонент принимает и отправляет через memo, а не через функции(может функции есть тока не нашел )...

Может есть у кого опыт с этой штукой?

если кому нужен компонент

Последний раз редактировалось Graf33rus, 23.08.2011 в 01:48.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:25.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025