Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2011, 04:26   #11
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Код:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   20 20 34 38 2E 34 37 36  33 33 67 20 1B 72 69 67     48.47633g .rig
00000010   20 20 34 38 2E 34 37 36  33 33 67 20 1B 72 69 67     48.47633g .rig
00000020   20 20 34 38 2E 34 37 36  33 33 67 20 1B 72           48.47633g .r
а пояснения можно получить?
SonicBob вне форума Ответить с цитированием
Старый 04.08.2011, 06:51   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

а в таблицу символов ANSI заглянуть не судьба? или все за вас должны сделать?
p51x вне форума Ответить с цитированием
Старый 04.08.2011, 07:06   #13
SonicBob
Форумчанин
 
Регистрация: 30.05.2011
Сообщений: 133
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
а в таблицу символов ANSI заглянуть не судьба? или все за вас должны сделать?
знали бы не спрашивали наверно да? это для тебя это нечто уже как родное а для тех кто начинает темы на форумах это неведомое нечто
SonicBob вне форума Ответить с цитированием
Старый 04.08.2011, 08:33   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
вот с товарищем пишем программу
Вы пишете программу и не знаете, что такое АНСИ и таблица символов?
p51x вне форума Ответить с цитированием
Старый 04.08.2011, 08:40   #15
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Это кодировщик в UCS2
Например что-бы раскодировать я делал так берёте массив всех символов кодируете в эту кодировку и кодировку пишите в другой массив а потом сравниваете если сошлось то берёте символ из первого массива вот и все.
Код:
function ucs2(s: string): string;
var i,k: integer;
begin
result:='';
for i:=1 to length(s) do begin
  k:= ord(s[i]);
  if k>=192 then k:= k + 1040 - 192;
  result:= result + inttohex(k,4)
end
end;
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось dmitriegorovih; 04.08.2011 в 08:48.
dmitriegorovih вне форума Ответить с цитированием
Старый 04.08.2011, 11:38   #16
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Да ё-мое, только юникода тут не хватало

SonicBob, учить матчасть срочно, это же основы, как таблица умножения, блин
http://en.wikipedia.org/wiki/ASCII
http://www.delphisources.ru/pages/fa...s/Chr.php.html

пыщь
JTG вне форума Ответить с цитированием
Старый 04.08.2011, 11:42   #17
IIUH
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 35
По умолчанию

спасибо большое за пример кода!

только есть парочка вопросов по нему.

Цитата:
Сообщение от dmitriegorovih Посмотреть сообщение
Код:

  if k>=192 then k:= k + 1040 - 192;
вот тут. почему именно +1040-192? почему именно 192? в каких пределах могут изменяться значения?? как узнать какие нужны в конкретном случае??

Цитата:
Сообщение от dmitriegorovih Посмотреть сообщение
Код:

 result:= result + inttohex(k,4)
и вот тут что означает 4? понятно что это количество символов, вопрос в том, существенно ли изменение этого параметра?? я знаю что если число символов меньше чем этот параметр, то перед числом просто ставится 0.

PS. попробовал с помощью вашего кода перекодировать полученные нами данные, получил следущее.


Цитата:
0030
00300030
003000300030
0030003000300030
00300030003000300030
003000300030003000300030
0030003000300030003000300032
00300030003000300030003000320030
00300030003000300030003000320030003 0
00300030003000300030003000320030003 00030
00300030003000300030003000320030003 000300030
00300030003000300030003000320030003 0003000300030
00300030003000300030003000320030003 00030003000300030
00300030003000300030003000320030003 000300030003000300030
00300030003000300030003000320030003 0003000300030003000300032
00300030003000300030003000320030003 00030003000300030003000320030
00300030003000300030003000320030003 000300030003000300030003200300030
00300030003000300030003000320030003 00030003000300030003000320030003000 30
00300030003000300030003000320030003 00030003000300030003000320030003000 300030
читабельно конеш, но не совсем то, что хотелось бы получить
IIUH вне форума Ответить с цитированием
Старый 04.08.2011, 12:31   #18
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
вот тут. почему именно +1040-192? почему именно 192? в каких пределах могут изменяться значения?? как узнать какие нужны в конкретном случае??
16 постов, е-мае ...еще юникод приплели, уже ж расшифровали, что по аски со 2 по 10 байт в пакете нужные вам данные.

Покажите свою процедуру приема пакета и настроек COM порта (DCB структуры) ...у вас буфер должен быть на 16 байт. Ориентировочно, так должна выглядеть процедура приема:
Код:
type tb = array[1..255] of Char;  //Определяем символьный массив
     pb = ^tb;

// использование модуля COMM32
procedure Tmf.comReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var PX : pb;
    i  : integer;
    str: string;
begin
 PX:= buffer; str:='';
 for i:= 1 to BufferLength do
  str:=str+PX^[i];

 //  48.47633g .rig
 // 20 20 34 38 2E 34 37 36  33 33 67 20 1B 72 69 67
 packet(str) // пробел пробел число число точка число число число число число g пробел точка rig -> см. таблицу ASC в посту #16
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 04.08.2011 в 12:34.
raxp вне форума Ответить с цитированием
Старый 04.08.2011, 12:44   #19
IIUH
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 35
По умолчанию

