![]() |
|
|
|
|
#1
|
||||
|
||||
|
Устройство передает по компорту несколько строк, в том числе и число с плавающей запятой. Как мне получить эти данные в читабельном виде, например в Memo? Текст я получить с мог, а вместо числа служебные символы. Число в формате float32.
|
|
#2
|
||||
|
||||
|
floattostr
|
|
#3
|
||||
|
||||
|
Для этого мне сначала нужно получить это число в переменную (например Single) — вопрос в том как?
|
|
#4
|
|||
|
|||
|
Вероятно, ты получаешь 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
|
||||
|
||||
|
Цитата:
Я отправляю в устройство команду 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 Гц *‰‰Г Очень прошу помочь — диплом горит (специальность не программирование). |
|
#6
|
||||
|
||||
|
Вобщем решил отказаться от использования компонента 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.Или, может, кто подскажет как принимать числа с плавающей запятой CPort'ом. Прошу отнестись к моим "завтыкам" с терепением ![]() |