Page 1 sur 1

[RESOLU] ReadSerialPortData() et port série USB

Publié : dim. 21/oct./2012 10:08
par Anonyme 2
Bonjour à tous :mrgreen:
J'aimerais de l'aide concernant l'utilisation de ReadSerialPortData() :?
Je test actuellement la réception de données sur un port USB définis, mais je n'arrive pas à faire fonctionner mon petit bout de code plus-bas pour, par exemple, recéptioner et afficher les données recus de la souris qui, dans ses propriétés est localisé là: Port_#0002.Hub_#0005

Code : Tout sélectionner

Port$ = "" ;PORT à définir ici
*Buffer=AllocateMemory(1000)
If OpenSerialPort(0, Port$, 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
  Debug "Port "+Port$+" ouvert"
  Repeat    
    Resultat = AvailableSerialPortInput(0)
    If Resultat
      longueur = ReadSerialPortData(0, *Buffer, Resultat)
      Debug "Rcv: "+Str(Peek ()) ;A configurer aussi   
    EndIf    
  ForEver  
Else
	Debug "Port "+Port$+" non ouvert."
EndIf
Merci d'avance de votre aide :wink:

Re: ReadSerialPortData()

Publié : dim. 21/oct./2012 14:18
par Golfy
Pour ma part, je préfère récupérer les données brutes et les transformer en chaines lisibles par un humain : voici la fonction

Code : Tout sélectionner

Procedure.s ReadMsg(*B, len)
	a$ = ""
	For t=0 To len-1
		a$=a$+RSet(Hex(PeekB(*B+t) & $FF),2,"0")
	Next t
	ProcedureReturn a$
EndProcedure	
Ca c'est pour voir ce qui arrive (tu peux continuer à travailler sur les données brutes dans *Buffer) mais gare aux PeekS (qui s'arrêtera au premier octet dont la valeur sera nulle).

Ensuite, la boucle que tu fournis et juste reste juste à mettre le bon port (ex: port$="COM3" sur Windows ou port$="/dev/ttyS0" sur Linux) Voici celle que j'utilise pour lire les informations de ma domotique :

Code : Tout sélectionner

Procedure.i LectureVelbus()
	Serial = AvailableSerialPortInput(0)
	VelbusRX = VelbusRX + Serial
  If Serial
  	RXLen = ReadSerialPortData(0,*BSin,Serial)
		If RXlen = Serial
			nb1=ListSize(msg2network())
			Repeat
				If PeekB(*BSin+t) & $FF = $0F
					counter+1
					fixlen = 4
					varlen = PeekB(*BSin+t+3) & $0F
					fintrame = t+fixlen+varlen+1
					crcloc = fintrame-1
					tlen = fixlen+varlen+2
					crc = checksum(*BSin+t,tlen-3)
					If PeekB(*BSin+fintrame) & $FF = $04
					  AddElement(msg2network())
					  msg2network()\src = "VELBUS Modules"
						msg2network()\len = tlen
						msg2network()\Cmd = AllocateMemory(tlen)
						CopyMemory(*BSin+t,msg2network()\cmd,tlen)
						t = t+tlen-2
					Else
					EndIf
				EndIf
				t = t + 1
			Until t=>RXLen
			ProcedureReturn ListSize(msg2network())-nb1			
		EndIf
	EndIf
	ProcedureReturn 0
EndProcedure
Tu noteras l'utilisation de Serial = AvailableSerialPortInput(0) qui permet de ne pas lire le buffer s'il n'y a pas de données.

Re: ReadSerialPortData()

Publié : dim. 21/oct./2012 17:40
par Anonyme 2
Merci de ta réponse très productive Golfy :)
Mais pour la question du port, comment fait-on pour connaitre celui utilisé pour le périphérique ciblé? les seules indications que j'ai c'est ça: Port_#0002.Hub_#0005 (j'ai testé COM0 à COM10 mais rien ..) :cry:
Pourrais-tu me donner un exemple fonctionnel, si ce n'est pas trop demander, par rapport à un périphérique présent quelconque (clavier, écran, souris, clé..) ? merci de ta précieuse aide :)

Re: ReadSerialPortData()

Publié : dim. 21/oct./2012 19:29
par Golfy
Il faut déjà savoir comment tu obtiens Port_#0002.Hub_#0005 : est-ce une fonction WMI, un programme quelconque... ou bien la liste des pilotes et périphériques Vista (ou Win7) :wink: ?

