Поиск:

Ответ в темуСоздание новой темы Создание опроса
> СОМ порт и MFC (студии 2008), Прием данных с микроконтроллера 
:(
    Опции темы
coproral
Дата 21.12.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 6
Регистрация: 21.12.2009

Репутация: нет
Всего: нет



Всем здравствуйте! Вот такая история: передаю данные с микроконтроллера на компьютер через ком порт, в гиппер терминале все приходит, все что я хотел - я вижу. Теперь прошу Вас помочь мне реализовать прием данных через ком порт в студии 2008(MFC). Примеров мало в интернете, но есть, просто я недавно начал изучать mfc и для меня сложновато разобраться с теми примерами.
Вот на чем я остановился:  http://upload.com.ua/get/901253300/   (простите что высылаю весь проект, а не кусочки кода, мне так понятней будет)
подправьте и объясните пожалуйста. Ну и если есть готовый проект, поделитесь.
PM   Вверх
coproral
Дата 23.12.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 6
Регистрация: 21.12.2009

Репутация: нет
Всего: нет



Хорошо, задам вопрос по другому.
есть функция-
Цитата

DWORD __stdcall ReadThread(LPVOID hwnd)
{
    DWORD iSize;
    char sReceivedChar;
    while(true)
    {
  ReadFile(hCom,&sReceivedChar,1,&iSize,0);
  SendDlgItemMessage((HWND)hwnd,IDC_EDIT2,WM_CHAR,
    sReceivedChar,0);
    }
}


как добавить ее в класс?(студия 2008)
делаю по этому - http://www.canalsiderentals.com/050300.php

Это сообщение отредактировал(а) coproral - 23.12.2009, 17:34
PM   Вверх
Earnest
Дата 23.12.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



В какой класс? И зачем (чем она не устраивает тебя в том виде, в каком есть, особенно если работает)? (Извини, проектов и примеров не смотрела).


--------------------
...
PM   Вверх
coproral
Дата 23.12.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 6
Регистрация: 21.12.2009

Репутация: нет
Всего: нет



Вот именно, что не работает. Вставляю эту функцию и вылезает ошибка - hCom не принадлежит классу, хотя в заголовочном файле класса окна в Public я написал HANDLE hCom. В других функциях с hCom  все нормально. Я так думаю что надо добавить конструктор, но куда и как будет выглядеть он? Помогите мне с КОМ портом работать. Может давайте откинем то, что я делаю и предложите мне другие способы приема-передачи через КОМ порт в MFC. Я ж не против, только помогите и растолкуйте.  
PM   Вверх
jonie
Дата 24.12.2009, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

Вставляю эту функцию и вылезает ошибка - hCom не принадлежит классу, хотя в заголовочном файле класса окна в Public я написал HANDLE hCom
так у вас функция не принадлежит классу, она у вас статическая судя по тому что выше написано.
Цитата

Код

DWORD __stdcall ReadThread(LPVOID hwnd)


как я понимаю у вас это Thread обрабокти данных и вы его запускаете из некого окна (объекта класса окно).
 Ок, сделайте эту функцию friend-ом класса "окно", далее в private части "окна" объявите HANDLE hCom, после чего там же (в классе) его инициализируйте где-нибудь.
А вот в месте создания thread-а, передавайте параметром ему this, тогда внутри процедуры ReadThread вы сможете сделать так:
Цитата

DWORD __stdcall ReadThread(LPVOID lpp)
{
 CMyWindow* mywindow = reinterpret_cast<CMyWindow*>(lppp);
 HANDLE hComCopy = mywindow ->hCom;
....
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
coproral
Дата 24.12.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 6
Регистрация: 21.12.2009

Репутация: нет
Всего: нет



 smile Неа, я так не смогу. Мне надо "на пальцах" показать как это делается. Я только учусь.

PM   Вверх
jonie
Дата 24.12.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



вот на пальцах:
Код

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <process.h>

class MyWindowEmulator
{
private:
    DWORD someHandle;

protected:
    friend void WorkThreadRoutine(void*);

public:
    void ShowDialog()
    {
        someHandle = 1234;
        std::cout<<"Shown! To close press enter\r\n";

        _beginthread(WorkThreadRoutine, 0, this);

        while(!_kbhit())
        {
            Sleep(1000);
            std::cout<<"window procedure emulator step...\r\n";
        }

        someHandle = 0;
    }
};


void WorkThreadRoutine(void* p)
{
    MyWindowEmulator* wnd = reinterpret_cast<MyWindowEmulator*>(p);
    while(wnd->someHandle)
    {
        std::cout<<" ->workthread waiting...\r\n";
        Sleep(200);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyWindowEmulator().ShowDialog();
    return 0;
}


класс MyWindowEmulator эмулирует окно с его оконной процедурой.
someHandle  - хендл (я его еще использую для сигнализации о выходе).
WorkThreadRoutine - процедура работы с хендлом.

вот собственно и всё.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 25.12.2009, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 6
Всего: 50



функция потока должна быть статической


--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 25.12.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(Alca @  25.12.2009,  11:19 Найти цитируемый пост)
функция потока должна быть статической 

или дружественной. 
PM MAIL   Вверх
Alca
Дата 25.12.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 6
Всего: 50



Цитата

или дружественной. 

Дружба не есть гуд  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
jonie
Дата 25.12.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Alca, а я вот захотел дружественной чтобы была...
Мне также кажется, что в данном примере дружественность вполне приемлема - по сути своей в потоке надо только и делать что зачитать байт(-ы) и вызвать callback функцию. Делать что-то публичным мне не кажется хорошей идеей.
Внутри callback функции (она будет вызываться из потока чтения) можно эти самые байты ставить в очередь обработки (некий private threadsafe queue) и отсылать окну уведомление о наличие байт через  PostMessage.
А если байт немного (до 8-ми в мире x86), тогда можно вообще обойтись БЕЗ очереди и всяких блокировок, отсылая сразу PostMessage(this, wm_user+xxx, dword1, dword2), тем самым решается проблемы маршалинга данных. Очень удобно и ничего не торчит наружу, как в случае static функции.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 25.12.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 6
Всего: 50



Цитата

Очень удобно и ничего не торчит наружу, как в случае static функции.

А чего там торчит?


--------------------
PM WWW ICQ Skype Jabber   Вверх
coproral
Дата 25.12.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 6
Регистрация: 21.12.2009

Репутация: нет
Всего: нет



Вставил и те же ошибки.
Цитата

// COMportDlg.h : header file
//

#pragma once
#include "afxwin.h"


// CCOMportDlg dialog
class CCOMportDlg : public CDialog
{
// Construction
public:
    CCOMportDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    enum { IDD = IDD_COMPORT_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
friend DWORD __stdcall ReadThread(LPVOID hwnd);//*************************** вставил

// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    
    afx_msg void OnBnClickedOpenportbutton();
    afx_msg void OnBnClickedButton1();

    CString cbPorts;
    CListBox lLogList;
    CString hThread;
    HANDLE hCom;
    CComboBox CbPort;
};


Уважаемые программисты, неужели никто не работал с ком портом?
Помогите сделать следущее: user posted image
PM   Вверх
jonie
Дата 25.12.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Alca, будут торчать методы доступа к хендлу и функция callback например.. в моем случае вообще можно сделать чтобы ничего не торчало 8)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 25.12.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 6
Всего: 50



Цитата

Делать что-то публичным мне не кажется хорошей идеей.

Цитата

Alca, будут торчать методы доступа к хендлу и функция callback например.. в моем случае вообще можно сделать чтобы ничего не торчало 8)

торчать - это значит public или protected доступ? smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.