26. oktober 2002 - 12:47
Der er
5 kommentarer og
1 løsning
seriel port ( codeguru )
Hejsa,
Er der nogen der kan hjælpe mig med en funktion til en consol apl. der kan læse en seriel port.
Jeg ved at der findes en seriel class fra codeguru ( der den ) men jeg ved ikke hvordan jeg kan omskrive den. Dertil er jeg for ny i c++.
Formålet med den er at se om noget elektronik jeg har lavet ( a/d converter ) overhovedet giver et output.
05. november 2002 - 23:10
#2
her er koden til en klasse, hvor du kan få adgang til din comport
håber det er en hjælp
til header:
-------------------------------------------------------------------------------
class serialCom {
public:
bool open(int port,int baud,int dataBit,int paritet,int stopBit);
bool close();
bool send(char *sendPtr,int antal);
int recive(char *rxPtr);
int inWatingBuffer();
char reciveOneChar();
private:
HANDLE HComdev; //Def af handle til pc
DWORD dwErrorFlags;
COMSTAT ComStat;
DCB dcb; //Def af variabel til DCB structen
};
til cpp sil
-------------------------------------------------------------------------------
//*************************************************************************
bool serialCom::open(int port,int baud,int dataBit,int paritet,int stopBit)
// Åben en seriel port for kommunikation.
// Input:
// port : Comport nummer 1 eller 2
// baud : Hastigheden for komnikationen 9600,19200 eller 38400
// dataBit : Antal bit pr byte 7 eller 8
// paritet : Paritets check 0 = no paritet 1 = ulige 2 = lige
// stopBit : Antallet af stop bit 1 eller 2
// Output:
// retunere true : Hvis porten kunne åbnes
// retunere false : Hvis porten ikke kunne åbnes. Når der retuneres false skyldes
// det ofte at et andet program bruger den serielle port
//*************************************************************************
{
char portstr[5] = "COM ";
portstr[3] = 48 + port ;
HComdev = CreateFile(portstr, //Navnet på den port der skal åbnes(COMX)
GENERIC_READ | GENERIC_WRITE, //read / write types
NULL,
0,
OPEN_EXISTING,
0,
0);
if (HComdev == INVALID_HANDLE_VALUE)
return false;
else
{
//sæt hastighed mm op
GetCommState(HComdev,&dcb);
dcb.DCBlength = sizeof(DCB);
//set baud rate
if (baud == 9600)
dcb.BaudRate = CBR_9600;
else
if (baud == 19200)
dcb.BaudRate = CBR_19200;
else
if (baud == 38400)
dcb.BaudRate = CBR_38400;
else
return false;
// set databit
if (dataBit == 7 || dataBit == 8)
dcb.ByteSize = dataBit;
else
return false;
//set paritet
if (paritet >= 0 && paritet <= 2)
dcb.Parity = paritet;
else
return false;
if (stopBit == 1)
dcb.StopBits = ONESTOPBIT;
else
if (stopBit == 2)
dcb.StopBits = TWOSTOPBITS;
else
return false;
SetCommState(HComdev,&dcb);
return true;
}
}
//******************************************
bool serialCom::close()
// luk forbindelsen
// reunere true hvis luk gik godt ellers false
//******************************************
{
if (CloseHandle(HComdev))
return true;
else
return false;
}
//*************************************************
bool serialCom::send(char *sendPtr,int antal)
// send et antal karaktere på en seriel port.
// Husk porten skal være åben inden send kan bruges
// Input:
// *sendPtr : Er en pointer til den char string der skal sendes
// antal : Er det antal char der skal sendes
// Output:
// retunere true : Hvis afsendels gik godt
// retunere false : Hvis der ikke blev sendt noget. Når der retuneres false skyldes
// det ofte at porten ikke er åbnet
//*************************************************
{
DWORD dwBytesWritten;
if (WriteFile(HComdev,sendPtr,antal,&dwBytesWritten,0))
return true ;
else
return false;
}
//*************************************************
int serialCom::inWatingBuffer()
//Undersøg antallet af karaktere der er i receive buffer
// Husk porten skal være åben inden send kan bruges
// Output:
// retunere antallet af karaktere der er klar i recive buffer
//*************************************************
{
ClearCommError(HComdev, &dwErrorFlags, &ComStat );
return ComStat.cbInQue ;
}
//*************************************************
int serialCom::recive(char *rxPtr)
// Henter de karaktere der er i receive buffer. Bemærk hvis der ingen karaktere
// er i recive buffer vil funktionen først retunere når der kommer en karakter i
// recive bufferen
// Input:
// *rxPtr : En pointer til en char array hvor data skal placeres
// Output:
// Retunere det antal karaktere der er overført til rxPtr
//*************************************************
{
DWORD byteRead,dwBytesRead;
dwBytesRead = inWatingBuffer();
ReadFile(HComdev,rxPtr,dwBytesRead,&byteRead,0);
return byteRead;
}
//*************************************************
char serialCom::reciveOneChar()
//læser 1 karakter fra receive buffer. Bemærk hvis der ingen karaktere
// er i recive buffer vil funktionen først retunere når der kommer en karakter i
// recive bufferen
//Output
// Retunere den læste karakter.
//*************************************************
{
char rxBuf[1];
DWORD byteRead;
ReadFile(HComdev,rxBuf,1,&byteRead,0);
return rxBuf[0];
}
07. november 2002 - 12:45
#3
herman01753 >> FEDT - Har du evt. noget tilsvarende til LPT-porten - jeg har behov for direkte at kommunikere med den, da jeg har lavet min egen printerstyring. (Specialprinter m/cutter og kasseskuffe udskydning.)