-
procedure T_ComPort.OpenPort(PortName: String); begin if hCom>0 then Raise Exception.Create('Порт уже инициализирован'); hCom:=CreateFile( //uses Windows pchar(PortName), //Имя COM-порта GENERIC_READ or GENERIC_WRITE, 0, {exclusive access} nil, {no security attrs} OPEN_EXISTING, 0,{not overlapped} 0 {hTemplate} ); if hCom=INVALID_HANDLE_VALUE then RaiseLastOSError;
//Выставляем параметры COM-порта
if not GetCommState(hCom,dcb) //uses Windows then RaiseLastOSError;
dcb.BaudRate:=CBR_9600; dcb.ByteSize:=8; dcb.Parity:=NOPARITY; dcb.StopBits:=ONESTOPBIT;
if not SetCommState(hCOM,dcb) //uses Windows then RaiseLastOSError;
//Выставляем параметры COM-порта if not GetCommTimeOuts(hCom,cto) //uses Windows then RaiseLastOSError;
cto.ReadIntervalTimeout:=1; cto.ReadTotalTimeoutMultiplier:=1; cto.ReadTotalTimeoutConstant:=10;
cto.WriteTotalTimeoutMultiplier:=0; cto.WriteTotalTimeoutConstant:=0;
if not SetCommTimeOuts(hCom,cto) //uses Windows then RaiseLastOSError;
bPortIsOpen:=True;
end;
-
до чтения пока не дошел, мне бы в мониторе ответ увидеть... ;0/
-
> dcb.BaudRate:=CBR_9600; > dcb.ByteSize:=8; > dcb.Parity:=NOPARITY; > dcb.StopBits:=ONESTOPBIT; >
Это соответствует документации на железку ? Или от балды ?
-
Режим работы полудуплексный Скорость передачи 9600 бод Длина передачи 8 бит Бит паритета есть, дополняет байт до чётного числа единиц Число стоповых битов 1 бит Управление потоком нет
-
> Бит паритета есть
А какого же тогда ты пишешь
> dcb.Parity:=NOPARITY;
?
-
а кой правильно?
-
УУУУУРРРРРРРРРААААААААААААА!!!!!!!!!!!! ЗарРРРРРРаботалООООООООООО!!!! Спасибо огромедное!!!!!!
-
> 161a © (30.09.10 18:27) [26]
молодец ! Я искренне)
-
> Сергей М.
можешь дать еще консультацию?
При выполнении всех условий ведущий посылает ответ, состоящий из 8 байт: 1. сетевой адрес ведомого устройства; 2. три байта значения веса (первый байт – младший), целое число со знаком, отрицательные значения представлены в дополнительном коде, т.е. –1 = 0FFFFFFh. 3. байт служебной информации b1; 4. байт служебной информации b2; 5. два байта контрольной суммы CRC16. Три младших бита b1.0, b1.1 и b1.2 байта b1 образуют целое число Dec. Значение Dec от 0 до 6 показы-вают количество десятичных знаков после запятой в показаниях индикатора, т.е. целое значение веса необ-ходимо разделить на 10 в степени Dec.
накорябал следущее:
function T_ComPort.ReadString: String; var Buff: Array[1..8] of Byte;// String dword var rd_cnt: DWORD; var ok: Boolean; var i: Integer; var p: Integer; var x1, x2, x3, x4, x5, x6, x7, x8: Byte; // String dword PChar begin
if bPortIsOpen=False then begin Raise Exception.Create('Сначала откройте COM-порт.'); end;
if hCom=0 then Raise Exception.Create('Порт не был открыт.');
ok:=ReadFile( //uses Windows hCom, //Файл Buff, //Буфер куда считываем 8, //Число байтов для считывания rd_cnt, //Число считанных байтов nil );
if not ok then RaiseLastOSError;
if rd_cnt=0 then begin BufferIsEmpty:=True; Result:=''; exit; end; x1:=Buff[1]; x2:=Buff[2]; x3:=Buff[3]; x4:=Buff[4]; x5:=Buff[5]; x6:=Buff[6]; x7:=Buff[7]; x8:=Buff[7];
BufferIsEmpty:=False; end;
ответ получаю в точке останова Buff = 0,0,0,0,2,20,58,199, а в мониторе 000020|18:01:55.811 |COM1 |>>|00 00 00 00 02 14 3A C7 |......:З это нулевой вес. как мне раздобить или вытащить байты, чевой-то я собсем запутался...
-
> как мне раздобить или вытащить байты
Ты же уже все "раздобыл" и "вытащил" ? Вот же они, в массиве Buff[], все восемь .. Что еще то ты собрался "раздобывать" и "вытаскивать" ?)
-
дело в том, что эти х-ы ничего не содержат внутри! когда на точке останова смотрю - они пустые... но даже если, предположим, что нет то как мне из них по хаданию вытащить этот Dec?
ответ получаю в точке останова Buff = 0,0,0,0,2,20,58,199
в мониторе 000020|18:01:55.811 |COM1 |>>|00 00 00 00 02 14 3A C7 |......:З это нулевой вес.
ответ получаю в точке останова Buff = 0,206,0,0,2,4,212,230
в мониторе 000022|13:34:22.397 |COM1 |>>|00 CE 00 00 02 04 D4 E6 |.О....Фж
это 2060 кг
как мне вытащить этот вес?
-
> эти х-ы ничего не содержат внутри! когда на точке останова > смотрю - они пустые
Да быть того не может)
Ставь точку останова на BufferIsEmpty:=False и еще раз посмотри.
> как мне из них по хаданию вытащить этот Dec?
n: Integer; Weight: Double; ... n := PInteger(@Buff[2])^ and $FFFFFF; if (Buff[4] and $80) = $80 then n := n or $FF000000; Weight := n / Power(10, Buff[5] and 7);
-
[Warning] uComPort.pas(153): Unsafe code '@ operator' (это про "n := PInteger(@Buff[2])^ and $FFFFFF;") [Warning] uComPort.pas(154): Combining signed and unsigned types - widened both operands (это про "if (Buff[4] and $80) = $80 then n := n or $FF000000;") [Error] uComPort.pas(155): Undeclared identifier: 'Power' ( это про "Weight := n / Power(10, Buff[5] and 7); ")
:0((
-
у меня 7-ка
-
он у меня чево-то даже на это стал ругаться... [Error] uComPort.pas(157): Undeclared identifier: 'ShowMessage'
-
я тут потести малость и заметил одну вещь (отбросив последние 2 байта) Buff = 0,206,0,0,2,4 - 2060кг -2,06т Buff = 0,18,0,0,2,4 - 180кг - 0,18т Buff = 0,8,0,0,2,4 - 80кг - 0,08т. т.е. получается, что если брать 2 байт и делить на 100, тоя получаю вес...в тоннах, а если умножить на 10 то в кг...
-
в инспекторе он мне показал : Buff[2]: Byte $12FDB1, как это дело в целое превратить?
-
> [Warning]
На это не обращай внимание
> Undeclared identifier: 'Power'
uses Math
> Undeclared identifier: 'ShowMessage'
uses Dialogs
-
это 110, или 1,1 т - 1100 кг
-
> 161a © (01.10.10 15:10) [36]
вот это
PInteger(@Buff[2])^ and $FFFFFF
все выдели.
И подведи мышь к выделенному
|