PDA

Просмотр полной версии : ПЛК63 + ПМ01 где неточность?



tomilov91
22.03.2016, 06:53
Здравствуйте, пытаюсь разобраться с syscomread и syscomwrite, связь между устройствами есть, как в примерах и полезностях постоянно пишу AT, команда уходит, любая другая команда тоже.

CASE master OF
1:
Length1:=LEN(str1);
str_adr:=ADR(str1);
send:=SysComWrite(
dwHandle:=0,
dwBufferAddress:=str_adr,
dwbytestoWrite:=length1,
dwtimeout:=0);
IF send=length1 THEN master:=2; END_IF

Читать хочу по одному байту с модема. Прочитал байт - пишу в переменную, переменную в массив, инкрементирую позицию для записи, пока ничего не останется читать.

2:
read:=SysComRead(
dwHandle:=0,
dwBufferaddress:=ADR(zz),
dwBytesToread:=1,
dwTimeout:=0);
IF read=1 THEN readed[pos]:=zz; pos:=pos+1;
IF read=0 THEN master:=1; END_IF

Результат: в массиве половина данных, то есть если ответ должен быть "ОК", я имею "каретка - О - каретка", позвонил на модем, жду RING, имею "каретка - R - N - каретка". В чем косяк, где теряются данные?
zz - byte, readed - массив byte

tomilov91
22.03.2016, 07:14
IF send=length1 THEN master:=2; else master:=2 END_IF - заработало, всем спасибо за внимание.

capzap
22.03.2016, 07:40
IF send=length1 THEN master:=2; else master:=2 END_IF - заработало, всем спасибо за внимание.

как связан переход с записи на чтение и прием не полной информации? чем не устраивает овеновская бибка работы с модемом

tomilov91
22.03.2016, 08:53
Очепятался, вот так примерно.

CASE master OF
1:
IF ton1.Q THEN
length1:=LEN(str1);
str_adr:=ADR(str1);
send:=SysComWrite(
dwHandle:=0,
dwBufferAddress:=str_adr,
dwbytestoWrite:=length1,
dwtimeout:=0);
IF send=length1 THEN master:=2; END_IF
ELSE
master:=2;
END_IF

Нужно при поступлении звонка сбросить вызов и отправить смс с данными, овеновскими не пробовал, АТ команды понятнее и привычнее.

capzap
22.03.2016, 09:05
Очепятался, вот так примерно.

CASE master OF
1:
IF ton1.Q THEN
length1:=LEN(str1);
str_adr:=ADR(str1);
send:=SysComWrite(
dwHandle:=0,
dwBufferAddress:=str_adr,
dwbytestoWrite:=length1,
dwtimeout:=0);
IF send=length1 THEN master:=2; END_IF
ELSE
master:=2;
END_IF

Нужно при поступлении звонка сбросить вызов и отправить смс с данными, овеновскими не пробовал, АТ команды понятнее и привычнее.

сейчас опечатка стала еще грубее
Вам просто нужно в любом случае перейти к второму кейсу, а в нем уже ждать некоторое время, которое называется тайм-аут, если по истечении этого времени всеравно ноль,тогда значит модем закончил передавать ответ

жекон
22.03.2016, 10:55
А правда зачем все так сложно ?