Mon flair me dit qu'il tu n'as pas l'exact bon driver ou qu'il n'est pas correctement installé...
... ou alors c'est Google qui m'a mit sur la piste : http://h30434.www3.hp.com/t5/Notebook-O ... -p/1293119
:mrgreen:

Ce n'est peut-être pas le même périphérique, mais il y a des idée à suivre :idea:

Re: ReadSerialPortData()

Publié : dim. 21/oct./2012 20:20
par Anonyme 2
C'est dans la liste des pilotes et périphériques de windows 7 :?

Je ne pense pas que ça soit du côté du driver :arrow: je cherche encore :roll:

Re: ReadSerialPortData()

Publié : dim. 21/oct./2012 20:54
par Golfy
Dans le Gestionnaire de périphériques, vois-tu les ports série (type COMx) ?
Sans cela, il sera difficile d'utiliser les commandes Purebasic...

Je n'ai -- hélas pour ce diagnostic -- pas de périphérique "série" sur mon PC Win7... sur le PC WinXP, j'en ai mais XP n'affiche pas de description Port_#

Est-ce que ton périphérique fonctionne (avec le programme d'origine) ?
As-tu (sur le CD) des exemples de programmation en C, ou autre langage ?

Re: ReadSerialPortData()

Publié : sam. 10/nov./2012 20:38
par Anonyme 2
Désolé du retard.. les vacances hein :3

Non le gestionnaire de périphériques n'affiche pas de "COMx" :(
Du coup dois-je me concentrer sur des dll spécialisés dans la genstion de port série ou bien?

Et sinon, oui mon périphérique fonctionne correctement: installés avec les CD d'origine etc.. aucuns problèmes de ce côté ;)
Pas d'exemples de programmation malheuresement :/
Je tiens à préciser qu'il n'y a pas que la souris seulement qui possèdent ces caractéristiques, mais bien tout les autres périphériques aussi ( = aucuns emplacements de type "COMx")

Mon but général et de pouvoir réceptionner des données sur un port prédéfinis.
Etant donné cette tonne de logiciels (listes, USB Monitor), je pense que ce que je recherche à faire est faisable :)
Mais si quelqun a des idées pour me faire avances, je suis preneur! :)

Re: ReadSerialPortData()

Publié : sam. 10/nov./2012 21:37
par flaith
Il existe une librairie ICI

Re: ReadSerialPortData()

Publié : sam. 10/nov./2012 21:46
par Anonyme 2
8O j't'adore toi :mrgreen: merci beaucoup, j'ai pas encore test mais ça à l'air de fonctionner :D
C'est vrai qu'il faut penser à farfouiller dans le fofo anglais parfois 8)

Re: [RESOLU] ReadSerialPortData() et port série USB

Publié : sam. 10/nov./2012 22:05
par flaith
De rien :mrgreen:

Re: [RESOLU] ReadSerialPortData() et port série USB

Publié : lun. 12/nov./2012 7:07
par Anonyme 2
Petit problème..
J'ai ouvert chaque exemple (Device_IO.pb, DeviceInfo.pb, DeviceTest.pb) mais rien ne marche.. il y a quelques erreurs: les fonctions ne semblent pas fonctionner (pas lier avec la librarie?) ou quelques structures comme "HID_Lib_DeviceInfo" qui ne marche pas non plus..
Besoin d'aide please :?

Re: [RESOLU] ReadSerialPortData() et port série USB

Publié : lun. 12/nov./2012 12:45
par flaith
Tu as bien téléchargé le fichier zip et installé la librairie ?

Re: [RESOLU] ReadSerialPortData() et port série USB

Publié : lun. 12/nov./2012 17:35
par Anonyme 2
:?

Re: [RESOLU] ReadSerialPortData() et port série USB

Publié : lun. 12/nov./2012 20:05
par flaith
Dans le zip tu as plusieurs répertoires et chacun d'entre eux doit etre installé dans le répertoire de Purebasic
Ex: dans le zip tu as le repertoire PureLibraries\UserLibraries et la librairie "HID_Lib" que tu dois donc copié dans le répertoire Purebasic\PureLibraries\UserLibraries et même chose pour les autres
Relance Purebasic et test les programmes :wink:

Re: [RESOLU] ReadSerialPortData() et port série USB

Publié : mer. 14/nov./2012 22:01
par Anonyme 2
:idea: :mrgreen: