Kurz3 - Kapitola5

17. června 2007 v 15:51 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

5.5 Třída pro práci s portem

V našem programu budeme přistupovat k jednotlivým portům počítače. Proto by pro náš účel byl vhodný nějaký jednoduchý prostředek k ovládání zvoleného portu. Knihovna MFC nenabízí odpovídající vhodnou třídu podle naší potřeby, proto si vytvoříme vlastní třídu. Objekt jejího typu, který do aplikace vložíme, nám pak vytvoří rozhraní pro práci se sériovým portem.
V hlavičkovém souboru TestCOM.h si doplňte tuto třídu:
/////////////////////////////////////////////////////
class CPort
{
HANDLE hCOM; // Handle otevreneho portu
BOOL bAvCOM; // Urcuje, je-li port dostupny
// Nastavovane parametry portu a jeho typ
// TypPortu: 0-neni, 1-IrDa?, 2-COM, 3-IrComm
int m_nBaud,m_nData,m_nParity,m_nStop,m_nTypPortu;
// Buffer pro prijem znaku
BYTE bPortBuf[1000];
public:
// Konstruktor CPort = neni dostupny port
CPort() {hCOM=INVALID_HANDLE_VALUE; bAvCOM=FALSE;
m_nBaud=0;m_nData=0;m_nParity=0;m_nStop=0;m_nTypPortu=0;}
// Funkce pro otevreni COM zadaneho cisla
void Otevreni(int nCom);
// Vraci typ otevreneho portu - viz vyse
int TypPortu() {return m_nTypPortu;}
// Nastaveni parametru portu
void SetBaud(int n) {m_nBaud=n;}
void SetData(int n) {m_nData=n;}
void SetParity(int n) {m_nParity=n;}
void SetStop(int n) {m_nStop=n;}
// Nastavi pozadovane parametry portu
BOOL SetPort();
// Funkce pro bity modemovych signalu
void SetBit(DWORD dwBit);
DWORD GetBits();
// Funkce pro prijem a vyslani dat
int JeZnak(); // Prislo neco?
TCHAR Znak(int i); // Vezmi znak ze vstupu
void Posli(TCHAR chZnak); // Posli znak na vystup
};
Třída CPort by měla být lehce srozumitelná. Členské proměnné vesměs uchovávají parametry nastavení portu. Nejdůležitější je asi hCOM, ve které je uloženo handle námi otevřeného (a tedy pouze nám přístupného) portu.
Členské funkce je možné rozdělit do 4 skupin:
  • Otevření a nastavení parametrů portu
  • Nastavování (příp. čtení) členských proměnných - parametry portu
  • Funkce pro práci s bity modemových signálů
  • Funkce pro příjem a vyslání dat
Velká část metod třídy jsou in-line funkce. Pro zbývající si ve zdrojovém souboru TestCOM.cpp přichystáme zatím prázdné funkce, které si později doplníme:
/////////////////////////////////////////
/// CPort

void CPort::Otevreni(int nCOM)
{
}

BOOL CPort::SetPort()
{
return TRUE;
}

void CPort::SetBit(DWORD dwBit)
{
}

DWORD CPort::GetBits()
{
return 0;
}

int CPort::JeZnak()
{
return 0;
}

TCHAR CPort::Znak(int i)
{
return 0;
}

void CPort::Posli(TCHAR chZnak)
{
}
Abychom vůbec mohli s portem pracovat, musíme znát odpovídající konstanty parametrů. Doplňte na úvod souboru TestCOM.cpp "tabulku" s možnými hodnotami parametrů portu. Poznamenejme, že jsem nepoužil všechny možnosti, vybral jsem nejpoužívanější z nich.
TCHAR *szCOM[]={_T("None"),_T("COM1:"),_T("COM2:"),_T("COM3:"),_T("COM4:"),_T("COM5:"),_T("COM6:")};
TCHAR *szBaud[]={_T("115200"),_T("57600"),_T("38400"),_T("19200"),_T("9600"),_T("4800"),_T("2400"),_T("1200"),_T("600"),_T("300")};
DWORD dwBaud[]={CBR_115200,CBR_57600,CBR_38400,CBR_19200,CBR_9600,CBR_4800,CBR_2400,CBR_1200,CBR_600,CBR_300};
TCHAR *szParity[]={_T("None"),_T("Even"),_T("Odd"),_T("Mark")};
BYTE byParity[]={NOPARITY,EVENPARITY,ODDPARITY,MARKPARITY};
TCHAR *szData[]={_T("8 Bits"),_T("7 Bits"),_T("6 Bits"),_T("5 Bits")};
TCHAR *szStop[]={_T("1 Bit"),_T("2 Bits")};
BYTE byStop[]={ONESTOPBIT,TWOSTOPBITS};
Na rozdíl od "velkých Windows" se sériový port otevře pomocí jména ukončeného dvojtečkou. Proto je první řádek se jmény portů ve tvaru COMx:. Další řádky připravují konstanty pro nastavení parametrů portu nebo odpovídající texty pro komunikaci s uživatelem.
Abychom mohli tuto třídu sériového portu využívat, musíme si vytvořit odpovídající objekt. Ke své aplikaci si doplňte příkaz pro nový objekt portu, takže celý program bude mít pouze 2 objekty:
CPort mujCOM;
CAplikace mojeAplikace;
Tím tento díl zakončíme. Dnešní práce byla opět přípravná. Program můžete přeložit a vyzkoušet. Proti předcházející lekci se funkčnost programu nezměnila, máme však opět vylepšenou kostru pro další práci.

Co bychom si měli z této lekce zapamatovat?

  • Nenajdeme-li v MFC vhodnou třídu, musíme si ji vytvořit sami.
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.