На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (6) 1 2 [3] 4 5 ... Последняя » все  ( Перейти к последнему сообщению )  
> ModBus
    ну попробуй после TrComPortBreak добавить TrComPortPurge
    Можно еще попробовать добавить небольшие паузы.
      А чему должен быть равен второй параметр TrComPortPurge?

      Перед закрытием порта я делаю Sleep(1000); - вроде бы COM-порт стал открываться, но это теперь тяжело оттестить. Не могли бы вы сказать, что дают такие паузы? (вроде бы поток должен закрываться без пауз) А то теперь увеличилось время выполнения программы, и уверенность в правильности ее работы поубавилась.
        Цитата Pauly @
        А чему должен быть равен второй параметр TrComPortPurge?
        Комбинация значений TrComPortFlushFlags

        Цитата Pauly @
        Не могли бы вы сказать, что дают такие паузы?
        Они дают системе дополнительное время на выполнение необходимых действий по закрытию порта. Напрмер на то, чтобы выплюнуть остатки в буфере передачи.
          Не пойму,где в примере ошибки, поменял здесь TPpbComPortParameters params =... на PTrComPortParameters, при компиляции выдает первую ошибку здесь-
          ExpandedWrap disabled
            CBR_9600,           // 9600 бод

          Вот код полностью:
          ExpandedWrap disabled
            #include "TrComPort.h"
            INT PortId;
            INT result;
            BYTE wr_data[] = {1,2,3,4,5,6};
            BYTE rd_buffer[16];
             
            PortId = TrComPortOpen(0);// COM1
            if( TRCOM_SUCCEEDED(PortId) ) {
               // порт открыт - устанавливаем параметры соединения
               PTrComPortParameters params = {tcpmpBaudRate|tcpmpDefaultTimeout|tcpmpByteSize|tcpmpStopBits|tcpmpCheckParity|tcpmpParity|tcpmpEnableRtsControl|tcpmpEnableDtrControl,
                                               CBR_9600,           // 9600 бод
                                               5000,               // по умолчанию тайм-аут 5 с.
                                               8,                  // 8 бит
                                               ONESTOPBIT,         // 1 стоп-бит
                                               0,                  // без проверки четности
                                               NOPARITY,           // без бита четности
                                               RTS_CONTROL_DISABLE,// изначально RTS-off
                                               DTR_CONTROL_ENABLE};// изначально DTR-on
               result = TrComPortSetConfig(PortId,&params);
               if( TRCOM_SUCCEEDED(result) ) {
                  // параметры заданы - устанавливаем управляющие сигналы(DTR-on, RTS-off)
                  result = TrComPortSetControl(PortId, pcpscfSetDtr|pcpscfClearRts);
                  if( TRCOM_SUCCEEDED(result) ) {
                     // управляющие согналы установлены - передаем и принимаем данные
                     // передаем 6 байт, принимаем 1 байт, тайм-аут - 1 с.
                     result = TrComPortWriteAndRead(PortId, wr_data, 6, rd_buffer, 1, 1000);
                     if( TRCOM_SUCCEEDED(result) ) {
                        // что-нибудь делаем далее
                     }
                  }
               }
               // т.к. порт больше не нужен, закрываем его
               result = TrComPortClose(PortId);
            }
            Должно быть не PTrComPortParameters, а TrComPortParameters
              Еще была ошибка здесь- result = TrComPortSetControl(PortId, pcpscfSetDtr|pcpscfClearRts); , нужно- tcpscfSetDtr|tcpscfClearRts...

              Но все равно ошибки выдает-такие:

              [Linker Error] Unresolved external 'TrComPortOpen' referenced from D:\COMPORT\COMPORT.OBJ
              [Linker Error] Unresolved external 'TrComPortSetConfig' referenced from D:\COMPORT\COMPORT.OBJ
              [Linker Error] Unresolved external 'TrComPortSetControl' referenced from D:\COMPORT\COMPORT.OBJ
              [Linker Error] Unresolved external 'TrComPortWriteAndRead' referenced from D:\COMPORT\COMPORT.OBJ
              [Linker Error] Unresolved external 'TrComPortClose' referenced from D:\COMPORT\COMPORT.OBJ

              Не подскажете, в чем дело ?
              Сообщение отредактировано: dvb -
                Библиотеку надо к проекту подключить
                  Подскажите, как подключить dll к проекту-я совсем начинающий, пробовал через add to proekt - такие же ошибки, пробовал добавлять lib файлы- тоже ошибка,но другая.
                    Add to project -> расширение ".LIB", выбрать TrComPort_BCB.lib, нажать Ok

                    P.S. Интересно, я один такой устаревший - сначала читаю литературу, потом делаю.
                      Вот спасибо,заработало, я пробовал подключать оба lib-а, а надо оказывается только этот.
                        С этим компонентом разобрался, сейчас мучаю модем Моторолы, который по USB соединен к компу, драйвером создается виртуальный порт СОМ3. По АТ командам все работает нормально, когда вот так-
                        ExpandedWrap disabled
                          #include <vcl.h>
                          #pragma hdrstop
                           
                          #include "COMPORT.h"
                          #include "TrComPort.h"
                          //---------------------------------------------------------------------------
                          #pragma package(smart_init)
                          #pragma resource "*.dfm"
                          TForm1 *Form1;
                           
                          //---------------------------------------------------------------------------
                          __fastcall TForm1::TForm1(TComponent* Owner)
                                  : TForm(Owner)
                          {
                            int PortId;
                            int result;
                           
                           char end[] = {"at+ckpd=\"e\"\r"};   // завершить вызов
                           char nabor_nomera[] = {"at+ckpd=\"89123456789\"|at+ckpd=\"s\"\r"}; // набрать номер и звонить
                           char zvonit[] = {"at+ckpd=\"s\"\r"};  // звонить(зеленая кнопка телефона)
                           
                          PortId = TrComPortOpen(2);    // COM3
                           
                          if( TRCOM_SUCCEEDED(PortId) ) {
                             // порт открыт - устанавливаем параметры соединения
                             TrComPortParameters params = {tcpmpBaudRate|tcpmpDefaultTimeout|tcpmpByteSize|tcpmpStopBits|tcpmpCheckParity|tcpmpParity|tcpmpEnableRtsControl|tcpmpEnableDtrControl,
                                                             CBR_9600,           // 9600 бод
                                                             5000,               // по умолчанию тайм-аут 5 с.
                                                             8,                  // 8 бит
                                                             ONESTOPBIT,         // 1 стоп-бит
                                                             0,                  // без проверки четности
                                                             NOPARITY,           // без бита четности
                                                             RTS_CONTROL_DISABLE,// изначально RTS-off
                                                             DTR_CONTROL_ENABLE};// изначально DTR-on
                             result = TrComPortSetConfig(PortId,&params);
                           
                          result = TrComPortSetControl(PortId, tcpscfSetDtr|tcpscfClearRts);
                           
                                TrComPortWriteArray(PortId, end, 20, 1000); // Прервать вызов
                                TrComPortWriteArray(PortId, nabor_nomera, 35, 1000); // Набрать номер
                                Sleep(1000);    // пробовал с паузой и без
                                TrComPortWriteArray(PortId, zvonit, 15, 1000);
                                
                                Sleep(3000);    // пауза
                           
                                TrComPortWriteArray(PortId, end, 20, 1000); // Прервать вызов
                          }
                          }
                          }


                        Когда устанавливаю на форму таймер, чтобы пробовать делать дозвон через определенное время, и переменные выношу за кавычки формы и кусок кода вставляю в обработчик таймера, то уже все работает неправильно- уже набор номера не работает. Знаю это к этой теме не относится, скорее к азам программирования, но т.к. вопрос связан с этим компонентом-задаю здесь. Вот нерабочий код-
                        ExpandedWrap disabled
                          #pragma hdrstop
                           
                          #include "COMPORT.h"
                          #include "TrComPort.h"
                          //---------------------------------------------------------------------------
                          #pragma package(smart_init)
                          #pragma resource "*.dfm"
                          TForm1 *Form1;
                           
                            int PortId;
                            int result;
                           
                           char end[] = {"at+ckpd=\"e\"\r"};   // завершить вызов
                           char nabor_nomera[] = {"at+ckpd=\"89123456789\"|at+ckpd=\"s\"\r"}; // набрать номер и звонить
                           char zvonit[] = {"at+ckpd=\"s\"\r"};  // звонить(зеленая кнопка телефона)
                           
                          //---------------------------------------------------------------------------
                          __fastcall TForm1::TForm1(TComponent* Owner)
                                  : TForm(Owner)
                          {
                           
                          PortId = TrComPortOpen(2);    // COM3
                           
                          if( TRCOM_SUCCEEDED(PortId) ) {
                             // порт открыт - устанавливаем параметры соединения
                             TrComPortParameters params = {tcpmpBaudRate|tcpmpDefaultTimeout|    tcpmpByteSize|tcpmpStopBits|tcpmpCheckParity|tcpmpParity|tcpmpEnableRtsControl|tcpmpEnableDtrControl,
                                                             CBR_9600,           // 9600 бод
                                                             5000,               // по умолчанию тайм-аут 5 с.
                                                             8,                  // 8 бит
                                                             ONESTOPBIT,         // 1 стоп-бит
                                                             0,                  // без проверки четности
                                                             NOPARITY,           // без бита четности
                                                             RTS_CONTROL_DISABLE,// изначально RTS-off
                                                             DTR_CONTROL_ENABLE};// изначально DTR-on
                             result = TrComPortSetConfig(PortId,&params);
                           
                           result = TrComPortSetControl(PortId, tcpscfSetDtr|tcpscfClearRts);
                           
                                 Timer1->Interval=10000;
                                 Timer1->Enabled=true;
                          }
                           
                           void __fastcall TForm1::Timer1Timer(TObject *Sender)
                          {
                           
                                TrComPortWriteArray(PortId, end, 20, 1000); // Прервать вызов
                                TrComPortWriteArray(PortId, nabor_nomera, 35, 1000); // Набрать номер
                                Sleep(1000);    // пауза
                                TrComPortWriteArray(PortId, zvonit, 15, 1000);
                              
                                Sleep(3000);    // пауза
                           
                                TrComPortWriteArray(PortId, end, 20, 1000); // Прервать вызов
                           }

                        Прошу обьяснить, что здесь не так.
                          к проблеме это скорее всего не относится, но правильнее писать
                          TrComPortWriteArray(PortId, end, sizeof(end)-1, 1000);

                          Добавлено
                          А вообще - модем вообще-то должен отвечать на команды. Вот ответы и надо смотреть.
                            Да нет,относится,сделал так-и заработало,еще раз огромное спасибо!
                              В моем примере выше,где char nabor nomera, как можно внутрь кавычек АТ команды, вместо номера телефона поставить переменную?
                              Сообщение отредактировано: dvb -
                                sprintf юный падован использовать должен.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0467 ]   [ 16 queries used ]   [ Generated: 28.04.24, 08:24 GMT ]