Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

работа с модемом   Найти похожие ветки 

 
Xerx ©   (2004-04-16 18:34) [0]

Привет всем! Кто-нибудь подскажет, как работать в Delphi с портом модема?!
Как отправлять ему команды: atdp,atz, v1 и т.д. и получать результаты???


 
Jack128 ©   (2004-04-16 19:30) [1]

читай статьи про работу с ком портов. В inet"e таких статей полно, на этом сайте в том числе..


 
juiceman ©   (2004-04-17 03:07) [2]

Ой, лучше напиши что тема закрыта и ищи и читай хэлпы. Вопрос твой задавался уже очень-очень много раз - могут порвать на куски. Вкратце: работаешь как с обычным файлом при помощи WinAPI, послать команду - запись строки, считать - чтение строки. Надо только определить на каком порту висит модем.


 
Mosquito   (2004-04-18 02:59) [3]

Я тоже искал на эту тему долго что-нить, накопал, только там во-первых ошибка была, переманная объявлена не тем типом что надо и во-вторых данные на модем отсылаются (напрмер atdp 3), но модем ничего не делает, кроме того, что подтверждает приход данных кратким морганием RD.
Была еще статья, так там никаких тонкостей не описано, только в общих чертах...


 
Jack128 ©   (2004-04-18 11:02) [4]


>  [3] Mosquito   (18.04.04 02:59)

плохо искал, только этом сайте - 2 статьи про порты..Посмотри ещё на www.delphikingdom.ru


 
Mosquito   (2004-04-19 14:05) [5]

В общем отправка на модем получается, только модем все равно не выполняет команду. Проблема в Sportster"е?


 
Jack128 ©   (2004-04-19 16:52) [6]


> [5] Mosquito   (19.04.04 14:05)
код в студию


 
Карелин Артем ©   (2004-04-19 17:41) [7]

Mosquito   (19.04.04 14:05) [5]
Перевод строки посылаешь?


 
Mosquito   (2004-04-20 00:35) [8]

Точно! "+ #13 + #10" забыл к строке с номером приписать
Всем спасибо, заработало, номер набирается :)

А вот такой вопрос тогда у меня:
Как после отправки команды (например ati4) считать строку которую выдает модем?
Пробовал по аналогии
Readfile(hCommFile, Str, 15, Kols, nil);
Но получается, что Str - целочисленного(..?) типа, а мне надо строкового

... Да, и почему у меня ХР постоянно валится от Делфи7 ?!...


 
Jack128 ©   (2004-04-20 09:01) [9]

function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD;
 var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; stdcall; где ты целочисленный тип увидел? это не типизированный параметр

если хочешь считать в строрку, то нужно так:
SetLength(Str, 15);
Readfile(hCommFile, PChar(Str)^, 15, Kols, nil);


 
Mosquito   (2004-04-20 10:36) [10]

А почему проект виснет если несколько раз сделать операцию чтения? Нужно очищать буфер порта из-за нехватки 15 байт этих?


 
Jack128 ©   (2004-04-20 16:59) [11]


> А почему проект виснет если несколько раз сделать операцию
> чтения?
без понятия..Кода я так и не вижу, поэтому даже предположений нет..

> Нужно очищать буфер порта из-за нехватки 15 байт
> этих?
не понял, что ты имеешь в виду


 
Mosquito   (2004-04-20 18:10) [12]

procedure TForm1.Button3Click(Sender: TObject);
begin
Kols:=0;
WriteFile(hCommFile, PChar(CommandStr)^, Length(CommandStr), Kols, nil);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Kols:=0;
SetLength(AnswerStr, 15);
Readfile(hCommFile, PChar(AnswerStr)^, 15, Kols, nil);
Label1.Caption:=AnswerStr;
end;

Вот код. Запись в порт идет нормально, сколь процедуру не вызывай, а вот чтение вешает программу если вызвать его дважды подряд. Нужно что-то обнулять каждый раз?


 
Jack128 ©   (2004-04-20 18:16) [13]


> Readfile(hCommFile, PChar(AnswerStr)^, 15, Kols, nil);
> Label1.Caption:=AnswerStr;
Первое, что брасается в глаза
if Readfile(hCommFile, PChar(AnswerStr)^, 15, Kols, nil) then
 RaiseLastWin32Error;
SetLength(AnswerStr, KOL);
Label1.Caption:=AnswerStr;

Ты таймауты настраиваешь?


 
Mosquito   (2004-04-20 20:13) [14]

if Readfile(hCommFile, PChar(AnswerStr)^, 15, Kols, nil) then  RaiseLastWin32Error;
Как до этого доходит получаю мессагу об ошибке...

Таймауты не настраиваю, не знаю где и как...

