Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-42523
Smart
2001-10-10 11:27
2002.01.14
Remote Logoff needed. EXTREMELY URGENT


4-42598
Landgraph
2001-11-12 14:22
2002.01.14
Хватаем обращение


3-42394
Dim
2001-12-10 09:20
2002.01.14
Аналог в InterBase функции SUBSTRING MSSQL 6.5


1-42472
ASP
2001-12-25 14:14
2002.01.14
Как поймать окончание изменения размера формы


1-42431
-=Phantom=-
2001-12-23 22:28
2002.01.14
Проблема следующая:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский