Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » comm port

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
20.03.2006, 19:11 Uhr
(un)wissender
Niveauwart


Das Teil funzt nicht, blockiert bei ersten Read. Schade.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
20.03.2006, 22:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi meine Recv schaut so immer aus, das klappt gut:


C++:
int CSerial::Recv(void *To, DWORD dwMax)
{
  if(!IsOpen())
    return 0;

  if(!To)
    return 0;

  DWORD dwBytesRead = 0;

  /*COMMTIMEOUTS cto;
  GetCommTimeouts(m_hCom, &cto);

  cto.ReadTotalTimeoutConstant = 0;
  cto.ReadTotalTimeoutMultiplier = 0;
  cto.ReadIntervalTimeout = MAXDWORD;

  SetCommTimeouts(m_hCom, &cto);*/


  DWORD dwError;
  COMSTAT ComStat;
  ClearCommError(m_hCom, &dwError, &ComStat);
  if(ComStat.cbInQue > 0)
  {
    if(dwMax > ComStat.cbInQue)
      dwMax = ComStat.cbInQue;
    ReadFile(m_hCom, To, dwMax, &dwBytesRead, NULL);
  }

  return dwBytesRead;
}



das liest maximal soviel Bytes wie "dwMax" bzw soviel wie aktuell im puffer.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
21.03.2006, 06:31 Uhr
(un)wissender
Niveauwart


Hm, wie sieht den IsOpen() aus?
Kann man überhaupt sowas machen wie: ich schreibe 4 Byte und lese die danach sofort wieder? Bei mir wird halt nie gelesen, immer 0 Byte.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
21.03.2006, 06:32 Uhr
(un)wissender
Niveauwart


ComStat.cbInQue ist immer 0.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
21.03.2006, 08:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


was genau machst du denn.

Write schreibt in die eine Richtung, Read liest in die andere.


Also:

Seite A - Seite B
Read <---- Write
Write ----> Read

du kannst nicht auf Seite A wieder auslesen was du auf Seite A geschrieben hast.

Ansonsten, mein Open-Befehl:

IsOpen liefert einfach nur "m_bOpen"


C++:
int CSerial::ReOpen(unsigned int uiPort, int Baud)
{
  if(uiPort == 0 || uiPort > 255)
    return -1;

  CString strPort;
  strPort.Format("COM%d", uiPort);

  Close();

  m_hCom = CreateFile(strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, /*FILE_FLAG_NO_BUFFERING|*/FILE_FLAG_WRITE_THROUGH , NULL);

  if(m_hCom == INVALID_HANDLE_VALUE)
  {
    AfxGetMainWnd()->MessageBox(GetLastError(), "ERROR", MB_OK|MB_ICONSTOP);
    return -1;
  }

  SetupComm(m_hCom, 4096, 4096);
  PurgeComm(m_hCom, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);

  if(!GetCommState(m_hCom, &m_hDCB))
  {
    AfxGetMainWnd()->MessageBox(GetLastError(), "ERROR", MB_OK|MB_ICONSTOP);
    return -1;
  }

  m_hDCB.BaudRate = Baud;
  m_hDCB.ByteSize = 8;
  m_hDCB.Parity = NOPARITY;
  m_hDCB.StopBits = ONESTOPBIT;
  m_hDCB.fDtrControl = DTR_CONTROL_ENABLE;
  m_hDCB.fRtsControl = RTS_CONTROL_ENABLE;
  m_hDCB.fInX = false;
  m_hDCB.fOutX = false;
  m_hDCB.fDsrSensitivity = false;
  m_hDCB.fAbortOnError = false;
  m_hDCB.XonLim = 100;
  m_hDCB.XoffLim = 100;

  if(!SetCommState(m_hCom, &m_hDCB))
  {
    AfxGetMainWnd()->MessageBox(GetLastError(), "ERROR", MB_OK|MB_ICONSTOP);
    return -1;
  }

  m_bOpen = true;

  m_uiPort = uiPort;

  return 0;
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
21.03.2006, 14:17 Uhr
(un)wissender
Niveauwart



Zitat:

du kannst nicht auf Seite A wieder auslesen was du auf Seite A geschrieben hast.



Oh, wie soll ich dann mein Programm testen? So ohne Hardware...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
21.03.2006, 15:17 Uhr
ao

(Operator)



Zitat von (un)wissender:
Oh, wie soll ich dann mein Programm testen? So ohne Hardware...

Hat dein PC eine zweite Serielle? Dann öffne die mit irgendeinem Terminalprogramm (Teraterm, Zoc, notfalls Hyperterm) und verbinde beide mit einem Nullmodemkabel (wichtig!). Dann kannst du testen, siehst im Terminalfenster die Sende-Nachrichten deines Testprogramms und kannst ihm auch Nachrichten schicken.

Falls es nur eine Serielle gibt: Loopback-Stecker basteln (TxD und RxD verbinden, Handshake-Leitungen ebenfalls). Dann testest du allerdings die Sende- und Empfangsroutinen gleichzeitig, d.h. wenn irgendwas Grundlegendes nicht klappt, wirds schwierig mit der Eingrenzung.

DTR und RTS solltest du übrigens nicht selber setzen. Entweder Hardware-Handshake einschalten, dann kümmert sich Windows selber drum, oder ausschalten, dann gibts nur die Datenleitungen, entweder mit Soft-Handshake oder ganz ohne.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
21.03.2006, 16:54 Uhr
(un)wissender
Niveauwart


Aha, danke.
Ich dachte man kann das per Software am selben Rechner testen, geht doch mit Sockets auch so.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
21.03.2006, 17:07 Uhr
ao

(Operator)



Zitat von (un)wissender:
Aha, danke.
Ich dachte man kann das per Software am selben Rechner testen, geht doch mit Sockets auch so.

Sockets verhalten sich zur Seriellen ungefähr so wie ne CNC-Fräsmaschine zum Faustkeil.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
21.03.2006, 18:33 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ao:

DTR und RTS solltest du übrigens nicht selber setzen. Entweder Hardware-Handshake einschalten, dann kümmert sich Windows selber drum, oder ausschalten, dann gibts nur die Datenleitungen, entweder mit Soft-Handshake oder ganz ohne.


das hat mein endgerät gebraucht, stimmt normal natürlich nich.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: