Понедельник, Сентябрь 21, 2020

ComPort Timer CProgressCtrl

#pragma once
#include "afxwin.h"
// OptionsCom dialog

class OptionsCom : public CDialogEx
{
    DECLARE_DYNAMIC(OptionsCom)

public:
    OptionsCom(CWnd* pParent = NULL);   // standard constructor
    virtual ~OptionsCom();

// Dialog Data
    enum { IDD = IDD_OPTIONS_COM };

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

    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    int m_NumPort;
    CComboBox m_cbComNum;
    CComboBox m_cbComSpeed;
    int m_speed;
    virtual void OnOK();
    int GetNumPort(void);
    int GetSpeed(void);
};

//////////////////////////////////////////////////////////////////////////////

// OptionsCom.cpp : implementation file
//

#include "stdafx.h"
#include "ComRichProgress.h"
#include "OptionsCom.h"
#include "afxdialogex.h"
#include "serialport.h"
int gNumPort=1;
int gSpeed=806800;
// OptionsCom dialog

IMPLEMENT_DYNAMIC(OptionsCom, CDialogEx)

OptionsCom::OptionsCom(CWnd* pParent /*=NULL*/)
    : CDialogEx(OptionsCom::IDD, pParent)
    , m_NumPort(1)
    , m_speed(806800)
{

}

OptionsCom::~OptionsCom()
{
}

void OptionsCom::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO2, m_cbComNum);
    DDX_Control(pDX, IDC_COMBO3, m_cbComSpeed);
}


BEGIN_MESSAGE_MAP(OptionsCom, CDialogEx)
END_MESSAGE_MAP()


// OptionsCom message handlers


BOOL OptionsCom::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    m_cbComNum.AddString(_T("COM1"));
    m_cbComNum.AddString(_T("COM2"));
    m_cbComNum.AddString(_T("COM3"));
    m_cbComNum.AddString(_T("COM4"));
    m_cbComNum.AddString(_T("COM5"));
    m_cbComNum.AddString(_T("COM6"));
    m_cbComNum.AddString(_T("COM7"));
    m_cbComNum.AddString(_T("COM8"));
    m_cbComNum.AddString(_T("COM9"));
    m_cbComNum.AddString(_T("COM10"));
    m_cbComNum.AddString(_T("COM11"));
    m_cbComNum.AddString(_T("COM12"));
    m_cbComNum.AddString(_T("COM13"));
    m_cbComNum.AddString(_T("COM14"));
    m_cbComNum.AddString(_T("COM15"));
    m_cbComNum.AddString(_T("COM16"));
    m_cbComNum.AddString(_T("COM17"));
    m_cbComNum.AddString(_T("COM18"));
    m_cbComNum.AddString(_T("COM19"));
    m_cbComNum.AddString(_T("COM20"));
    m_cbComNum.AddString(_T("COM21"));
    m_cbComNum.AddString(_T("COM22"));
    m_cbComNum.AddString(_T("COM23"));
    m_cbComNum.AddString(_T("COM24"));
    m_cbComNum.AddString(_T("COM25"));
    m_cbComNum.AddString(_T("COM26"));
    m_cbComNum.AddString(_T("COM27"));
    m_cbComNum.AddString(_T("COM28"));
    m_cbComNum.AddString(_T("COM29"));
    m_cbComNum.AddString(_T("COM30"));
    m_cbComNum.SetCurSel(0);

    m_cbComSpeed.AddString(_T("1200"));
    m_cbComSpeed.AddString(_T("1800"));
    m_cbComSpeed.AddString(_T("2400"));
    m_cbComSpeed.AddString(_T("4800"));
    m_cbComSpeed.AddString(_T("7200"));
    m_cbComSpeed.AddString(_T("9600"));
    m_cbComSpeed.AddString(_T("14400"));
    m_cbComSpeed.AddString(_T("19200"));
    m_cbComSpeed.AddString(_T("38400"));
    m_cbComSpeed.AddString(_T("57600"));
    m_cbComSpeed.AddString(_T("115200"));
    m_cbComSpeed.AddString(_T("230400"));
    m_cbComSpeed.AddString(_T("460800"));
    m_cbComSpeed.AddString(_T("806800"));
    m_cbComSpeed.SetCurSel(0);
    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}


void OptionsCom::OnOK()
{
    gNumPort=m_cbComNum.GetCurSel()+1;
    CString tmp;
    m_cbComSpeed.GetLBText(m_cbComSpeed.GetCurSel(),tmp);
    gSpeed=_ttoi((LPCWSTR)tmp);
    CSerialPort test;
    test.Open(gNumPort,gSpeed,CSerialPort::NoParity,8,CSerialPort::OneStopBit);
    test.Close();
    CDialogEx::OnOK();
}


