Bonjour à tous,
J’ai réalisé un programme qui récupère les données provenant de 2 caméras reliées au PC par du RS232.
Ces données sont traitées puis enregistrées en base de données
Ca fonctionne bien pendant un certain temps puis au bout d’un moment, le logiciel ne fait plus rien (il se bloque) et je n’ai pas de message d’erreur.
J’utilise 2 TComPort avec Delphi 2007
J’ai rajouté un fichier log qui m’ permis d’analyser un peu le problème.
A un moment, le PC reçoit des données de la caméra 2 et commence à les traiter. Mais il reçoit aussi des données de la caméra 1 et n’attends pas d’avoir fini le traitement de la caméra 2.
Je vous joins un bout de code, ca pourra peut-être vous aider.
Code initialisation Camera 1:
Code initialisation Camera 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForm1.InitCamera1; begin FPort1:= TComPort.Create(nil); FPort1.Port:='COM' + IntToStr(FComCamera1); // CAM 1 FPort1.BaudRate:=br9600; FPort1.DataBits:= dbEight; FPort1.Parity.Bits:= prNone; FPort1.StopBits:= sbOneStopBit; FPort1.Open; FPort1.OnRxChar:=DoDataReceivedCAM1; end;
Et voici mon évènement associé à la camera 1 (l'évènement caméra 2 est sensiblement identique)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForm1.InitCamera2; begin FPort2:= TComPort.Create(nil); FPort2.Port:='COM' + IntToStr(FComCamera2); // CAM 2 FPort2.BaudRate:=br9600; FPort2.DataBits:= dbEight; FPort2.Parity.Bits:= prNone; FPort2.StopBits:= sbOneStopBit; FPort2.Open; FPort2.OnRxChar:=DoDataReceivedCAM2; end;
Y aurait-il quelque chose que j'ai oublié ?
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 procedure TForm1.DoDataReceivedCAM1(Sender: TObject; Count: Integer); var S:string; T:string; begin FPort1.ReadStr(T,Count); FBuffer1:= FBuffer1 + T; if pos(#13,FBuffer1) <> 0 then begin WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Buffer1: ' + FBuffer1 ); S:= Copy(FBuffer1,1,pos(#13,FBuffer1)-1); WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Trame1: ' + S ); FBuffer1:= Copy(FBuffer1,pos(#13,FBuffer1)+1,Length(FBuffer1)-pos(#13,FBuffer1)); WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Buffer1 après découpage: ' + FBuffer1 ); SaveValuesInDB1(S); WriteLog1(FormatDateTime('yyyy-mm-dd hh:nn:ss:ms',Now()) + ': Sauvegarde 1 BD OK' ); end; end;
Merci d'avance pour votre aide
cdlt,
Marsup
Partager