Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


SergeyDonetsk ©   (2001-11-08 12:50:00) 

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-14 14:33:00) [1]

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


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

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

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


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

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


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

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


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

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


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

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

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


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

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

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

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



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

и ещё такая штука : зачем в функции 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 нигде в этом цикле не изменяется !


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

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


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

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


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

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

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


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

вариант

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

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


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

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

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


SergeyDonetsk   (2001-11-12 12:01:00) [14]

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

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


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

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




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


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

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

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


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

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


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

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


SergeyDonetsk   (2001-11-08 15:11:00) [19]

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


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

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

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 ??????????


Наверх

Титульная страница Поиск, карта сайта Написать письмо