PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Problème d'ajout Port serie
Problème d'ajout Port serie
Débuté par Anthony, 20 nov. 2017 20:04 - 6 réponses
Posté le 20 novembre 2017 - 20:04
Bonjour,

Je doit développer un petit programme pour le boulot.
Le logiciel consiste a lire sur un port série et à l'affichée dans un champ puis de l'enregistrer dans une base de donnée.

Mon problème est que lorsque j'enregistre les données reçu du port série grâce a "Sévèrement" l'enregistrement dans la base de donnée est fait n'importe comment, sois il manque des caractère ou alors il enregistre dans sur 2 ligne au lieu de 1 ou alors il enregistre 1 caractère est il va à la ligne .

ma procédure de lecture est la suivante
Code de la procédure local
LigneCom1 est un booléen
nCom est une entier

TempBuffer = "" // vidage du buffer de reception série

// Port COM1
nCom = 1

// ferme le port COM1
sFerme(nCom)

LigneCom1 = sOuvre(nCom, 6000, 6000,0,1)
SI LigneCom1 = Vrai ALORS
// Paramétrage de COM1 : 4800bauds, parité paire,
// 8 bits de données, 2 bits de stop
// protocole de perforation DC1-DC4
// MCX nom de la machine
sFixeParamètre(nCom, 9600 1, 8, 2, 1, 0,0) // c'est bizarre ici 7 bits, commentaires parlent de 8 bits
// Détection de caractères sur le port COM1
sEvénement(1,sEveCaractèreReçu,"Lecture") // on active la procédure de lecture sur évenement
SINON
Erreur("Erreur d'ouverture de COM1")
FIN
Info("Initialisation terminée")

Procedure Lecture
OctetsLus est un entier
Str est une chaîne
i est un entier
OctetsLus = sDansFileEntrée (NumPort)
Str = sLit (NumPort ,OctetsLus)
TempBuffer = TempBuffer + Str // on met ce qu'on reçoit dans un buffer temporaire
sai_Trame = TempBuffer
TempBuffer2 = Str
Sauvegarde_trame.Trame = TempBuffer2
HAjoute(Sauvegarde_trame)

i++
SI i > 40 ALORS
// code pour effacer les 20 premier caractère du champ de saisie
FIN

FIN


Merci de votre aide cela fait un moment que je cherche sur internet je ne suis pas un professionnel et je programme avec WinDev 21
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 20 novembre 2017 - 22:41
hello,
si ce que tu reçois sur le port série contient des séparateurs de lignes (par exemple le caractère 13 ) il faut synchroniser le buffer de réception sur ce caractère, c'est à dire remplir le buffer jusqu'à réception de ce caractère. Il y a un exemple dans ma contribution sur www.developpez.net ici :
https://www.developpez.net/forums/d1008591/environnements-developpement/windev/contribuez/windev-gestion-liaison-serie-evenement-serie/

--
Ami calmant, J.P
Posté le 21 novembre 2017 - 00:41
Le message que je reçoit et de la forme suivante :
21/11/2017 14:23:55 emis -->C300
21/11/2017 14:23:55 message recu arriver voiture Num 13335-111
21/11/2017 14:23:56 reçu --> C300
Etc ......

Mon problème est que l'affichage dans mon champ de saisie fonctionne bien mais l'enregistrement dans ma base de donnée ne corresponds pas a ce qui est affiché dans le de saisie. Par exemple:
21/11/2017
14:
23:55 emi

s --> C300
21/11/2017 14:23:55 message recu arriver voiture Num 133
21/11/2017 14:23:56 reçu

Se que je comprend pas ces pourquoi j'ai une difference entre l'affichage dans le champ saisie et l'enregistrement dans ma base de donnée.
Membre enregistré
102 messages
Popularité : +4 (6 votes)
Posté le 21 novembre 2017 - 11:44
Bonjour,

C'est normal, tu fais le hajoute() sur réception d'un caractère du port série.
Si la réception se fait en plusieurs fois, tu ajoutes un enregistrement pour chaque paquet.

Dans ta procédure Lecture :

OctetsLus est un entier
Str est une chaîne
i est un entier

OctetsLus = sDansFileEntrée (NumPort)

tantque octetslus > 0

Str = sLit (NumPort ,OctetsLus)
TempBuffer += Str

fin

hraz(Sauvegarde_trame)

sai_Trame = TempBuffer
TempBuffer2 = Str
Sauvegarde_trame.Trame = TempBuffer2
HAjoute(Sauvegarde_trame)

Regarde, il y a des exemples qu'ils n'y a plus qu'a adapter.

--
Cordialement.

Karl
Membre enregistré
24 messages
Popularité : +1 (1 vote)
Posté le 21 novembre 2017 - 12:40
Bonjour,
j'ai essayer votre code sur un émulateur de port série, j'ai du enlever la boucle "TANTQUE" car cela ne fonctionner pas.

voila le code qui fonctionne avec l’émulateur :

Procedure Lecture_Serie()

OctetsLus est un entier
Str est une chaîne
OctetsLus = sDansFileEntrée (1)

Str = sLit (1 ,OctetsLus)
TempBuffer += Str

HRAZ(Sauvegarde_Trame)

SAI_Affichage = TempBuffer
TempBuffer2 = Str

Sauvegarde_Trame.Trame=TempBuffer2
Sauvegarde_Trame.Date=DateSys()
Sauvegarde_Trame.Heure=HeureSys()
HAjoute(Sauvegarde_Trame)

i++
SI i > 25 ALORS
TempBuffer = TempBuffer[[25 A ]]
SAI_Affichage=TempBuffer
SINON
SAI_Affichage=TempBuffer
FIN


Je vais essayer de tester le code sur la machine pour demain
Membre enregistré
24 messages
Popularité : +1 (1 vote)
Posté le 21 novembre 2017 - 23:49
Bonjour
Cela ne fonctionne pas sur la machine je n'arrive pas a enregistrer les trames que je reçoit.
sur le simulateur aucun problème, mais lors que je l'installe sur la machine cela m'enregistre n'importe quoi

j'ai essayer de faire :
POUR TOUTE chaîne sMachaine de TempBuffer SEPAREE PAR RC
Sauvegarde_Trame.Trame=TempBuffer2
Sauvegarde_Trame.Date=DateSys()
Sauvegarde_Trame.Heure=HeureSys()
HAjoute(Sauvegarde_Trame)
FIN


Même problème
j'ai essayer de remplacer RC par un code ascii toujours le même problème.
lorsque j'enregistre dans un fichier texte avec fEcritLigne pas de problème cela m'enregistre tout ligne par ligne correctement
Membre enregistré
24 messages
Popularité : +1 (1 vote)
Posté le 22 novembre 2017 - 00:56
Re bonjour ,
J'ai trouver pourquoi il enregistre n'importe quoi dans la base de donné.
Lorsque je regarde ma variable TempBuffer2 de plus prêt, je l'affiche dans champ de saisie.
Elle affiche par exemple "22/11/17" puis elle s'efface puis affiche la suite du message.
Mais maintenant je ne sais pas comment remédier a mon problème
est ce que quelqu'un peut m'aider car je suis vraiment perdu
merci d'avance