На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (8) 1 2 [3] 4 5 ...  7 8 все  ( Перейти к последнему сообщению )  
> Visual Studio 2008 + COM Port
    Потихоньку врубаюсь. Глубоко понять MFC - это еще не скоро. Создал пустой проект с названием MFCtest. В результате имеются 2 файла типа CMFCtest.cpp MFCtestDlg.cpp
    Пока пытаюсь тупо перенести код из Builder6 в файл типа CMFCtest.cpp .Глобальные переменные и функции разместил сразу после
    ExpandedWrap disabled
      #include "stdafx.h"
      #include "MFCtest.h"
      #include "MFCtestDlg.h"
       
      #ifdef _DEBUG
      #define new DEBUG_NEW
      #endif
    Прокатило. Дальше пытаюсь понять где находится аналог билдеровского создателя формы
    ExpandedWrap disabled
      void __fastcall TForm1::FormCreate(TObject *Sender)
    чтобы поместить туда функцию создания потока типа
    ExpandedWrap disabled
      reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL);

    Хотя читал, что MFC требует такого создателя потока reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE);
    И тем не менее подскажите please куда необходимо разместить функцию создания потока?
    Вариант размещения создателя потока так
    ExpandedWrap disabled
      ...
      // CMFCtestApp
       
      BEGIN_MESSAGE_MAP(CMFCtestApp, CWinApp)
          ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
      END_MESSAGE_MAP()
       
       
      // CMFCtestApp construction
       
      CMFCtestApp::CMFCtestApp()
      {
          // TODO: add construction code here,
          // Place all significant initialization in InitInstance
          // скорость бод по умолчанию
          BaudR =  CBR_115200;
          //reader = CreateThread( NULL, 0, ReadThread, NULL, CREATE_SUSPENDED, NULL);
          reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE);
          ::Sleep(10);
       
      }
       
       
      // The one and only CMFCtestApp object
       
      CMFCtestApp theApp;
       
       
      // CMFCtestApp initialization
       
      BOOL CMFCtestApp::InitInstance()
      {
          // InitCommonControlsEx() is required on Windows XP if an application
          // manifest specifies use of ComCtl32.dll version 6 or later to enable
          // visual styles.  Otherwise, any window creation will fail.
          INITCOMMONCONTROLSEX InitCtrls;
          InitCtrls.dwSize = sizeof(InitCtrls);
          // Set this to include all the common control classes you want to use
          // in your application.
          InitCtrls.dwICC = ICC_WIN95_CLASSES;
          InitCommonControlsEx(&InitCtrls);
       
      ...

    выдает ошибку
    ExpandedWrap disabled
      Error   1   error C2665: 'AfxBeginThread' : none of the 2 overloads could convert all the argument types
    Сообщение отредактировано: Acvarif -
      Цитата Acvarif @
      Дальше пытаюсь понять где находится аналог билдеровского создателя формы
      ExpandedWrap disabled
        void __fastcall TForm1::FormCreate(TObject *Sender)
      чтобы поместить туда функцию создания потока типа
      ExpandedWrap disabled
        reader = CreateThread( NULL, 0,ReadThread, NULL, CREATE_SUSPENDED, NULL);

      в файл MFCtestDlg.cpp можно в конструктор или вирт функцию OnInitilize

      Добавлено
      Цитата Acvarif @
      Хотя читал, что MFC требует такого создателя потока reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE);

      код который создал мастер студии вообще не трогай, чтобы там что то менять надо хорошо разбираться в MFC :D
      Сообщение отредактировано: Cfon -
        Код не трогаю. Перенес глобальные переменные и функции из CMFCtest.cpp в MFCtestDlg.cpp
        Создание потока разместил после коммента // TODO: Add extra initialization here
        ExpandedWrap disabled
          BOOL CMFCtestDlg::OnInitDialog()
          {
              CDialog::OnInitDialog();
           
              // Add "About..." menu item to system menu.
           
              // IDM_ABOUTBOX must be in the system command range.
              ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
              ASSERT(IDM_ABOUTBOX < 0xF000);
           
              CMenu* pSysMenu = GetSystemMenu(FALSE);
              if (pSysMenu != NULL)
              {
                  CString strAboutMenu;
                  strAboutMenu.LoadString(IDS_ABOUTBOX);
                  if (!strAboutMenu.IsEmpty())
                  {
                      pSysMenu->AppendMenu(MF_SEPARATOR);
                      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                  }
              }
           
              // Set the icon for this dialog.  The framework does this automatically
              //  when the application's main window is not a dialog
              SetIcon(m_hIcon, TRUE);         // Set big icon
              SetIcon(m_hIcon, FALSE);        // Set small icon
           
              // TODO: Add extra initialization here
           
              reader = AfxBeginThread(ReadThread, NULL, THREAD_PRIORITY_IDLE);
           
              return TRUE;  // return TRUE  unless you set the focus to a control
          }

        Опять ошибка
        ExpandedWrap disabled
          Error   1   error C2665: 'AfxBeginThread' : none of the 2 overloads could convert all the argument types

        Если не сложно, покажите пожалуйста в коде как сделать конструктор для ReadThread, чтобы правильно разместить его вызов в CMFCtestDlg::OnInitDialog().
          зачем AfxCreateThread? юзай CreateThread ты же её ранее вызывал.

          функция AfxBeginThread возвращет указатель на CWndThread:
          ExpandedWrap disabled
            CWndThread* pThread = AfxBeginThread(ReadThread,GetSafeHwnd(),THREAD_PRIORITY_IDLE);

          у тебя reader это HANDLE а не указатель.

          ReaderThread должен объявлен так: UINT ReaderThread(LPVOID);
          Сообщение отредактировано: Cfon -
            Спасибо.
            Поток вроде запустился, и даже COMport = CreateFile... сработал.
            Интересно есть-ли в MFC аналог билдеровского
            ExpandedWrap disabled
              Form1->Memo2->Lines->Add(stroka);

            которое работает непосредственно в функции потока чтения COM?
            Сообщение отредактировано: Acvarif -
              Цитата Acvarif @
              Интересно есть-ли в MFC аналог билдеровского
              ExpandedWrap disabled
                Form1->Memo2->Lines->Add(stroka);

              конечно есть :D
              насколько я понял Memo2 это текстовый контрол, в MFC это контрол Edit.
                Да. Нашел. Все же MFC тяжелый для пнимания. Совершенно не врубаюсь как повторить простейший билдеровский ввод текста из ComboBox1 типа
                ExpandedWrap disabled
                  Form1->ComboBox1->Text.c_str()

                Как это выглядит для MFC?
                  Цитата Acvarif @
                  Да. Нашел. Все же MFC тяжелый для пнимания. Совершенно не врубаюсь как повторить простейший билдеровский ввод текста из ComboBox1 типа
                  ExpandedWrap disabled
                    Form1->ComboBox1->Text.c_str()

                  Как это выглядит для MFC?

                  есть несколько вариантов самый простой:
                  ExpandedWrap disabled
                    SetDlgItemText(IDC_EDIT, _T("Привет мир!!!"));

                  IDC_EDIT это идентификатор эдита

                  или так
                  ExpandedWrap disabled
                    CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO);
                    pCombo->InsertString(-1, _T("Текст"));
                  Сообщение отредактировано: Cfon -
                    Спасибо. Функция SetDlgItemText рабтает. Наверняка для вывода данных в оно Edit Control тоже пойдет.
                    Очевидно я неверно задал вопрос. Имелось ввиду обратное - из окна ввода (или списка ComboBox) перенести текст, напрмер в переменную-строку типа CString com_port
                    ...
                    Спасибо. Понял. Работает.
                    Сообщение отредактировано: Acvarif -
                      получить текст можно с помощью GetDlgItemText.
                        Цитата Acvarif @
                        Потихоньку врубаюсь. Глубоко понять MFC - это еще не скоро.

                        Это довольно старая библиотека.
                        А это значит, что можно найти немало книг и статей.
                        Интересная статья
                        Хороший сайт
                          Спасибо. Тоже работает. Попытаюсь этой функцией перенести текст типа "COM1" в переменную CString com_pot, а затем в функцию
                          ExpandedWrap disabled
                            COMport = CreateFile(com_port,GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
                          которая в свою очередь находится в функции с установками порта
                          ExpandedWrap disabled
                            oid Com_Setting()
                            {
                              COMMTIMEOUTS timeouts;
                             
                            //  com_port += ComboBox1->Text;
                            //  COMport = CreateFile(L"COM1",GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
                                COMport = CreateFile(com_port,GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
                             
                              if(COMport==INVALID_HANDLE_VALUE)
                              {
                                  if(GetLastError()==ERROR_FILE_NOT_FOUND)
                                  {
                                      MessageBox(NULL,(LPCWSTR)L"serial port does not exist.",(LPCWSTR)L"",MB_OK);
                                  }
                                MessageBox(NULL,(LPCWSTR)L"serial port error",(LPCWSTR)L"", MB_OK);
                              }
                             
                              DCB dcbSerialParams = {0};
                              dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
                              if (!GetCommState(COMport, &dcbSerialParams))
                              {
                                  MessageBox(NULL,(LPCWSTR)L"getting state error\n",(LPCWSTR)L"",MB_OK);
                              }
                              dcbSerialParams.BaudRate=BaudR;
                              dcbSerialParams.ByteSize=8;
                              dcbSerialParams.StopBits=ONESTOPBIT;
                              dcbSerialParams.Parity=NOPARITY;
                              if(!SetCommState(COMport, &dcbSerialParams))
                              {
                                  MessageBox(NULL,(LPCWSTR)L"error setting serial port state\n",(LPCWSTR)L"",MB_OK);
                              }
                             
                              // Установка таймаутов.
                              timeouts.ReadIntervalTimeout = 10;        // таймаут между двумя символами
                              timeouts.ReadTotalTimeoutMultiplier = 0;  // общий таймаут операции чтения
                              timeouts.ReadTotalTimeoutConstant = 0;    // константа для общего таймаута операции чтения
                              timeouts.WriteTotalTimeoutMultiplier = 0; // общий таймаут операции записи
                              timeouts.WriteTotalTimeoutConstant = 0;   // константа для общего таймаута операции записи
                             
                              // Загрузить структуру таймаутов в порт.
                              if(!SetCommTimeouts(COMport, &timeouts))
                              {
                                // Если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния.
                                MessageBox(NULL,(LPCWSTR)L"Не удалось установить тайм-ауты\n",(LPCWSTR)L"",MB_OK);
                                return;
                              }
                             
                              // Установить размеры очередей приёма и передачи
                              SetupComm(COMport,2000,2000);
                              // Очистка буферов порта
                              PurgeComm(COMport,PURGE_RXCLEAR);
                              // очистить строку имени порта
                            //  com_port = "";
                            }
                            ну получилось? :)
                              Получается. Для проверки делаю так: По клику Button1 формирую строку типа "COM1" переношу ее в IDC_COMBO1 затем из IDC_COMBO1 извлекаюь строку в переменную str и потом вызываю функцию установок и открытия COM порта, где переменная str попадает в
                              ExpandedWrap disabled
                                COMport = CreateFile(str, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);.

                              ExpandedWrap disabled
                                void CMFCtestDlg::OnBnClickedButton1()
                                {
                                 
                                  CString strText(_T("COM1"));
                                  SetDlgItemText(IDC_COMBO1, strText);
                                 
                                    CString str;
                                  GetDlgItemText(IDC_COMBO1, str);
                                 
                                    // установки порта
                                  Com_Setting(str);
                                  // активировать поток чтения данных в порт
                                  ResumeThread(reader);
                                 
                                }

                              Порт открывается. Поток вроде запускаетс. Пока не врубаюсь как составить список в ComboBox1 типа ("COM1" "COM2" "COM3" ..)
                              Сообщение отредактировано: Acvarif -
                                Цитата Acvarif @
                                Пока не врубаюсь как составить список в ComboBox1 типа ("COM1" "COM2" "COM3" ..)

                                а что сложного?
                                ExpandedWrap disabled
                                  CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBOID);
                                  pCombo->AddString("COM1");
                                  pCombo->AddString("COM2");
                                  pCombo->AddString("COM3");
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (8) 1 2 [3] 4 5 ...  7 8 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0817 ]   [ 16 queries used ]   [ Generated: 10.05.24, 01:13 GMT ]