![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.21.42] |
![]() |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте. Не знаю, как правильно организовать передачу АТ-команд и приём ответов от модема. Как с этими СОМ-портами работать правильно?
Открываю порт через СreateFile. Отправляю команду ATH через writefile. В ответ (readfie) вместо Ok получаю только один байт - $13. В общем, кто разобрался с СОМ и с модемами, отзовитесь. |
Сообщ.
#2
,
|
|
|
19 Connect 38400 Установлена связь на скорости 38400бит/с
С модемом не работал, но игрался с ком мышью. Собственно ошибок не вижу. Решил поработать с модемом. Тав возращается не один байт, а несколько. |
Сообщ.
#3
,
|
|
|
Цитата Открываю порт через СreateFile. Отправляю команду ATH через writefile. В ответ (readfie) вместо Ok получаю только один байт - $13. Попробуй отправлять просто команду 'AT#13#10', не помню точно, но вроде на ATH модем ответ не дает. Также можешь воспользоваться моим компонентом KlientServComConnect - он как раз предназначен для работы с модемом и COM-портом. |
Сообщ.
#4
,
|
|
|
zubr прав, все AT команды должны заканчиваться парой CR/LF.
Сразу предупрежу, что желательно использовать апаратный контроль потока данных. И перед каждым чтением проверять наличие байта в приемном буфере. Иначе функции чтения будут виснуть, и даже с использованием оверлеев, пока функция чтения не вернется, писать в порт нельзя. Добавлено Конкретно с модемом я не работал, зато много работал с собственными устройствами по RS232 (COM). |
Сообщ.
#5
,
|
|
|
Цитата Попробуй отправлять просто команду 'AT#13#10', не помню точно, но вроде на ATH модем ответ не дает. Также можешь воспользоваться моим компонентом KlientServComConnect - он как раз предназначен для работы с модемом и COM-портом. Цитата zubr прав, все AT команды должны заканчиваться парой CR/LF. Сразу предупрежу, что желательно использовать апаратный контроль потока данных. И перед каждым чтением проверять наличие байта в приемном буфере. Иначе функции чтения будут виснуть, и даже с использованием оверлеев, пока функция чтения не вернется, писать в порт нельзя. Так и передаю, вместе с #13#10. В ответ модем должен выдавать строку #13#10 OK #13#10, а я получаю только #13. А что такое аппаратный контроль данных. Как это реализовывается? Про оверлеи я почитал(на англ.), но не очень понял, куда их тулить. Пока понял так, что если оверлеи не используются, то команды чтения не "заканчиваются" до тех пор, пока не будет принят хотя-бы один символ. Это правильно? У меня так и происходит, то Wait, то Read виснут. В общем, нет у меня чёткого представления, как должен быть реализован обмен, что-то не учитываю. Я делаю так: write - команда wait - в буфер принят символ read - ответ. Ненадёжно работает. Первую команду отправляю, получаю один байт #13, на последующие вроде нормальную строку получаю. Чувствую, чего-то я не догоняю, как обмен происходит, там ведь еще всякие сигнал есть: DSR,CTS... Я могу и код представить. Только позориться не хочется. Пока только эксперименты. Конечная цель - дозвониться до абонента и передать голосовое сообщение(голосовой модем). zubr, а где взять KlientServComConnect? Поддерживает ли он голосовые функции? Если не получится ручками, придется, конечно, готовыми компонентами пользоваться. |
Сообщ.
#6
,
|
|
|
Взять можно здесь: Klientservcomconnect. Голосовые функции не поддерживает, есть полный Help + примеры работы с ним.
|
Сообщ.
#7
,
|
|
|
Вот результаты "исследований".
Для обмена с модемом используется вот такая функция ![]() ![]() function SendCommand(const command:string):string; var writed,readed:dword; buffer:array[1..64]of byte; i:byte; c:string; evtmask,mask:dword; begin result:=''; c:=command+char($0d)+char($0a); for i:=1 to length(c) do buffer[i]:=byte(c[i]); PurgeComm(COMPort,PURGE_TXCLEAR or PURGE_RXCLEAR); if s<>'' then if not writefile(COMPort,buffer,length(c),writed,nil) then begin exit; end; mask:=EV_RXCHAR; setcommmask(COMPort,mask); if not WaitCommEvent(COMPort,mask,nil) then begin exit end; sleep(100); if not readfile(COMPort,buffer,64,readed,nil) then begin exit; end; if readed=0 then begin exit; end; for i:=1 to readed do result:=result+char(buffer[i]); end; Дальше передаю команды ![]() ![]() s:='AT#CLS=8 #VSR=8000 #VBS=4'; r:=sendcommand(s); form1.memo1.Lines.Add(s); form1.memo1.Lines.Add(r); s:='ATD80973595377'; r:=sendcommand(s); form1.memo1.Lines.Add(s); form1.memo1.Lines.Add(r); sleep(5000); s:='AT#VTX'; r:=sendcommand(s); form1.memo1.Lines.Add(s); form1.memo1.Lines.Add(r); for i:=1 to 5 do begin s:=''; r:=sendcommand(s); form1.memo1.Lines.Add(s); form1.memo1.Lines.Add(r); end; s:=char($10)+char($18); r:=sendcommand(s); form1.memo1.Lines.Add(s); form1.memo1.Lines.Add(r); s:='ATH0'; r:=sendcommand(s); form1.memo1.Lines.Add(s); form1.memo1.Lines.Add(r); в результате имею вот такой диалог ![]() ![]() AT#CLS=8 #VSR=8000 #VBS=4 OK ATD80973595377 VCON AT#VTX CONNECT d d d d d d VCON ATH0 OK Квадратики - это $10. Т.е., модем дозванивается, переключается в режим передачи данных. А вот дальше какая-то загадка. Если ничего не передавать, то модем через некоторое время выдает вот эти самые строки - $10d$10, что-то в этом роде. Если передаю небольшой буфер, модем вроде "квакает" что-то. Если передаю большой буфер, например 10000 байт, функция writefile виснет. В общем, буду благодарен, если кто-нибудь знает, как передавать голосовые данные модему. |
Сообщ.
#8
,
|
|
|
Prince
Вопрос:"А голосовые данные откуда берешь???" Цитата Prince @ Если передаю небольшой буфер, модем вроде "квакает" что-то. Если передаю большой буфер, например 10000 байт, функция writefile виснет. А чтобы не было зависаний перейди на асинхронный режим работы с портом и периодически проверяй Overlap.Event,которая привязана к writefile, только Event с ручным сбросом. После того как модем выдаст тебе CONNECT проверяй событие порта EV_RLSD (связь модемов установлена), и только при наступлении этого события можно начинать работу с данными, ну а какой будет протокол решать тебе. ![]() |
Сообщ.
#9
,
|
|
|
Так у меня ведь связь не с модемом, а с телефоном устанавливается. Или без разницы? С асинхронным режимом я пока не разобрался. Мне бы пока хоть с синхронным. А данные пытаюсь передавать из wav файла. Протокол(формат) 8000 Гц 4 бита ADPCM(вроде бы). Но как их передавать, эти данные. Есть там, видимо, какой-то секрет, а какой?
|
Сообщ.
#10
,
|
|
|
Prince
Цитата Prince @ Так у меня ведь связь не с модемом, а с телефоном устанавливается. Или без разницы? Так бы и сказал. Разница есть, даже очень. Большая проблема узнать момент снятия трубки на том конце. И сразу вопрос Цитата Prince @ А данные пытаюсь передавать из wav файла. А на том конце у человека звуковуха в ухе, что ли???? Или ты пытаешьсяпроиграть данные в линию со звуковухи. Это вообще то совсем другой коленкор |
Сообщ.
#11
,
|
|
|
Цитата Или ты пытаешьсяпроиграть данные в линию со звуковухи. Это вообще то совсем другой коленкор Ну да, пытаюсь. Только не со звуковухи, а из файла. А как по другому это сделать? |
Сообщ.
#12
,
|
|
|
Цитата Prince @ Ну да, пытаюсь. Только не со звуковухи, а из файла Поясни как ты файл звука превратишь в аналог ![]() |
Сообщ.
#13
,
|
|
|
Это модем занимается переводом в аналог. Я ему передаю команду AT#VTX, и он переходит в режим передачи голосовых данных, возвращая СONNECT. Дальше, по идее, я ему сливаю звуковой поток, а кодек модема(модем голосовой) переводит этот поток в аналог. Вот с этим и проблема. В конце звукового потока я передаю модему 2 байта - $10 $18. Модем снова переходит в командный режим и в ответ выдаёт VCON(см. лог выше). Вот примерно так. Ну а дальше снова можно испоьлзовать обычные AT-команды.
|
Сообщ.
#14
,
|
|
|
PrinceИзвини уж неугомонного, но:
Цитата Prince @ я ему сливаю звуковой поток, а кодек модема(модем голосовой) переводит этот поток в аналог. Вот с этим и проблема. Сливаешь ему просто Wav файл???Или же чистые данные??? Цитата Prince @ Протокол(формат) 8000 Гц 4 бита ADPCM(вроде бы). Но как их передавать, эти данные Вроде бы тут не прокатит А ты пробовал Wav файл проиграть на чем нибудь с таким форматом??? ![]() ![]() ![]() сжатие ADPCM: (Частота выборки) предлагаются следующие значения: 5 кГц - приемлем только для речи; 11 кГц - самое низкое рекомендуемое качество для короткого музыкального фрагмента; четверть стандартного значения качества CD (компакт-диска); Что то непонятка какая-то с протоколами сжатия:wacko: ![]() |
Сообщ.
#15
,
|
|
|
Сливаю чистые данные формата ADPCM, моно, 8000 Гц, 4 бита без заголовка, естественно.
Этот формат поддерживается модемом. Кроие того, он поддерживает частоты 7200Гц и 11025 Гц. И еще 2 и 8 бит. Вообще модемы могут поддерживать PCM, ADPCM, и GSM6.10 в зависимости от производителя и модели. Проиграть файл можно хотя бы универсальным проигрывателем или медиа-плеером. У меня проблема с передачей звуковых данных. Есть много ньюансов. Оказывается, есть там всякие управляющие коды и нужен аппаратный контроль данных, чтобы не было переполнения буфера(вот только-только прочитал). Как организовать аппаратный контроль данных? А, вот ещё какая штука. Оказывается, строки $10 d , которые модем возвращал, это признак обнаружения сигнала КПВ(контроль посылки вызова). Видел несколько тем, люди справшивали, как определить, когда на удаленном конце сняли трубку. Ну вот видимо, таким способом можно. |