Forum: PC-Programmierung Nachricht von Serieller Schnittstelle


von Björn B. (Gast)


Lesenswert?

Hallo,
hab da mal ne Frage!
Ich programmiere grade ein Windows Fenster mit dem ich die serielle
Schnittstelle bedienen kann. Hab mir dazu eine fertige Klasse im Netz
besorgt. Die funktioniert an sich auch schon. Das problem ist nur: wenn
ich Daten aus dem Buffer auslesen will brauche ich ja vorher eine
Nachricht von Windows, das Date in den Buffer geschrieben wurden.
Gibt es da schon eine Nachricht in Win.h und wenn ja wie heißt die oder
welche Nummer hat sie. Falls nicht wie kann ich mir in Visual C++ selbst
so eine Nachricht erzeugen?

Gruß B.

von arc (Gast)


Lesenswert?

WaitCommEvent (oder CreateEvent + WaitCommEvent wenn
FILE_FLAG_OVERLAPPED verwendet wird). Eine andere Möglichkeit wäre
z.B., mit SetCommTimeouts die Timeouts beim Lesen auszuschalten und
dann regelmäßig (Timer, Thread) mit ReadFile abzufragen, ob Daten
angekommen sind.

von Björn B. (Gast)


Lesenswert?

Ok WaitCommEvent hab ich gefunden. Ist aber keine Nachricht sondern
sdtcall.
Bin noch ein absoluter Anfänger, desshalb die Frage:
wie binde ich diesen Aufruf in mein Programm ein.
Hab folgendes versucht:

im Header meiner Klasse:
class CSerial
{

public:
  CSerial();
  ~CSerial();


  .....
        BOOL WaitCommEvent(HANDLE,LPDWORD,LPOVERLAPPED);
        .....

protected:
  BOOL WriteCommByte( unsigned char );

  HANDLE m_hIDComDev;
  OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
  BOOL m_bOpened;
        ........

Und in CComDlg :



.......

BOOL CSerial::WaitCommEvent(HANDLE m_hIDComDev, LPDWORD lpword,
LPOVERLAPPED m_OverlappedRead)
{

  CSerial serial;

  if (serial.Open(1, 9600))
  {
          char* lpBuffer = new char[500];
    int nBytesRead = serial.ReadData(lpBuffer, 500);
    UpdateData(TRUE);
    m_receive = lpBuffer;
    UpdateData(FALSE);
    delete []lpBuffer;
  }

  else AfxMessageBox("Failed to open port!");


  return NULL;


}

......

void CComDlg::OnButton1() // Open COMPORT

......


Funktioniert natürlich nicht! Falls jemand die zeit hat und sich die
mühe machen könnte mir das etwas genauer zu erklären wäre ich sehr
dankbar!!
Gruß B.

von Björn B. (Gast)


Lesenswert?

Ach und noch ne Frage!!!!!!

Warum kann ich den Buffer nicht mit einem standart event zb. Button
click oder so auslesen.
Das geht nur, wenn unmittelbar Daten gesendet werden.
Überschreibt Windows den Buffer nach kurzer zeit wieder mi 0000.. ?

so bis dahin schönes WE. Gruß B.

von Dominik F. (forlix) Benutzerseite


Lesenswert?


von thomas (Gast)


Lesenswert?

mit
int nBytesRead = serial.ReadData(lpBuffer, 500);
liest du ja den seriellen Buffer aus.

durch dieses auslesen wird der Buffer gelöscht.
wenn du in dem WaitCommEvent den buffer schon ausliest, dann kannst du
ihn über ein buttonevent nicht nochmal auslesen.


thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.