Newsgroup: it.comp.programmare.win32
Titolo: Settaggio Comm

Ciao,
nella mia applicazione devo ricevere dati da una Comm: effettuo l'apertura e 
i settaggi vari(baud rate, bit di parità etc...)..tuttavia non riesco
a leggere da essa. Se, invece, prima di lanciare la mia applicazione vado a 
leggere la medesima Comm con "Hyper Terminal", al successivo lancio 
dell'applicazione riesco a leggere. E' come se "Hyper Terminal" effettuasse 
un settaggio o una inizializzazione della Comm che io nella mia applicazione 
dimentico e che rimane valido anche dopo la chiusura di HyperTerminal.
Qualcuno può aiutarmi?
Michele
PS:
Di seguito riporto il codice in questione:
mpWinCom = CreateFile (COM_Name,GENERIC_READ | GENERIC_WRITE, 0, NULL, 
OPEN_ALWAYS, 0,NULL);
DCB dcb;
GetCommState(mpWinCom[ComID], &dcb);
dcb.BaudRate = CBR_4800;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = 1;
// Addictional param.
dcb.fBinary=TRUE;
dcb.fDsrSensitivity=false;
dcb.fParity=false;
dcb.fOutX=false;
dcb.fInX=false;
dcb.fNull=false;
dcb.fAbortOnError=TRUE;
dcb.fOutxCtsFlow=FALSE;
dcb.fOutxDsrFlow=false;
dcb.fDtrControl=DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity=false;
dcb.fRtsControl=RTS_CONTROL_DISABLE;
dcb.fOutxCtsFlow=false;
dcb.fOutxCtsFlow=false;
SetCommState(mpWinCom[ComID], &dcb);
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 10;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(mpWinCom[ComID], &CommTimeOuts);
SetCommMask(mpWinCom[ComID], EV_RXCHAR );
// setup device buffers
SetupComm(mpWinCom[ComID], 4096, 4096 );
// purge any information in the buffer
PurgeComm(mpWinCom[ComID], PURGE_TXCLEAR | PURGE_RXCLEAR); 
Inviato da X-Privat.Org - Registrazione gratuita 
http://www.x-privat.org/join.php

 Michele
<snip>
mpWinCom = CreateFile (COM_Name,GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_ALWAYS, 0,NULL);
DCB dcb;
GetCommState(mpWinCom[ComID], &dcb);
prima usi 'mpWinCom ' poi 'mpWinCom[ComID]'
probabilmente e' un errore di cut&paste.
prova a mettere:
EscapeCommFunction(mpWinCom, SETDTR);
prima di uscire dalla funzione.
Comunque (l'avevo gia' postato) se ti interessa trovi a
http://www.ennepisoft.it
una dll per comunicare con seriale, modem (comandi at) e lan in modo
trasparente.
C'e' anche un programma (con i sorgenti ma non compilabili) che la
utilizza.
Ho messo anche un programmino per comunicazione modbus (per gli addetti
del settore :-)). Non usa la dll.
Ciao

 ha scritto nel messaggio 
news:1149662947.7...@f6g2000cwb.googlegroups.com...
Micheles ha scritto:






Inviato da X-Privat.Org - Registrazione gratuita 
http://www.x-privat.org/join.php


Ti posto qui la parte di codice che uso (anche nella dll) (prima della
chiamata dcb viene pulito).
Sicuramente nel tuo codice manca l'inizializzazione della dimensione
della struttura.
<code>
//-----------------------------------------------------------
void PCom::fillDCB(DCB &dcb) const
{
  paramConn parCom = getParam();
  dcb.DCBlength = sizeof(dcb);
  GetCommState(getIdCom(), &dcb);
  dcb.fBinary   = true;
  dcb.fParity   = true;
  dcb.BaudRate  = vBaudRate[parCom.b.baud];
  dcb.ByteSize  = static_cast<BYTE>(vBitLen[parCom.b.len]);
  dcb.Parity    = static_cast<BYTE>(vParity[parCom.b.parity]);
  dcb.StopBits  = static_cast<BYTE>(vBitStop[parCom.b.stop]);
  BYTE v = static_cast<BYTE>(parCom.b.dtr_dsr);
  switch(v) {
    case paramConn::NO_DTR_DSR:
      dcb.fOutxDsrFlow = 0;
      dcb.fDtrControl = DTR_CONTROL_DISABLE;
      break;
    case paramConn::ON_DTR_DSR:
      dcb.fOutxDsrFlow = 1;
      dcb.fDtrControl = DTR_CONTROL_ENABLE;
      break;
    case paramConn::HANDSHAKE_DTR_DSR:
      dcb.fOutxDsrFlow = 1;
      dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
      break;
    }
  v = static_cast<BYTE>(parCom.b.rts_cts);
  switch(v) {
    case paramConn::NO_RTS_CTS:
      dcb.fOutxCtsFlow = 0;
      dcb.fRtsControl = RTS_CONTROL_DISABLE;
      break;
    case paramConn::ON_RTS_CTS:
      dcb.fOutxCtsFlow = 1;
      dcb.fRtsControl = RTS_CONTROL_ENABLE;
      break;
    case paramConn::HANDSHAKE_RTS_CTS:
      dcb.fOutxCtsFlow = 1;
      dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
      break;
    case paramConn::TOGGLE_RTS_CTS:
      dcb.fOutxCtsFlow = 1;
      dcb.fRtsControl = RTS_CONTROL_TOGGLE;
      break;
    }
  v = static_cast<BYTE>(parCom.b.xon_xoff);
  dcb.fInX = v;
  dcb.fOutX = v;
  dcb.XonChar = ASCII_XON;
  dcb.XoffChar = ASCII_XOFF;
  dcb.XonLim = 100;
  dcb.XoffLim = 100;
}
</code>

 ha scritto nel
messaggio news:44867022$1...@x-privat.org...


 Comm di cui state parlando...
Sono le porte seriali del PC.
Stefano Frosio
www.esse-effe.com