int OptionsCom::GetNumPort(void)
{
    return gNumPort;
}


int OptionsCom::GetSpeed(void)
{
    return gSpeed;
}

///////////////////////////////////////////////////////////////////////////

#pragma once
#include "afxwin.h"

 


// ScanerDialog dialog

 

class ScanerDialog : public CDialogEx
{
    DECLARE_DYNAMIC(ScanerDialog)

 

public:
    ScanerDialog(CWnd* pParent = NULL);   // standard constructor
    virtual ~ScanerDialog();

 

// Dialog Data
    enum { IDD = IDD_DIALOG_SCANER };

 

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    DECLARE_MESSAGE_MAP()
private:
    // Указатель на индикатор прогресса
    CProgressCtrl   *m_pProgressCtrl;
    // Возвращаемое значение для SetTimer
    UINT_PTR        m_nTimer;
    // Счетчик запусков таймера
    unsigned int    m_nCount;
    // Максимальное число запусков таймера
    unsigned int nMaxCount;
public:
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    
    afx_msg void OnBnClickedCancel();
    afx_msg void OnBnClickedOk();
    CComboBox m_cbComboTime;
    virtual BOOL OnInitDialog();
    CListBox m_ListBox;
    int m_index;
};
UINT __cdecl ReadSerial(LPVOID pParam);
char* HexToASCII(char* sour, char* dest, int len);


 

//////////////////////////////////////////////////////////////////

// ScanerDialog.cpp : implementation file
//

 

#include "stdafx.h"
#include "ComRichProgress.h"
#include "ScanerDialog.h"
#include "afxdialogex.h"
#include <fstream>
#include <conio.h>
#include"serialport.h"
#include"OptionsCom.h"
BOOL ThreedBegin = 0;
CString fName=_T(".\\CANLOG.txt");
CSerialPort port;
std::ofstream f;
CString gString;
CEvent event(FALSE, TRUE);
OVERLAPPED overlapped;

 

// ScanerDialog dialog
IMPLEMENT_DYNAMIC(ScanerDialog, CDialogEx)

 

ScanerDialog::ScanerDialog(CWnd* pParent /*=NULL*/)
    : CDialogEx(ScanerDialog::IDD, pParent)
    , m_nTimer(0)
    , m_index(0)
{
    m_nCount=0;
    nMaxCount=100;
    
}

 

ScanerDialog::~ScanerDialog()
{
}

 

void ScanerDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, m_cbComboTime);
    DDX_Control(pDX, IDC_LIST1, m_ListBox);
}

 


BEGIN_MESSAGE_MAP(ScanerDialog, CDialogEx)
    ON_WM_TIMER()
    ON_BN_CLICKED(IDCANCEL, &ScanerDialog::OnBnClickedCancel)
    ON_BN_CLICKED(IDOK, &ScanerDialog::OnBnClickedOk)
END_MESSAGE_MAP()

 


// ScanerDialog message handlers

 


//Процесс чтения байтов из компорта
UINT ReadSerial(LPVOID pParam)
{
    char readByte[1];
    char asc[4];
    int count;
    int i=0;
    COMSTAT stat;
    while (ThreedBegin)
    {
        port.GetStatus(stat);
        //stat.cbInQue-Количество байт принято больше или равно 13
        if(stat.cbInQue>=0x0d)
        {
            i=0;
            for(count=0;count<=12;count++)
            {
                
                port.Read(readByte,1);
                HexToASCII(readByte,asc,1);
                f<<asc[0];
                f<<asc[1];
                f<<' ';
                gString.Insert(i++,asc[0]);
                gString.Insert(i++,asc[1]);
                gString.Insert(i++,' ');
                if(count==1)
                {
                    f<<' ';
                    f<<' ';
                    gString.Insert(i++,' ');
                    gString.Insert(i++,' ');
                }
                else if(count==3)
                {
                    f<<' ';
                    f<<' ';
                    gString.Insert(i++,' ');
                    gString.Insert(i++,' ');
                }
                else if(count==4)
                {
                    f<<' ';
                    f<<' ';
                    gString.Insert(i++,' ');
                    gString.Insert(i++,' ');
                }
            }
            f<<'\n';
            //gString.Insert(i++,'\n');
        }
    }
    return 0;
}

 

