Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Вниз

Кто поможет проверить где ошибка? 


SergeyDonetsk   (2001-11-08 12:50) [0]

function WriteComm(var Buf; size: word): integer; //пеpедача в поpт
var p: pointer; i: integer;
begin
p := @Buf;
result := 0;
i:=0;
while size > 0 do begin
if not WriteFile(Port, p^, 1, cardinal(i), nil) then exit;
inc(result, i); inc(integer(p)); dec(size);
Application.ProcessMessages;
end;
end;


function PortInit(com:string): boolean; //инициализация
var ct: TCommTimeouts;
dcb: TDCB;
begin
Port:= Windows.CreateFile(PChar(com), GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (Port < 0) or not Windows.SetupComm(Port, 2048, 2048) or not
Windows.GetCommState(Port, dcb) then exit; //init error

dcb.BaudRate := CBR_19200;
dcb.StopBits := ONESTOPBIT;
dcb.Parity := NOPARITY;
dcb.ByteSize := 8;
if not Windows.SetCommState(Port, dcb)
or not Windows.GetCommTimeouts(Port, ct) then exit; //error
ct.ReadTotalTimeoutConstant := 50;
ct.ReadIntervalTimeout := 50;
ct.ReadTotalTimeoutMultiplier := 1;
ct.WriteTotalTimeoutMultiplier := 0;
ct.WriteTotalTimeoutConstant := 10;
if not Windows.SetCommTimeouts(Port, ct)
or not Windows.SetCommMask(Port, EV_RING + EV_RXCHAR + EV_RXFLAG + EV_TXEMPTY)
then exit; //error
result := true;
end;

...

//открываем порт
if not(PortInit("COM2")) then
begin
MessageDlg("Ошибка инициализации", mtError, mbOKCancel,0);
end;

//пишем в порт
S:="AT H1"+#10+#13;
WriteComm(S, Length(S)); {вроде должен снять трубу?}



Digitman   (2001-11-08 13:23) [1]

далеко ходить не будем )))
вот ты пишешь :

begin
// если здесь Exit вставить, чему Result равен по-твоему ?????
Port:= Windows.CreateFile(PChar(com), GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (Port < 0) or not Windows.SetupComm(Port, 2048, 2048) or not
Windows.GetCommState(Port, dcb) then exit; //и здесь - если exit отработает, чему равен Result ??????????



SergeyDonetsk   (2001-11-08 15:11) [2]

ну думаю там все нормально в том плане что порто открывается!
данные в порт уходят и приходят это проверил.
а вот модем не хочет выполнять свои комманды (типа ATH1 и т.п.) думаю что ему как то надо сообщить что сейчас комманда прийдёт?



Digitman   (2001-11-08 15:21) [3]

Для начала - заставь его просто "трубу поднять" - "ATDP"



SergeyDonetsk   (2001-11-08 16:19) [4]

ATDP тоже ничего просто ламочками помигает ненавящево...



Digitman   (2001-11-08 17:00) [5]

А S как определена ? String ?
Если - да, то правильно будет так :

//пишем в порт
S:="AT H1"+#10+#13;
WriteComm(@S[1], Length(S));



SergeyDonetsk   (2001-11-12 09:30) [6]

так тоже ничего?




интересно те кто советует сам хоть раз это пробовал??? (мысли в слух)



SergeyDonetsk   (2001-11-12 12:01) [7]

Может для такого рода задач надо использовать TAPI?

НУ очень надо уже начинаю гореть!
Кто нибудь помогите заставить модем набрать номер!!!



Digitman   (2001-11-12 13:21) [8]

Если уж так "горит" - тогда бросай свои "мысли вслух" и разбирайся, что же ты В ДЕЙСТВИТЕЛЬНОСТИ передается по ссылке в вызовах
WriteComm(S, ...) // твой вариант (неработающий)
и
WriteComm(@s[1], ... ) // вариант того, "кто советует"

если S объявлена как String и декларация/реализация ф-ции WriteComm() выглядит именно так, как собственно в твоем вопросе ))



SergeyDonetsk   (2001-11-12 16:22) [9]

вариант

Wr! iteComm(@s[1], ... ) // вариант того, "кто советует"

тоже не рабочий!
Качал компаненты с тори которые работают по подобному принципу тоже ни один не заработал а вот которые используют TAPI те да никаких ПРОБЛЕМ!



Digitman   (2001-11-12 16:40) [10]

