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