[TcomPort] Identifier les materiels connectés (infos) [Résolu]

cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 3 oct. 2005 à 09:48 - Dernière réponse : jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention
- 4 oct. 2005 à 13:24
Bonjour,


J'aimerais avoir des informations sur le materiel connecté au port COM n de manière à l'identifier.


Pour être clair:
Mon appli doit scanner un port COM et trouver un périphérique bien précis (Le périphérique est branché en USB mais il simule un port COM), si il ne le trouve pas, il passe au port COM suivant.


Comment obtenir des informations sur le materiel branché en rs232 ?
(ou sinon, le nom du port COM virtuel Créé)


Merci d'avance.

David, à VERSAILLES
Afficher la suite 

13 réponses

Répondre au sujet
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 14:55
+3
Utile
le nom que je t'ai donné correspond à un convertisseur belkin

pour la violation d'accès c'est bizzare chez moi ça fonctionne sans
problème mais je n'est mis que cela sur la form.je ne pense pas (mais
je n'en suis pas sur) qu'il y ait un autre moyen que de lire le
registre pour savoir quel peripherique est installé.

si tu veux une operation automatisee remplace le listbox par des Tstrings (l'enumports n'est là que pour l'exemple. tu fais:

var Numport:string;
dans le traitement tu ajoutes if valuename= ' \Device\slabser0' then Numport:=Data;

tu n'es pas obligé de passer par des Tstrings;

ça devrais donner quelque chose comme ça

function NumeroPort:string;

var

KeyHandle: HKEY;

ErrCode, Index: Integer;

ValueName, Data: string;

ValueLen, DataLen, ValueType: DWORD;

begin

ErrCode : = RegOpenKeyEx(

HKEY_LOCAL_MACHINE,

'HARDWARE\DEVICEMAP\SERIALCOMM',

0,

KEY_READ,

KeyHandle);



if ErrCode <> ERROR_SUCCESS then

raise EComPort.Create(CError_RegError, ErrCode);



Index := 0;

repeat

ValueLen : = 256;

DataLen := 256;

SetLength(ValueName, ValueLen);

SetLength(Data, DataLen);

ErrCode := RegEnumValue(

KeyHandle,

Index,

PChar(ValueName),

{$IFDEF DELPHI_4_OR_HIGHER}

Cardinal(ValueLen),

{$ELSE}

ValueLen,

{$ENDIF}

nil,

@ValueType,

PByte(PChar(Data)),

@DataLen);



if ErrCode = ERROR_SUCCESS then

begin

SetLength(Data, DataLen);

if valuename' \Device\slabser0' then Numeroport:Data;

Inc(Index);

end

else

if ErrCode <> ERROR_NO_MORE_ITEMS then

raise EComPort.Create(CError_RegError, ErrCode);

until (ErrCode <> ERROR_SUCCESS) ;

RegCloseKey(KeyHandle);
end;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de jlen100
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 3 oct. 2005 à 13:59
+1
Utile
Bonjour Jlen100,

J'ai bien essayé ton code:
var temp1,temp2,temp3: TStrings;
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
begin
ErrCode := RegOpenKeyEx(HKEY_LOCAL_MACHINE,'HARDWARE\DEVICEMAP\SERIALCOMM',0,KEY_READ,KeyHandle);
if ErrCode <> ERROR_SUCCESS then
raise EComPort.Create(CError_RegError, ErrCode);
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(KeyHandle,Index,PChar(ValueName),
{$IFDEF DELPHI_4_OR_HIGHER}
Cardinal(ValueLen),
{$ELSE}
ValueLen,
{$ENDIF}
nil,@ValueType,PByte(PChar(Data)),@DataLen);


if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
temp1.Add(Data);//donne la liste non triée des ports presents
temp2.Add(valuename);// donne la liste des descriptions
Inc(Index);
end
else
if ErrCode <> ERROR_NO_MORE_ITEMS then
raise EComPort.Create(CError_RegError, ErrCode);


until (ErrCode <> ERROR_SUCCESS) ;
RegCloseKey(KeyHandle);
enumcomports(temp3);// donne la liste classée des ports

Qui a l'air de répondre à ma demande (J'ai été voir dans le registre, mon port est: \Device\slabser0, c'est normal ?)

Mais il me fait une violation d'accès que le port soit ouvert ou non.

Mais je n'ai pas besoin d'une superbe interface utilisateur, puis-je faire simplement:

var temp1: TStrings;
begin
enumcomports(temp1);// donne la liste classée des ports

(Qui me fait également une violation d'accès mais la combobox est-elle chargée des description ?)

David, à VERSAILLES
Commenter la réponse de cs_nitrique
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 13:07
0
Utile
salut en recuperant la fonction EnumPorts de Tcomport on peut lister les ports et leurs descriptions:

procedure TForm1.FormCreate(Sender: TObject);

var

KeyHandle: HKEY;

ErrCode, Index: Integer;

ValueName, Data: string;

ValueLen, DataLen, ValueType: DWORD;

begin

ErrCode := RegOpenKeyEx(

HKEY_LOCAL_MACHINE,

'HARDWARE\DEVICEMAP\SERIALCOMM',

0,

KEY_READ,

KeyHandle);



if ErrCode <> ERROR_SUCCESS then

raise EComPort.Create(CError_RegError, ErrCode);



Index : = 0;

repeat

ValueLen := 256;

DataLen := 256;

SetLength(ValueName, ValueLen);

SetLength(Data, DataLen);

ErrCode := RegEnumValue(

KeyHandle,

Index,

PChar(ValueName),

{$IFDEF DELPHI_4_OR_HIGHER}

Cardinal(ValueLen),

{$ELSE}

ValueLen,

{$ENDIF}

nil,

@ValueType,

PByte(PChar(Data)),

@DataLen);



if ErrCode = ERROR_SUCCESS then

begin

SetLength(Data, DataLen);

listbox1.Items.Add(Data);//donne la liste non triée des ports presents

listbox2.Items.Add(valuename);// donne la liste des descriptions

Inc(Index);

end

else

if ErrCode <> ERROR_NO_MORE_ITEMS then

raise EComPort.Create(CError_RegError, ErrCode);



until (ErrCode <> ERROR_SUCCESS) ;



RegCloseKey(KeyHandle);

enumcomports(listbox3.Items);// donne la liste classée des ports

end;

il te suffira de mettre en relation les listbox1 et listbox2 pour avoir le numéro du port en fonction de sa description.

pour un port USB tu devrait avoir quelque chose comme:

\device\U2SPORT1

ensuite tu pourrra tester la présence du peripherique sur ce port (envoi d'une trame de test

bonne prog
Commenter la réponse de jlen100
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 3 oct. 2005 à 14:20
0
Utile
C'est trop étrange, si je met une combobox, ça marche.
Comment se fait-il que ça plante avec ma variable tstrings ?

Mais cette tache est automatisée (je dois trouver quel est le port Com virtuel) il n'y a que le traitement de chaine de la description comme moyen ?

David, à VERSAILLES
Commenter la réponse de cs_nitrique
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 14:26
0
Utile
tu peux utiliser enumcomports seul mais tu n'auras que la liste.

si tu fais

var temp1: TStrings;


begin


enumcomports(temp1);// donne la liste classée des ports


tu utilises la liste avant de l'avoir créer il faut faire:

Temp1 := TStringList.Create;

try

enumcomports(temp1);// donne la liste classée des ports

finally Temp1.Free; end;
Commenter la réponse de jlen100
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 14:59
0
Utile
pour la violation d'acces tu mets:

var temp1,temp2,temp3: TStrings;

en fait j'avais placé des listbox sur la form pour visualiser les résultats!!!!
Commenter la réponse de jlen100
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 15:13
0
Utile
un dernier conseil pour verifier que device corespond bien à ton
matériel place 3 listbox sur une form et utilises le premier code ainsi
tu auras la liste complète de ports serie de ton PC (le device varie
d'un matériel à un autre ce qui est normal puisque celà sert à
l'indentifier).

si tu as plusieurs matériels d'origine différentes mets un liste en fichier ini et modifie le test
Commenter la réponse de jlen100
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 16:01
0
Utile
dans la fonction il vaut mieux faire:

if pos(' \Device\slabser0',valuename)<>0 then result:= data;

au lieu de:

if valuename =' \Device\slabser0' then Numeroport:=Data;
Commenter la réponse de jlen100
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 3 oct. 2005 à 16:08
0
Utile
Cool,

En fait, j'enleverais le: 0 au cas ou il incrémente comme: Serie (et le: \device\ aussi tant qu'à faire)

En fait, j'aimerais détacher cette partie de mon prog (faire un exe qui ne s'occupera que de ça).

Un exe delphi peut-il renvoyer une valeur (comme C) ?

David, à VERSAILLES
Commenter la réponse de cs_nitrique
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 3 oct. 2005 à 16:16
0
Utile
en proncipe oui mais je n'ai jamaais fait.
Commenter la réponse de jlen100
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 3 oct. 2005 à 16:22
0
Utile
Ok, je te remerciepour tout

David, à VERSAILLES
Commenter la réponse de cs_nitrique
cs_nitrique 346 Messages postés jeudi 1 mai 2003Date d'inscription 4 avril 2011 Dernière intervention - 4 oct. 2005 à 13:18
0
Utile
Si la réponse t"interesse, la voici:
Begin
Application.Initialize;
Application.Title := 'GT_D2R';
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
//Halt(ret); // valeur de retour de l'application
end.

David, à VERSAILLES
Commenter la réponse de cs_nitrique
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 4 oct. 2005 à 13:24
0
Utile
ça peut servir;

je te remercie de l'info
Commenter la réponse de jlen100

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.