Nåja, for 200 points skal jeg jo også lave alt arbejdet? ;) Det er faktisk uhyre simpelt at bruge. Fx hvis man vil skrive til LPT-porten, så skal man bare starte porttalk op og så bruge outp(0x378, 0xFF); fx. Der følger eksempler med hvis du downloader det.
Hvis du er så heldig at køre Windows og har en rimelig compiler (f.eks cygwin, borland) kan du "åbne" com-porten med CreateFile(), derefter kan du læse og skrive til com-porten som om det var en fil (ReadFile() og WriteFile()).
Jeg bruger MVC som compiler....... og bruger windows 2000 (programmet skal oss virke til XP)
bertelbrander din løsning lyder god. Vil du ikke forklarer lidt nærmere evt give et eksempel... Det optimale ville være hvis du kan hjælpe mig frem til et 3,5v signal men det er ik noget krav :)
Dette har jeg brugt på min Win98 lavet i med Borland
Programmet henter data fra serialporten men der er også funktion til at sende data.
#include <iostream.h> #include <conio.h>
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 };
//------------------------------------------------------------------------------- //************************************************************************* 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;
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 //************************************************* {
//************************************************* 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. //************************************************* {
Nej opdagede lige at du ikke arbejdede med win98 Det er noget mere kompliceret med 2000 og XP mens der med win98 ikke er nogen problemer med tilgang til comporten
Ellers er der dette program fra et tidliger spørgsmål på eksperten, har dog ikke fået det til at fungere. http://www.eksperten.dk/spm/305759
Ja, jeg installerede win98 på min gamle bærbar og så har jeg tilsluttet en PLC til min comport. plc'en udsender så et signal som mit C++ program opfanger og udskriver data på skærmen.
jeg har messenger mickni33@hotmail.com men jeg er ikke så tit på for tiden da jeg i øjeblikket er i gang med en adgangseksamen til Elektronik Ingeniør og ikke har internet hjemme (pga min SU) :-) Men hvis du for det til at virke på win 2000/XP så må du meget gerne sige til
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.