Bonjour,
Je travaille dans une société ou nous utilisons un contrôleur relié à un PC par liaison RS232. Cette liaison est assurée via le port COM ou via le port USB du PC émulé de manière à être utiliser comme un port série.
Mon problème est le suivant:
Je travaille sur un projet en C++ utilisant MFC (avec Visual Studio 2005), et je dois communiquer avec le contrôleur via la liaison USB.
Cette communication en temps normal fonctionne parfaitement.
Après redémarrage de notre contrôleur, je parviens à ouvrir le port Com mais je m'apercois que ce dernier recoit des trames incohérente.
Nous utilisons d'habitude Visual Basic .NET et la classe System.IO.Ports.SerialPort avec la méthode open. La seule solution que j'ai trouvé pour rétablir une communication normale entre le contrôleur et le PC (après redémarrage du contrôleur) est donc de lancer une de nos applications VB, d'ouvrir et de fermer le port, puis de relancer mon application en C++.
Je pense qu'il s'agit d'un problème sur l'ouverture du port, peut être une option manquante mais je n'arrive pas à indentifier le problème. Voici le code que j'utilise pour l'ouverture du port :
Je suis ouvert à toutes propositions pour m'aider à résoudre ce problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 bool CPfcsClientDlg::openRS232(int numPort) { BOOL m_bPortReady; COMMTIMEOUTS m_CommTimeouts; DCB m_dcb; char port[5]; memset(port,0,5); sprintf(port,"COM%d",numPort); m_hCom = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security OPEN_EXISTING, 1, // no overlapped I/O NULL); // null template // si l'ouverture a échoué if(m_hCom == INVALID_HANDLE_VALUE) { m_hCom = NULL; return FALSE; } m_dcb.BaudRate = 9600; m_dcb.ByteSize = 8; m_dcb.Parity = NOPARITY; m_dcb.StopBits = ONESTOPBIT; m_dcb.fAbortOnError = TRUE; m_bPortReady = SetCommState(m_hCom, &m_dcb); m_CommTimeouts.ReadIntervalTimeout = 50; m_CommTimeouts.ReadTotalTimeoutConstant = 50; m_CommTimeouts.ReadTotalTimeoutMultiplier = 50; m_CommTimeouts.WriteTotalTimeoutConstant = 50; m_CommTimeouts.WriteTotalTimeoutMultiplier = 10; m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts); PurgeComm(m_hCom, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT); EscapeCommFunction(m_hCom, SETDTR); return(m_bPortReady); }
Merci d'avance pour vous réponses.
Partager