void ScanerDialog::OnTimer(UINT_PTR nIDEvent)
{
    if (m_nCount > nMaxCount)
    {
        // Индикатор прогресса работу закончил
        ASSERT(KillTimer(0));
        ThreedBegin = 0;
        if(f.is_open())
            f.close();
        if(port.IsOpen())
            port.Close();
        CDialogEx::OnOK();
        return afx_msg void();
    }
    //Делаем кнопки не активными
    GetDlgItem(IDCANCEL)->EnableWindow(0);
    GetDlgItem(IDOK)->EnableWindow(0);
    m_nCount++;
    // Обновляем состояние индикатора прогресса
    m_pProgressCtrl = static_cast< CProgressCtrl * >(GetDlgItem(IDC_PROGRESS1));
    m_pProgressCtrl->SetPos(m_nCount * 100 / nMaxCount);
   

//////////////////////////////////////////
    if(!gString.IsEmpty())
    {
        m_ListBox.InsertString(0,gString);
        gString.Empty();
    }
//////////////////////////////////////////


    CDialog::OnTimer(nIDEvent);
}

 


void ScanerDialog::OnBnClickedCancel()
{
    CDialogEx::OnCancel();
}

 


void ScanerDialog::OnBnClickedOk()
{
    if ((m_nCount > 0) && (m_nCount < nMaxCount))
         return afx_msg void();
     f.open(fName,std::ios::out);
     if(!f)
     {
         MessageBox(_T("Файл не создан"));
         return afx_msg void();
     }
     ZeroMemory(&overlapped, sizeof(OVERLAPPED));
     overlapped.hEvent = event;
     OptionsCom opcom;
     port.Open(opcom.GetNumPort(),opcom.GetSpeed()/*460800 921600 57600 115200 576000 691200 806800 922000,*/,
        CSerialPort::NoParity,
        8,
        CSerialPort::OneStopBit,
        CSerialPort::NoFlowControl,0);
     int num=m_cbComboTime.GetCurSel();
     switch(num)
     {
     case 0:
         nMaxCount=100;
         break;
     case 1:
         nMaxCount=200;
         break;
     case 2:
         nMaxCount=300;
         break;
     case 3:
         nMaxCount=400;
         break;
     case 4:
         nMaxCount=500;
         break;
     case 5:
         nMaxCount=600;
         break;
     default:
         nMaxCount=100;
         break;
     }
     m_nCount = 0;
     // Запускаем таймер с интервалом 0.1 секунды
     m_nTimer = SetTimer(0, 100, NULL);
     ASSERT(m_nTimer);
     ThreedBegin = 1;
     AfxBeginThread(ReadSerial, this);
}

 


BOOL ScanerDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();

 

    // TODO:  Add extra initialization here
    //m_cbComboTime.SetCurSel(1);
    m_cbComboTime.AddString(_T("1 мин."));
    m_cbComboTime.AddString(_T("2 мин."));
    m_cbComboTime.AddString(_T("3 мин."));
    m_cbComboTime.AddString(_T("4 мин."));
    m_cbComboTime.AddString(_T("5 мин."));
    m_cbComboTime.AddString(_T("6 мин."));
    m_cbComboTime.SetCurSel(0);
    //UpdateData();
    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}
char* HexToASCII(char* sour, char* dest, int len)
{
    int i;
    char tmp;
    int j=0;
    for(i=0;i<len;i++){
        tmp=((sour[i]>>4)&0x0f);
        if(tmp<=9){
            dest[j]=tmp+0x30;
        }
        else if(tmp>=0x0A && tmp<=0x0F){
            dest[j]=tmp+0x37;
        }
        j++;
        tmp=sour[i];
        tmp=tmp &= 0x0f;
        if(tmp<=9){
            dest[j]=tmp+0x30;
        }
        else if(tmp>=0x0A && tmp<=0x0F){
            dest[j]=tmp+0x37;
        }
        j++;
    }
    dest[j]='\0';
    return dest;
}


 


//////////////////////////////////////////////////////////////////////////////////

void CComRichProgressView::OnScanerDialog()
{
    ScanerDialog dlg;
    dlg.DoModal();
    CRichEditCtrl &theEdit = GetRichEditCtrl();
    CFile cFile(TEXT("CANLOG.txt"), CFile::modeRead);
    if(!cFile)
    {
        return;
    }

 

/////////////////////////////////////////////////////////////
    USES_CONVERSION;

    CHARFORMAT2W cf;
    cf.szFaceName[0] = NULL;
    cf.dwMask = CFM_FACE | CFM_CHARSET;

    cf.bCharSet = RUSSIAN_CHARSET;
    cf.bPitchAndFamily = FF_MODERN;

    theEdit.SetDefaultCharFormat(cf);
    theEdit.SetFocus ();

    
////////////////////////////////////////////////////////////////


    EDITSTREAM es;
    es.dwCookie = (DWORD)&cFile;
    es.pfnCallback = MyStreamInCallback;
    theEdit.StreamIn(SF_TEXT, es);
}





Back to Top