Так вот открываю и настраиваю порт:
procedure TForm1.Button1Click(Sender: TObject);
begin
CommFile := CreateFile("COM3", GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hCommFile=INVALID_HANDLE_VALUE then
       begin
       ShowMessage("Unable to open Сom");
       exit;
       end;
GetCommState(hCommFile,DCB);    //На GetCommState у меня нет топика
 dcb.BaudRate := 9600;
 dcb.ByteSize := 8;
 dcb.Parity := NOPARITY;
 dcb.StopBits := OneStopBit;
SetCommState(hCommFile, dcb);
end;

А вот так закрываю:
procedure TForm1.Button2Click(Sender: TObject);
begin
CloseHandle(hCommFile);
end;

Где настраивать таймауты?


 
Jack128 ©   (2004-04-20 20:36) [15]


> if Readfile(hCommFile, PChar(AnswerStr)^, 15, Kols, nil)
> then  RaiseLastWin32Error
блин, извени я сам ошибся, естественно if not ReadFile(..)


> Где настраивать таймауты
ты бы хелп почитал Communication Functions в Win SDK

или какой нить компонент с исходниками скачал..


 
Mosquito   (2004-04-21 12:21) [16]

Скачал Асинк Про, блин как его устанавливать-то ?


 
KADAN ©   (2004-04-22 09:37) [17]

Господа, разрешите вклиниться в вашу беседу и задать вам пару вопросов. Хочу узнать две вещи:
1) снимаю трубку, набираю номер (atdtXXX), как можно потом нажимать еще разные кнопочки не кладя трубки.
2) как узнать, когда мне кто-то звонит? неужели постоянно опрашивать модем?
Буду очень благодарен за полезные ответы


 
Mosquito   (2004-04-22 10:23) [18]

KADAN
1. Установи Async Pro, Там много всего для работы с модемом
2. Для того чтобы узнать когда звонят:
SetCommMask(hCommFile, EV_RING);
Затем
WaitCommEvent(hCommFile, <...>, nil);


 
Jack128 ©   (2004-04-22 16:42) [19]


> WaitCommEvent(hCommFile, <...>, nil);

Вот мне очень любопытно, неужели кто то рискует использовать WaitCommEvent в синхронном режиме? Ведь если событие не произайдет, то программа(точнее поток) просто подвиснет??

> как можно потом нажимать еще разные кнопочки не кладя трубки.
потом - это после коннекта? Тогда, наверное, нужно перейти в командный режим (пошли "+++" и немного подожди) и снова послать atdt<твои кнопочки>, правда сам так не делал, просто мысли вслух...


 
Mosquito   (2004-04-23 11:33) [20]

А как в асинхронном дождаться события, чтоб поток не вис?


 
Jack128 ©   (2004-04-23 17:09) [21]


> А как в асинхронном дождаться события, чтоб поток не вис?
Кхе..Не совсем так. В синхронном режиме, если событие не произашло, то поток виснет намертво и снять его можно только TerminateThread, а в асинхронном режиме ты можешь задать время в течении которого ты будшь ждать событие

{метод ждет в течении заданного таймаута прихода определенного байта}
function TAsyncCommPortDriver.WaitEventChar(Timeout: Cardinal): boolean;
var
 ov: TOverlapped;
 Dummy: DWORD;
begin
 Result := False;
 if not Connected then
   Exit;
 PausePolling;
 try
   ZeroMemory(@ov, SizeOf(ov));
   ov.hEvent := GetEvent.Handle; // function TAsyncCommPortDriver.GetEvent: TEvent;
   Result := WaitCommEvent(Handle, Dummy, @ov); //в другом месте маска событий установлена равной EV_RXFLAG и dcb.EvtChar := <заданный байт>
   if Result or (GetLastError <> ERROR_IO_PENDING) then
     Exit;
   FEvent.WaitFor(Timeout);
   Result := GetOverlappedResult(FHandle, ov, Dummy, False);
   if not Result then Cancel; // прервем операцию асинхронного ввода/вывода (в этом методе - вызов Windows.CancelIO)
 finally
   ContinuePolling;
 end;
end;



Страницы: 1 вся ветка

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

Наверх





Память: 0.5 MB
Время: 0.034 c
6-1081768676
Геннадий
2004-04-12 15:17
2004.05.30
Как создать вложение при отправке электронного письма? idSMTP


1-1084886026
Dina
2004-05-18 17:13
2004.05.30
RecNo записи


1-1084781602
Vadim X
2004-05-17 12:13
2004.05.30
Как сбросить кэш?


3-1084349034
dim-
2004-05-12 12:03
2004.05.30
Добавить/Удалить пользователя


8-1080052987
Pa5ha
2004-03-23 17:43
2004.05.30
Сохранение изображения на холсте в Direct3D





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский