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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.05.2010, 10:07
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию Сom-порт и float

Устройство передает по компорту несколько строк, в том числе и число с плавающей запятой. Как мне получить эти данные в читабельном виде, например в Memo? Текст я получить с мог, а вместо числа служебные символы. Число в формате float32.
Ответить с цитированием
  #2  
Старый 11.05.2010, 11:07
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

floattostr
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 11.05.2010, 19:42
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Для этого мне сначала нужно получить это число в переменную (например Single) — вопрос в том как?
Ответить с цитированием
  #4  
Старый 11.05.2010, 19:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вероятно, ты получаешь 4 байта.
Можно делать разными способами.
Например, записать их в поток как строку, а потом считать из потока как float. Или поиграться с указателями.

Код не проверял, просто как идея:
Код:
var
  S : String; // Исходная строка
  W : DWORD; // 4 байта
  PF : ^Double;
  I : Integer;
  F : Double;
begin
  W := 0;
  For I := 1 To 4 Do
    Begin
      W := W + Ord(S[i]);
      W := W shl 8;
    End;
  FP := @W;
  F := FP^;
end;
Ответить с цитированием
  #5  
Старый 12.05.2010, 10:32
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Вобщем решил отказаться от использования компонента CPort.
И использовать следующий код (отсюда):
Код:
unit PortUnit;

interface
 uses windows,sysutils;
 
 var
    CommHandle : integer;
    DCB : TDCB;
    Ovr : TOverlapped;
    Stat : TComStat;
    CommThread : THandle;
    hEvent : THandle;
    Flag,StopResive : boolean;
    KolByte,Kols,Mask,TransMask,Errs : DWord;
 procedure PortInit;
 procedure ReadComm;
 procedure WriteComm(A:byte);
 procedure KillComm;

 implementation

 uses
  Main;
  
 procedure KillComm;
 begin
  TerminateThread(CommThread,0); 
  CloseHandle(CommHandle);
 end;

 procedure WriteComm(A:byte);
 var
  Transmit:array [0..255] of char;
 begin
  //послать один символ в порт
   KolByte:=1;
   Transmit[0]:=chr(A);
   WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
 end;

 procedure ReadComm;
  var
   Resive:array [0..255] of char;
  begin

     while true do
   begin
    TransMask:=0;
    WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
    if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
     begin
      ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
      Kols := Stat.cbInQue;
      ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
      //тут должна идти обработка принятой информации из Resive
      Form1.Panel1.Caption:=string(Resive);
      //не очень хороший вариант вывода, но для примера подойдет
     end;//mask
    end;//while
  end;

 procedure PortInit;
  var
   ThreadID:dword;
  begin
  //создание и иницализация порта
  KolByte:=0;

  //создание порта и получение его хэндла
  CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

  //ставим маску - "по пришествии определенного символа"
  SetCommMask(CommHandle,EV_RXFLAG);

  //построение DCB
   GetCommState(CommHandle,DCB);
   DCB.BaudRate:=CBR_9600;
   DCB.Parity:=NOPARITY;
   DCB.ByteSize:=8;
   DCB.StopBits:=OneStopBit;
   DCB.EvtChar:=chr(13);//задание символа для флага
   //устанавливаем DCB
   SetCommState(CommHandle,DCB);
   //создаем паралельный поток
   //там будет вертеться процедура приема строки
   //с порта - ReadComm
   CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
  end;
end.
Но он позволяет отправлять в порт только числа, а мне нужно отправлять строки. Как переделать под мои нужды и объединить с решением (спасибо, lmikle!) по числам с плавающей запятой выше?
Или, может, кто подскажет как принимать числа с плавающей запятой CPort'ом.
Прошу отнестись к моим "завтыкам" с терепением
Ответить с цитированием
  #6  
Старый 15.05.2010, 02:50
Аватар для timeless
timeless timeless вне форума
Прохожий
 
Регистрация: 27.06.2008
Сообщения: 36
Репутация: 12
По умолчанию

Цитата:
Сообщение от lmikle
Вероятно, ты получаешь 4 байта.
Можно делать разными способами.
Например, записать их в поток как строку, а потом считать из потока как float.
Проверь, пожалуйста, код. Похоже, не работает.

Я отправляю в устройство команду dsend nums = 1 decim = 1 out и в ответ получаю три строки.
Случай, когда числа примерно одинаковые и около нуля:
Код:
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
MГtБ
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
'рБ
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
ё+Kѕ
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
nАА
Случай, когда числа разные:
Код:
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц

IГ
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
пq2Г
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
ЙДЄГ
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
#»Г
dsend nums = 1 decim = 1 out
out 
 vf: 1000.000000 Гц
*‰‰Г
Пробовал забирать последнюю строку и считывать ее как флоат по предлженному алгоритму, но успеха не добился.
Очень прошу помочь — диплом горит (специальность не программирование).
Вложения
Тип файла: txt sluchai 1.txt (250 байт, 5 просмотров)
Тип файла: txt sluchai 2.txt (628 байт, 4 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter