На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> COM-порт+модем , Порядок работы
    Здравствуйте. Не знаю, как правильно организовать передачу АТ-команд и приём ответов от модема. Как с этими СОМ-портами работать правильно?
    Открываю порт через СreateFile. Отправляю команду ATH через writefile. В ответ (readfie) вместо Ok получаю только один байт - $13.
    В общем, кто разобрался с СОМ и с модемами, отзовитесь.
      19 Connect 38400 Установлена связь на скорости 38400бит/с
      С модемом не работал, но игрался с ком мышью. Собственно ошибок не вижу.

      Решил поработать с модемом. Тав возращается не один байт, а несколько.
      Сообщение отредактировано: Pavia -
        Цитата
        Открываю порт через СreateFile. Отправляю команду ATH через writefile. В ответ (readfie) вместо Ok получаю только один байт - $13.

        Попробуй отправлять просто команду 'AT#13#10', не помню точно, но вроде на ATH модем ответ не дает. Также можешь воспользоваться моим компонентом KlientServComConnect - он как раз предназначен для работы с модемом и COM-портом.
          zubr прав, все AT команды должны заканчиваться парой CR/LF.
          Сразу предупрежу, что желательно использовать апаратный контроль потока данных. И перед каждым чтением проверять наличие байта в приемном буфере. Иначе функции чтения будут виснуть, и даже с использованием оверлеев, пока функция чтения не вернется, писать в порт нельзя.

          Добавлено
          Конкретно с модемом я не работал, зато много работал с собственными устройствами по RS232 (COM).
            Цитата
            Попробуй отправлять просто команду '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? Поддерживает ли он голосовые функции? Если не получится ручками, придется, конечно, готовыми компонентами пользоваться.
            Сообщение отредактировано: Prince -
              Взять можно здесь: Klientservcomconnect. Голосовые функции не поддерживает, есть полный Help + примеры работы с ним.
                Вот результаты "исследований".
                Для обмена с модемом используется вот такая функция
                ExpandedWrap disabled
                  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;


                Дальше передаю команды

                ExpandedWrap disabled
                  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);


                в результате имею вот такой диалог
                ExpandedWrap disabled
                  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 виснет.
                В общем, буду благодарен, если кто-нибудь знает, как передавать голосовые данные модему.
                  Prince
                  Вопрос:"А голосовые данные откуда берешь???"
                  Цитата Prince @
                  Если передаю небольшой буфер, модем вроде "квакает" что-то. Если передаю большой буфер, например 10000 байт, функция writefile виснет.

                  А чтобы не было зависаний перейди на асинхронный режим работы с портом и периодически проверяй Overlap.Event,которая привязана к writefile, только Event с ручным сбросом. После того как модем выдаст тебе CONNECT
                  проверяй событие порта EV_RLSD (связь модемов установлена), и только при наступлении этого события можно начинать работу с данными, ну а какой будет протокол решать тебе. :rolleyes:
                    Так у меня ведь связь не с модемом, а с телефоном устанавливается. Или без разницы? С асинхронным режимом я пока не разобрался. Мне бы пока хоть с синхронным. А данные пытаюсь передавать из wav файла. Протокол(формат) 8000 Гц 4 бита ADPCM(вроде бы). Но как их передавать, эти данные. Есть там, видимо, какой-то секрет, а какой?
                      Prince
                      Цитата Prince @
                      Так у меня ведь связь не с модемом, а с телефоном устанавливается. Или без разницы?

                      Так бы и сказал. Разница есть, даже очень. Большая проблема узнать момент снятия трубки на том конце.
                      И сразу вопрос
                      Цитата Prince @
                      А данные пытаюсь передавать из wav файла.

                      А на том конце у человека звуковуха в ухе, что ли???? Или ты пытаешьсяпроиграть данные в линию со звуковухи. Это вообще то совсем другой коленкор
                        Цитата
                        Или ты пытаешьсяпроиграть данные в линию со звуковухи. Это вообще то совсем другой коленкор

                        Ну да, пытаюсь. Только не со звуковухи, а из файла. А как по другому это сделать?
                        Сообщение отредактировано: Prince -
                          Цитата Prince @
                          Ну да, пытаюсь. Только не со звуковухи, а из файла

                          Поясни как ты файл звука превратишь в аналог <_< Что то я не догнал
                            Это модем занимается переводом в аналог. Я ему передаю команду AT#VTX, и он переходит в режим передачи голосовых данных, возвращая СONNECT. Дальше, по идее, я ему сливаю звуковой поток, а кодек модема(модем голосовой) переводит этот поток в аналог. Вот с этим и проблема. В конце звукового потока я передаю модему 2 байта - $10 $18. Модем снова переходит в командный режим и в ответ выдаёт VCON(см. лог выше). Вот примерно так. Ну а дальше снова можно испоьлзовать обычные AT-команды.
                            Сообщение отредактировано: Prince -
                              PrinceИзвини уж неугомонного, но:
                              Цитата Prince @
                              я ему сливаю звуковой поток, а кодек модема(модем голосовой) переводит этот поток в аналог. Вот с этим и проблема.

                              Сливаешь ему просто Wav файл???Или же чистые данные???

                              Цитата Prince @
                              Протокол(формат) 8000 Гц 4 бита ADPCM(вроде бы). Но как их передавать, эти данные

                              Вроде бы тут не прокатит
                              А ты пробовал Wav файл проиграть на чем нибудь с таким форматом??? :wacko:

                              ExpandedWrap disabled
                                сжатие ADPCM:
                                (Частота выборки) предлагаются следующие значения:
                                 
                                5 кГц - приемлем только для речи;
                                11 кГц - самое низкое рекомендуемое качество для короткого музыкального фрагмента; четверть стандартного значения качества CD (компакт-диска);

                              Что то непонятка какая-то с протоколами сжатия:wacko: :wacko:
                                Сливаю чистые данные формата ADPCM, моно, 8000 Гц, 4 бита без заголовка, естественно.

                                Этот формат поддерживается модемом. Кроие того, он поддерживает частоты 7200Гц и 11025 Гц. И еще 2 и 8 бит.
                                Вообще модемы могут поддерживать PCM, ADPCM, и GSM6.10 в зависимости от производителя и модели.

                                Проиграть файл можно хотя бы универсальным проигрывателем или медиа-плеером.

                                У меня проблема с передачей звуковых данных. Есть много ньюансов. Оказывается, есть там всякие управляющие коды и нужен аппаратный контроль данных, чтобы не было переполнения буфера(вот только-только прочитал). Как организовать аппаратный контроль данных?

                                А, вот ещё какая штука. Оказывается, строки $10 d , которые модем возвращал, это признак обнаружения сигнала КПВ(контроль посылки вызова). Видел несколько тем, люди справшивали, как определить, когда на удаленном конце сняли трубку. Ну вот видимо, таким способом можно.
                                Сообщение отредактировано: Prince -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0546 ]   [ 15 queries used ]   [ Generated: 27.07.24, 09:06 GMT ]