Avatar billede gumbert Nybegynder
28. april 2003 - 18:43 Der er 15 kommentarer og
1 løsning

program -> comport

Hej eksperter

  Jeg har spurgt om detteher een gang før men opdagede senere at svarerne ikke helt kunne bruges alligevel...

  I 4bindelse med et projekt i skolen er jeg ved at frenstille et print + et program til at styre printet med.

  Meningen er at programmet skal styre printet via com-porten så nu er mit spørgsmål hvordan jeg får sendt det signal til comporten.......

  Printet bliver indrettet efter signalet så der er praktisk taget frit slav

ps. Det skal foregå i C++
Avatar billede narrr Nybegynder
28. april 2003 - 20:36 #1
Avatar billede gumbert Nybegynder
28. april 2003 - 22:10 #2
Det virker lidt svært..... :)
Avatar billede narrr Nybegynder
28. april 2003 - 22:53 #3
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.
Avatar billede bertelbrander Novice
29. april 2003 - 00:22 #4
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()).
Avatar billede gumbert Nybegynder
29. april 2003 - 08:16 #5
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 :)
Avatar billede gumbert Nybegynder
29. april 2003 - 08:27 #6
Nåhh ja og hvordan styrer man hvilket "ben eller hva man nu siger" på com-porten man sender til
Avatar billede gumbert Nybegynder
29. april 2003 - 08:33 #7
nåhh ja lige en sidste ting...
er signalet konstant eller bare et "rap"
Avatar billede mickni33 Nybegynder
29. april 2003 - 08:42 #8
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;

        //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[2];
    DWORD byteRead;

    ReadFile(HComdev,rxBuf,2,&byteRead,0);
    return rxBuf;

}

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{      char* sendptr="hej";
        char* array;
        char* x;
        int tal=0;

        serialCom* sc=new serialCom;
          if(sc->open(1,9600,7,2,1)==1)
          cout<<"er aaben :"<<endl;
          else
          cout<<"ikke aaben"<<endl;
        cout<<"antal i recive buffer :"<<sc->inWatingBuffer()<<endl;
      while(1){
          x=sc->reciveOneChar();
          if(tal==1){
          cout<<endl;
          tal=0;
          }
          cout<<x;
            tal++;
            }

        return 0;
}
Avatar billede gumbert Nybegynder
29. april 2003 - 09:11 #9
Sidder i skolen så har ik lige en compiler ved hånden...
Ville detteher virke under 2000/xp
Avatar billede mickni33 Nybegynder
29. april 2003 - 09:15 #10
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
Avatar billede gumbert Nybegynder
29. april 2003 - 09:22 #11
Arbejder du med et ligende projekt????
Avatar billede mickni33 Nybegynder
29. april 2003 - 09:26 #12
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.
Avatar billede gumbert Nybegynder
29. april 2003 - 13:51 #13
Har du msn eleer icq...
så kunne vi måske prøve at skrive lidt sammen
Avatar billede narrr Nybegynder
29. april 2003 - 16:28 #14
Eeh, jeg har jo allerede linket til porttalk. Med det kan du meget simpelt skrive til porte i winxp/2000/nt ... Jeg har gjort det.
Avatar billede gumbert Nybegynder
29. april 2003 - 17:35 #15
Jojo selvfølgelig men det var hellerik til dig narr.....
Lukker spørgsmålet og prøver....
Avatar billede mickni33 Nybegynder
30. april 2003 - 12:20 #16
<<gumbert

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester