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

Résolu
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 3 oct. 2005 à 09:48
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 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

13 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 14:55
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;
3
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
3 oct. 2005 à 13:59
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
1
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 13:07
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
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
3 oct. 2005 à 14:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 14:26
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;
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 14:59
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!!!!
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 15:13
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
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 16:01
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;
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
3 oct. 2005 à 16:08
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
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
3 oct. 2005 à 16:16
en proncipe oui mais je n'ai jamaais fait.
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
3 oct. 2005 à 16:22
Ok, je te remerciepour tout

David, à VERSAILLES
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
4 oct. 2005 à 13:18
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
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
4 oct. 2005 à 13:24
ça peut servir;

je te remercie de l'info
0
Rejoignez-nous