Je travaille avec embedded UNICODE pour développer pour windows CE.
J'arrive à récuperer les données arrivées sur le port COM en cliquant sur un bouton,
Or j'aimerais récuperer l'evenement d'arrivées de données pour automatiser la chose.
J'ai essayé en bricolant de moi même, je n'y suis pas arrivé, je viens donc de prendre ce code:
Comme s'il manquait un bibliothèque... Mais tout devrait se trouver dans windows.h qui est déjà incluse.
Est ce que quelqu'un peut me dire comment (simplement) attacher un evenement au port COM ?
Merci d'avance.
int ouvrirPort(int numport) { // Retourne 1 en cas de succès
//char szPort[16];
TCHAR szPort[15];
//sprintf(szPort, "\\\\.\\COM%d:", numport);//modifie pour prendre les port com>9
wsprintf(szPort, _T("COM%d:"), numport);
hPort = CreateFile(
(LPCTSTR)szPort, //Pointer to the name of the port
GENERIC_READ|GENERIC_WRITE, //accès en lecture ou en écriture
0, //Share mode
NULL, //Pointer to the security attribute
OPEN_EXISTING, //Cela indique que l'instance sera créée si que le port existe
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //Port attributes
NULL);
if(hPort==INVALID_HANDLE_VALUE) {
return 0;
}
if(!m_Ov.hEvent)
m_Ov.hEvent=CreateEvent(NULL, // no security attributes
FALSE, // auto reset event
FALSE, // not signaled
NULL // no name
);
SetEvent(m_Ov.hEvent);
DCB PortDCB;
if (!GetCommState (hPort, &PortDCB)) { // Structure de configuration
return 0;
}
// mise à jour de la structure
PortDCB.DCBlength = sizeof (DCB);
PortDCB.BaudRate = 9600;
PortDCB.fBinary = TRUE;
PortDCB.fParity = TRUE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
PortDCB.fDsrSensitivity = FALSE;
PortDCB.fTXContinueOnXoff = TRUE;
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull = FALSE;
PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
PortDCB.fAbortOnError = FALSE;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
//Renvoie des nouvelles informations dans le registre de votre port série
if (SetCommState (hPort, &PortDCB)) {
GetCommTimeouts(hPort,&m_ComTimeouts);
m_ComTimeouts.ReadIntervalTimeout = 0xFFFFFFFF;
m_ComTimeouts.ReadTotalTimeoutMultiplier = 0;
m_ComTimeouts.ReadTotalTimeoutConstant = 0;
m_ComTimeouts.WriteTotalTimeoutMultiplier = 0;
m_ComTimeouts.WriteTotalTimeoutConstant = 10000;
if (!SetCommTimeouts(hPort,&m_ComTimeouts))
return 0;
memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
m_OverlappedRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
m_OverlappedWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
if (m_OverlappedRead.hEvent==NULL || m_OverlappedWrite.hEvent==NULL)
return 0;
if(m_OverlappedRead.hEvent!=NULL)
CloseHandle(m_OverlappedRead.hEvent);
if(m_OverlappedWrite.hEvent!=NULL)
CloseHandle(m_OverlappedWrite.hEvent);
// PRM2: Indique que l'on va détecter la réception (entrée de type DWORD)
SetCommMask(hPort,EV_RXCHAR); // définit les évènements pour lesquels ont va réagir par rapport à notre instance
return 1;
} else
return 0;
}
David, à VERSAILLES
[ Lien ]