Код:
procedure TReadThread.Execute;
var
  ComStat: TComStat;
  dwMask, dwError: DWORD;
begin
  FreeOnTerminate := True;

  while not Terminated do
  begin
    if not WaitCommEvent(FComPort.FPort, dwMask, @FOverRead) then
    begin
      if GetLastError = ERROR_IO_PENDING then
        WaitForSingleObject(FOverRead.hEvent, INFINITE)
      else
        raise EComPortError.Create('Error waiting port ' + FComPort.PortName
          + ' event');
    end;

    if not ClearCommError(FComPort.FPort, dwError, @ComStat) then
      raise EComPortError.Create('Error clearing port ' + FComPort.PortName);

    FRead := ComStat.cbInQue;

    if FRead > 0 then
    begin
      if not ReadFile(FComPort.FPort, FBuf, FRead, FRead, @FOverRead) then
        raise EComPortError.Create('Error reading port ' + FComPort.PortName);

      Synchronize(DoRead);
    end;
  end; {while}
end;

procedure TReadThread.DoRead;
var
  arrBytes: array of Byte;
  i: Integer;
begin
  if Assigned(FComPort.FReadEvent) then
  begin
    SetLength(arrBytes, FRead);
    for i := Low(FBuf) to FRead - 1 do
      arrBytes[i] := FBuf[i];

    FComPort.FReadEvent(Self, arrBytes);

    arrBytes := nil;
  end;  
end;

constructor TComPort.Create(PortNumber: Cardinal; BaudRate: TBaudRate);
var
  Dcb: TDcb;
  CommTimeouts:TCommTimeouts;
  mask:cardinal;
  RDOvr:TOverlapped;
  Fnull:DWORD;
begin
  inherited Create;

  ZeroMemory(@FOverWrite, SizeOf(FOverWrite)); //
  FPortName := 'COM' + IntToStr(PortNumber);     //
  WaitforSingleObject(RDOvr.hEvent, INFINITE);     //

  {Open port}
  FPort := CreateFile(PChar(PortName),
    GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

  if FPort = INVALID_HANDLE_VALUE then
    raise EComPortError.Create('Error opening port ' + PortName);

  try
    {Set port state}

    Fnull:=$800;
    setcommmask(FPort,fnull);

    waitcommevent(Fport,mask,@RDOvr);

    if not GetCommState(FPort, Dcb) then
      raise EComPortError.Create('Error setting port ' + PortName + ' state');

    Dcb.BaudRate :=CBR_300; 
    Dcb.Parity := NOPARITY;
    Dcb.ByteSize := 8;
    Dcb.StopBits := ONESTOPBIT;


  GetCommTimeouts(FPort, CommTimeouts); 
  CommTimeouts.ReadIntervalTimeout := 10; 
  CommTimeouts.ReadTotalTimeoutMultiplier := 50; 
  CommTimeouts.ReadTotalTimeoutConstant := 1; 
  CommTimeouts.WriteTotalTimeoutMultiplier := 0;
  CommTimeouts.WriteTotalTimeoutConstant := 0;  
  SetCommTimeouts(FPort, CommTimeouts); 

    if not SetCommState(FPort, Dcb) then
      raise EComPortError.Create('Error setting port ' + PortName + ' state');



    {Purge port}
    if not PurgeComm(FPort, PURGE_TXCLEAR or PURGE_RXCLEAR) then
      raise EComPortError.Create('Error purging port ' + PortName);

    {Set mask}
    if not SetCommMask(FPort, EV_RXCHAR) then
      raise EComPortError.Create('Error setting port ' + PortName + ' mask');

    FOverWrite.hEvent := CreateEvent(nil, True, False, nil);

    if FOverWrite.hEvent = Null then
      raise EComPortError.Create('Error creating write event');

    {Reading thread}
    FReadThread := TReadThread.Create(Self);
  except
    CloseHandle(FOverWrite.hEvent);
    CloseHandle(FPort);
    raise;
  end;
end;

как-то так
IIUH вне форума Ответить с цитированием
Старый 05.08.2011, 14:16   #20
IIUH
Пользователь
 
Регистрация: 02.08.2011
Сообщений: 35
По умолчанию

Код:
packet(str)
что-то не может идентефицировать эту строку
как быть?
IIUH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
определение принятых данных Lokos Работа с сетью в Delphi 0 25.10.2010 14:32
Асинхронная обработка принятых данных от порта osandr Общие вопросы Delphi 3 02.06.2010 09:32
зашифровка и расшифровка данных cl0oud Фриланс 11 02.04.2010 08:18
зашифровка и расшифровка данных cl0oud Общие вопросы Delphi 6 01.04.2010 17:27
Считывание и расшифровка (интерпретация) данных с lpt порта, передаваемых печатающему устройству Ma3a Общие вопросы Delphi 3 21.12.2009 08:46