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);
}