![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Всем доброго вечара!
Хочу написать програмку для чтения информации с ком порта, пробовал писать через 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
|
||||
|
||||
![]() Возможно, нужно использовать что то из серии OemToChar, для преобразования.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() Цитата:
|
#4
|
||||
|
||||
![]() Есть подозрение, что символы приходят в OEM кодировке, если так, то конвертируй их.
P.S. Посмотрел рисунок, похоже на юникод. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 09.08.2011 в 22:38. |
#5
|
||||
|
||||
![]() так там данные структурированные приходят... нужно как минимум знать протокол передачи данных с этого устройства, тупо чтением байт здесь не обойтись..
а что за терминал?? |
#6
|
||||
|
||||
![]() Цитата:
На картинке 3 терминала, 2 из них работают) 3й мой, не знаю как заставить показывать что и те 2... данные приходят в одном и том же формате - заголовок "STARLINE " потом 8 байт динамической части, затем 6 бай статической и еще 2 байта динамики.. передача осуществляеться в таком же формате... вот я только никак понять не могу как же воспользоватья функцией OemToChar взодящие данные в string, далее они выводится в richedit пишу так: Код:
OemToChar(PAnsiChar(RCBuf), PWideChar(str)); RichEdit1.Lines.Add (str); Приложение компилируеться без проблем, стоит только запросить данные порта, так сразу вылазиет ерор.... |
#7
|
||||
|
||||
![]() Формат кодировки может быть и 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
|
||||
|
||||
![]() если чесно, это мне совсем не очем не говорит)
|
#9
|
||||
|
||||
![]() Попробуй, кто знает что у тебя там.
Код:
function OemToAnsiStr(const OemStr: string): string; begin SetLength(Result, Length(OemStr)); if Length(Result) > 0 then OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result)); end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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
|
|||
|
|||
![]() Судя по вашей первой картинке вы копаете демку 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; |
#12
|
||||
|
||||
![]() Цитата:
пробовал и с bcomport-ом и через winapi все одна картина... и с этим кодом тоже самое... |
#13
|
||||
|
||||
![]() Скачал nrComm Lib Pro 8.30 for Delphi, все нормально принимается(в том виде в каком и должно), но засада в том что компонент принимает и отправляет через memo, а не через функции(может функции есть тока не нашел
![]() Может есть у кого опыт с этой штукой? если кому нужен компонент Последний раз редактировалось Graf33rus, 23.08.2011 в 01:48. |