-
Прошу прщения, но я только учусь.
Так вот вопрос:
необходимо передать черех ком-порт 4 байта "000h, 055h, 017h, 05Fh".
Это кусок из кода:"
Buff:=s;
nBytes:=4;//Length(Buff);
ok:=WriteFile( //uses Windows
hCom,
Buff[1],
nBytes,
wr_cnt,
nil
);
if not ok then RaiseLastOSError;
if wr_cnt<>nBytes then Raise Exception.Create('Число записанных байтов в COM-порт меньше, чем было затребовано.');
end;"
подскажите, плз, как в "s" забить эти байты?
-
Никаких Buff тут не нужно.
Передавай прямо из s:
s: = #$00#$55#$17#$5F;
ok:=WriteFile(
hCom,
s[1],
nBytes, // 4
wr_cnt,
nil
);
-
увы не сработало...
я пошел другим путем:
var Buff: array[0..$FF] of Byte;
var wr_cnt: DWORD;
var ok:Boolean;
var nBytes: DWORD;
begin
if bPortIsOpen=False then begin
Raise Exception.Create('Сначала откройте COM-порт.');
end;
Buff[0]:=$00;
Buff[1]:=$55;
Buff[2]:=$17;
Buff[3]:=$5F;
nBytes:=4;//Length(Buff);
ok:=WriteFile( //uses Windows
hCom,
Buff,
nBytes,
wr_cnt,
nil
);
if not ok then RaiseLastOSError;
if wr_cnt<>nBytes then Raise Exception.Create('Число записанных байтов в COM-порт меньше, чем было затребовано.');
end;
вроде в мониторе он передает, но в ответ от устройства ничего не получаю...
по паспорту написано:
"Передача данных инициируется посылкой запроса ведомому устройству от ведущего устройства (компьютер). Передаче запроса должен предшествовать интервал молчания длительностью минимум 4 мс.
Запрос состоит из 4-х байт:
1. сетевой адрес ведомого устройства;
2. байт 055h — код функции запроса текущего веса;
3. два байта контрольной суммы CRC16.
Ведомое устройство принимает запрос, контролирует бит паритета для каждого байта данных, сравнивает присвоенный устройству сетевой адрес и адрес в запросе и вычисляет контрольную сумму CRC16."
вот я и думаю, может где с тайм-аутом не то?
-
P.S.
"Если хотя бы одно условие нарушено, то ответ не генерируется. При выполнении всех условий ведущий посылает ответ, состоящий из 8 байт:
1. сетевой адрес ведомого устройства;
2. три байта значения веса (первый байт – младший), целое число со знаком, отрицательные значения представлены в дополнительном коде, т.е. –1 = 0FFFFFFh.
3. байт служебной информации b1;
4. байт служебной информации b2;
5. два байта контрольной суммы CRC16."
-
> не сработало
Что значит "не сработало" ?
Вот так прямо и говорит - "не срабатываю" ?)
-
нет, говорит, фигвам... :0)
не передает в ответ ничего...
-
> 161a © (30.09.10 16:11) [5]
И чего ?
У тебя и если ты "пошел другим путем" тоже "в ответ от устройства ничего не получаю")
А если нет разницы, зачем "платить дважды" ?)
-
таки и я о том: посыл вроде прошел, но ответ не сгенерировался! вот что обидно! хотя у их "родной" программы все проходит на ура... а от нее есть толькл ехе-шник... как посмотреть где я ошибаюсь... :(
-
> посыл вроде прошел
Что значит "вроде" ?
Либо он заведомо прошел либо не прошел)
Ты сравни монитором-то что уходит от твоей программулины с тем что уходит от родного ехе-шника для этой железяки
-
уходит одно и то же, но может там по времени какая-то закавыка...
-
т.е. монитор показывает что от дивайса вообще ничего не поступает в ответ на твой посыл ?
-
ага
-
А что за монитор-то ?
p.s.
А чего это ты запостил вопрос в "Corba и COM" ?
Твоя задача кроме фигурирующей аббревиатуры "СОМ" не имеет ни малейшего отношения к теме раздела)
-
ну я ж грю тока учусь, монитор "comport toolkit"
-
Покажи дампы монитора для случая твоего и не твоего посылов ..
-
мой
000019|15:31:48.375 |COM1 |<<|00 55 17 5F |.U._
не мой
000019|15:32:53.906 |COM1 |<<|00 55 17 5F |.U._
000020|15:32:54.046 |COM1 |>>|00 74 00 00 02 04 BC 76 |.t....јv
-
сорри! не мой
000019|15:31:48.375 |COM1 |<<|00 55 17 5F |.U._
000020|15:31:48.531 |COM1 |>>|00 00 00 00 02 14 3A C7 |......:З
это нулевое значение ответчика
-
> мой
> 000019|15:31:48.375
> сорри! не мой
> 000019|15:31:48.375
Что-то ты темнишь) ..
Как это "мой" и "не мой" посылы у тебя были отправлены в одно и тоже время с точностью до миллисекунды ?
-
блин, не оттуда скопировал
Мой
000001|18:02:51.562 |COM1 |<<|00 55 17 5F |.U._
не мой
000001|18:01:53.514 |COM1 |<<|00 55 17 5F |.U._
000002|18:01:53.655 |COM1 |>>|00 00 00 00 02 14 3A C7 |......:З
-
ну хорошо
покажи свой код инициализации/открытия порта и чтения из него..
-
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
все выдели.
И подведи мышь к выделенному
-
спасибо друг!!! если встретимся с меня поляна!!!
-
и последний вопрос, если мона, как из одной процедуры запустить другую?
-
да, у меня прием идет по таймеру, а возможно ли в одной процедуре, ну скажем "послать/получить" послать запрос а потом сразу получить?
-
> как из одной процедуры запустить другую?
Из какой какую ?
> а возможно ли
Всё возможно)
-
все разобрался, сеньку!!!!! теперь буду пытаться передать в форму путь к файлу в который надо записать значение...
-
не могу нигде найти как передать в форму путь к файлу для сохранения... можа поможешь? плиииз...
-
Это отдельный вопрос, никак не связанный с COM-портом.
Задавай в "Начинающие"