serielle Schnittstelle mit VC++ 7



  • Hallo!

    Ich baue für einen Cockpitsimulator ein Bussystem auf, dass die Elektronik mit dem PC verknüpft. Die Kommunikation mit dem PC erfolgt über die serielle Schnittstelle.

    Der PC sendet 3 Byte aus (1 Adressbyte und 2 Befehlsbyte). Diese werden von der Elektronik verarbeitet und es werden 2 Byte zurückgeschickt. Die Elektronik funktioniert einwandfrei.
    Baudrate ist 38400, keine Parität, ein Stoppbyte und Bytegröße = 8 Bit
    Eine solche Kommunikation tritt ca. alle 20 ms ein.

    Zu meinem Problem: Das ganze funktioniert einige Mituten lang perfekt. Dann jedoch hängt sich das Programm auf und wartet auf ein Antwortbyte (das aber auf jeden Fall gesendet wurde -> mit Digitaloszi nachgemessen).

    Die folgende Funktion wird alle 20 ms aufgerufen. Findet hier jemand einen Fehler, woran das liegen könnte?

    unsigned char* get_data(unsigned char *input)
    {
    unsigned char *data;
    LPDWORD dwBytesWritten = new DWORD;
    LPOVERLAPPED ov = new OVERLAPPED;
    DWORD dwEvtMask;
    char buffer[20];
    DCB dcb;
    dcb.DCBlength = sizeof(DCB);
    dcb.BaudRate = 38400;
    dcb.ByteSize = 8;
    dcb.Parity = 0;
    dcb.StopBits = ONESTOPBIT;

    data = (unsigned char*)malloc(3 * sizeof(unsigned char));
    data[0] = 0x31; // Adressbyte
    data[1] = (unsigned char)*input; // erstes Befehlsbyte
    data[2] = 0x33; // zweites Befehlsbyte

    HANDLE m_hCommPort = CreateFile("COM1",
    GENERIC_READ|GENERIC_WRITE,//access ( read and write)
    0, //(share) 0:cannot share the COM port
    0, //security (None)
    OPEN_EXISTING,// creation : open_existing
    FILE_ATTRIBUTE_NORMAL,// we want overlapped operation
    0// no templates file for COM port...
    );

    SetCommState(&m_hCommPort,&dcb);

    // Senden der Daten ...
    WriteFile(m_hCommPort,data,3,dwBytesWritten ,NULL);

    SetCommMask (m_hCommPort, EV_RXCHAR);

    // Empfangen des ersten Antwortbytes
    WaitCommEvent (m_hCommPort, &dwEvtMask, 0);
    ReadFile(m_hCommPort,&data[0],1,dwBytesWritten,NULL);

    // Empfangen des zweiten Antwortbytes
    WaitCommEvent (m_hCommPort, &dwEvtMask, 0);
    ReadFile(m_hCommPort,&data[1],1,dwBytesWritten,NULL);

    CloseHandle(m_hCommPort);
    return data;
    }

    Ich wäre für eine helfende Antwort wirklich dankbar, da dies für ein Projekt ist, dass Mitte Januar funktionieren muss ... Ich hätte nicht gedacht, dass es hier zu einem Problem kommt ...

    Vielen Dank & viele Grüße
    Steffen



  • Alle 20 ms ? Kommt darauf an wie du die Funktion aufrufts und welches BS du verwendest.
    Weiters solltest du daran arbeiten nicht jedesmal den COM-Port zu öffnen. Dauert viele zu lange.



  • Hallo!

    Danke für deine Antwort.

    Ich verwende im Moment Win 2k, es muss aber auch unbedingt auf Win XP laufen (da XP das OS des Cockpitsimulators ist).

    Die Funktion wird ganz einfach aufgerufen:
    data = get_data(&temp); // wobei Data ein unsigned Char[3] ist und temp ein unsigned Char

    Alle 20 ms muss sein, damit die Ansteuerung der Elektronik mit einer akzeptablen Framerate durchfürbar ist. Probehalber habe ich auch die Funktion nur alle 100 ms aufrufen lassen, sowie die Baudrate auf 9600 runtergedreht. Ergebnis war aber das selbe ...

    Das Öffnen des Comports werde ich abändern ....

    Was nun ?!?

    Grüße
    Steffen



  • Ich habe evtl. eine Möglichkeit gefunden. Ich möchte die Übertragung mit der DTR Leitung synkronisieren.

    Kann mir jemand ein Beispiel posten, wie man die DTR Leitung auf high / low setzt?

    Wäre echt super!
    Grüße
    Steffen



  • Hallo,
    Du solltest Dir mal folgendes durchlesen:

    http://codeproject.com/system/serial_com.asp

    Das mit dem Event-gesteuerten Vom-COM-Port-Lesen funktioniert ein bisschen anders.


Log in to reply