Форум: "WinAPI";
Текущий архив: 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 ....
Вопросы - в пустоту ....
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c