"не работает" у тебя тело твоей WriteComm(). А адрес строкового буфера при ее вызове именно так будет передан ПРАВИЛЬНО ! Опять же, если s - String ! Хотя и другой способ есть - преобразованием в PChar. Но уж никак не WriteComm(S, ...) (до сих пор ты так и не удосужился сказать, как у тебя S определена ... сиди тут и гадай, что такое у тебя S)

Касаемо тела WriteComm(). Поясни, почему передаешь по одному символу в цикле, а не всю строку сразу



Anatoly Podgoretsky   (2001-11-12 22:15) [11]

У нас уже была одна упорная, но и она в конце концов раскалолась, так что не теряй надежды.



Никто   (2001-11-13 03:26) [12]

Анатолий, "раскАлолась"! Опять тренируете "слепой метод"?



Donal   (2001-11-13 10:03) [13]

и ещё такая штука : зачем в функции WriteComm переменная i, если она всегда равна нулю?
Я имею ввиду такой кусок

i:=0;
while size > 0 do begin
if not WriteFile(Port, p^, 1, cardinal(i), nil) then exit;
inc(result, i); inc(integer(p)); dec(size);
Application.ProcessMessages;
end;

i нигде в этом цикле не изменяется !



Anatoly Podgoretsky   (2001-11-13 14:10) [14]

Никто (13.11.01 03:26)
Почему тренирую, я его использую, правда не всегда хорошо получается.

Donal © (13.11.01 10:03)
Это для того что бы узнать сколько байт записано, ее значение устанавливает функция WriteFile
Строчка i:=0; конечно же лишняя.

SergeyDonetsk © (12.11.01 16:22)
А в терминальном режиме у тебя работает, может дело в модеме?




SergeyDonetsk   (2001-11-13 15:38) [15]

в терминале работает.
S типа стринг, но при вызове процедуры WriteComm если кто заметил используется если можно так выразиться преобразование.
на счёт тринеруете слипой метод, что то не понял, обратился за помощью а тут начинают сунься туда сунся сюда. Одно дело просто идёики подкидовать другое дело посоветовать! Ведь перед тем как сюда вопрос задать почитал, что нашел, попробовал пару вариантов.
А тут опять начинается добавь +#13 а может попробуй #13+#10 или наоборот. Думаю если спрашивают более сложные вещи чем Как кнопку на форму поместить? а то курсовой горит. Отвечать можно нормально!

Спасибо за внимание!
Если кого обидел извеняюсь но вопрос не снят!



Digitman   (2001-11-13 16:04) [16]

Что значит - "если можно так выразиться преобразование" ? Какое во что ?



-Coban-   (2001-11-13 23:28) [17]

Обычно модемы и все что работает через протокол Hayes (AT комманды) использует $13 как конец строки. Вместо ATH1 лучше использовать ATA, некоторые устройства ATH1 не распознают. Проверкиуработы компорта лучше всего проверить командой AT.



Anatoly Podgoretsky   (2001-11-13 23:43) [18]

SergeyDonetsk © (13.11.01 15:38)
А вот обижаться на ответы не стоит, можешь остаться в одиночестве, а варианты задают потому что недостаточно информации.



SergeyDonetsk   (2001-11-14 10:20) [19]

to Anatoly Podgoretsky ©
Тут извеняюсь с горяча наверное так написал.
Но когда придлагают вариант
1) попробуй A:=1;
2) а может A:=2;
то тут уже слов нет ведь вопрос задан и перед этим проверен не один вариант!
да S была определена и как String и как PChar и ничего. отдельно проверил модем через терминал все посылаемые команды отрабатывает. отдельно проверил посылку в порт данных все ОК!
Именно если на порт подключить модем та он не риагирует на комманды.

Давайте переформулирую вопрос:
перед тем как послать управляющую комманду модему надо, что нибудь предворительно сделать? например включить сигнал DTR или там еще что нибудь?



Digitman   (2001-11-14 14:33) [20]

Н-да( .... неблагодарное это дело - remote debugging ....
Вопросы - в пустоту ....




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.032 c
3-42337           victor                2001-12-10 07:47  2002.01.14  
добавление записи с если первичный индекс автоинкрементный


1-42440           Philya                2001-12-21 18:00  2002.01.14  
кодировка


3-42350           dorosh                2001-12-11 14:13  2002.01.14  
Месяц в SQL запросе


1-42482           TSerg                 2001-12-25 15:25  2002.01.14  
Можно ли имитировать нажатие какой либо клавиши?


1-42489           AndrewK               2001-12-24 17:49  2002.01.14  
Как организовать систему?