Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > асинхронный режим com port


Автор: Annuta 16.12.2006, 16:12
Добрый вечер!
  Я пытаюсь написать прогу для работы с ком портом в асинхронном режиме, вот навояла код
Код

/ Com_ProjectDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Com_Project.h"
#include "Com_ProjectDlg.h"
#include ".\com_projectdlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CCom_ProjectDlg dialog



CCom_ProjectDlg::CCom_ProjectDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CCom_ProjectDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCom_ProjectDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, n_com);
    DDX_Control(pDX, IDC_EDIT2, m_ed);
}

BEGIN_MESSAGE_MAP(CCom_ProjectDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
END_MESSAGE_MAP()


// CCom_ProjectDlg message handlers

BOOL CCom_ProjectDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

 


Автор: Mad 16.12.2006, 16:35
Annuta, а кто будет настраивать com ?
теперь по коду

Цитата(Annuta @  16.12.2006,  15:12 Найти цитируемый пост)
            if(WaitCommEvent(hCommPort,&dwEvtMask,&ov))    
            {    
     
        if(WaitForSingleObject(ov.hEvent,INFINITE) == WAIT_OBJECT_0)

Цитата(MSDN)
If the overlapped operation cannot be completed immediately, the function returns FALSE and the GetLastError function returns ERROR_IO_PENDING, indicating that the operation is executing in the background. When this happens, the system sets the hEvent member of the OVERLAPPED structure to the not-signaled state before WaitCommEvent returns, and then it sets it to the signaled state when one of the specified events or an error occurs. The calling process can use one of the wait functions to determine the event object's state and then use the GetOverlappedResult function to determine the results of the WaitCommEvent operation. GetOverlappedResult reports the success or failure of the operation, and the variable pointed to by the lpEvtMask parameter is set to indicate the event that occurred.

т.е код жолжен быть таким
Код

if(!WaitCommEvent(hCommPort,&dwEvtMask,&ov))    
{    
    GetOverlappedResult(hCommPort, &ov, &dwEvtMask, TRUE);
}
  
if (dwEvtMask & EV_RXCHAR)    
{    
     s="Go!!!";    
}    
if (dwEvtMask & EV_CTS)    
{    
     s="Stop!!!";    
}

Автор: witex 16.12.2006, 16:41
в упор не вижу настройки структуры DCB.
И код не понтяно, воспользуйся тегом код. 

Автор: Annuta 16.12.2006, 16:56
...вот код 
Код

#include "stdafx.h"
#include "Com_Project.h"
#include "Com_ProjectDlg.h"
#include ".\com_projectdlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CCom_ProjectDlg dialog



CCom_ProjectDlg::CCom_ProjectDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CCom_ProjectDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCom_ProjectDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, n_com);
    DDX_Control(pDX, IDC_EDIT2, m_ed);
}

BEGIN_MESSAGE_MAP(CCom_ProjectDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
END_MESSAGE_MAP()


// CCom_ProjectDlg message handlers

BOOL CCom_ProjectDlg::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_ABOU


Автор: Mad 16.12.2006, 17:05
Цитата(Annuta @  16.12.2006,  15:56 Найти цитируемый пост)
Посл того как я весла в код рекомендуемы измеения, прога после коннекта с портом просто виснет, так как выполяется .. if(!WaitCommEvent(hCommPort,&dwEvtMask,&ov)) 

правильно, WaitCommEvent возвращает FALSE, и прога содиться на блок тут GetOverlappedResult(hCommPort, &ov, &dwEvtMask, TRUE);

если у тебя есть реальное общение по порту (т.е в порт щас что-то передаеться), и с блока не сходит, значит порт просто не настроен (скорость, битность и т.д)
для настройки надо 
Код

GetCommState(hCom, &dcb);
// Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit.

dcb.BaudRate = CBR_57600;     // set the baud rate
dcb.ByteSize = 8;             // data size, xmit, and rcv
dcb.Parity = NOPARITY;        // no parity bit
dcb.StopBits = ONESTOPBIT;    // one stop bit

SetCommState(hCom, &dcb);

Автор: witex 16.12.2006, 17:15
закрывающий тег [/code]  поставь! а тоже самое что написано в первом посте!.

Автор: Annuta 16.12.2006, 17:20
Я вписала настройки, но прга виснет сразу после коннекта... не дожидаясь инфы..! 
GetOverlappedResult(hCommPort, &ov, &dwEvtMask, TRUE);.. она не ждёт пока к ней придёт инфа! 

Автор: Mad 16.12.2006, 17:27
Попробуй так
Код

if(!WaitCommEvent(hCommPort,&dwEvtMask,&ov))     
{
    DWORD dwRet = GetLastError();
    if( ERROR_IO_PENDING == dwRet)
    {
        GetOverlappedResult(hCommPort, &ov, &dwEvtMask, TRUE);    
    }
    else
    {
        char msg[256];
        sprintf(msg, "Wait failed with error %d.\n", GetLastError());
        s = msg;
    }
}    
    
if (dwEvtMask & EV_RXCHAR)     
{     
     s="Go!!!";     
}     
if (dwEvtMask & EV_CTS)     
{     
     s="Stop!!!";     
}

и скажи что прога выдаст

Автор: Annuta 16.12.2006, 17:56
..я поставила ваш код, прога ничего не выдала - я так подозреваю потому, что я эту функцию реализую по щелчку на кнопке.... или она всё равно должна сработать ??? 

Автор: serge_mok 18.12.2006, 05:55
У меня что то с глазами или что...не вижу кода, о чём речь вообще?smile
стандартную  инициализацию диалог приложения зачем прислала?, её проверять не надо, пиши код инициализации порта
и механизм отправки/приёма данных...,а уж потом вопросы...

Автор: witex 18.12.2006, 08:53
Я  так понимаю, она сделала интрефейс, и умает,.. что он так всё красиво сделала. То просто при щелчке на кнопку будет работать с ком портом!

Автор: serge_mok 18.12.2006, 14:28
Annuta, 
Куда пропала?, код давай!...smile

Автор: takedo 19.12.2006, 12:14
Чего то вы тут совсем крутые как со стороны то посмотреть... Сами то давно ли отвыкли спрашивать типа: "У меня вирус, какой-то Генерал Файлюре его возглавляет" smile Девочка пробует, нифига не знает, но думала, что здесь не злые прогеры сидят, вот и обратилась.
Кому интересно, вот здесь офуенно много для начала есть информации по программированию, и в частности по ком порту:
Чего то вы тут совсем крутые как со стороны то посмотреть... Сами то давно ли отвыкли спрашивать типа: "У меня вирус, какой-то Генерал Файлюре его возглавляет" smile Девочка пробует, нифига не знает, но думала, что здесь не злые прогеры сидят, вот и обратилась.
Кому интересно, вот здесь офуенные есть данные по программированию, и в частности по ком порту:
http://www.realcoding.net/article/rubric/WindowsAPI

Автор: serge_mok 20.12.2006, 06:21
А я что?, я и говорю, сначала КОД ДАВАЙ!, а потом уж вопросы...smile
...никого обидеть не хотел! smile

Автор: takedo 20.12.2006, 11:47
serge_mok, да ладно, я так бы ссылку не выложил, а сейчас многие ей возможно воспользуются smile 

Автор: serge_mok 21.12.2006, 05:35
takedo, smile..

Annuta, есть возможность простым способом проверить идеологию работы порта, хоть по кнопке хоть не по кнопке, но для этого желательны подробности проекта и явка всех заинтересованных лиц..smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)