2009-07-13 7 views
0

Salut j'ai besoin de trouver le débit en bauds et d'autres paramètres pour un port série, En regardant sur le web, il semble que je devrais utiliser GetCommConfig, Cela retourne un enregistrement TCommConfig avec quoi Je suppose que ce sont les données dont j'ai besoin. Le problème est la fonction que je wote retourne les mauvaises valeurs.Trouver les paramètres du port série dans Delphi

Le code ci-dessous semble fonctionner, mais le débit en bauds est toujours de 1200, ce qui ne va pas dans Windows Gestionnaire de périphériques (et modifier les paramètres de port).

Je l'ai essayé d'appeler comme si:

ComPort('com1'); 
ComPort('COM1'); 
ComPort('COM1:'); 
ComPort('COM4'); 
ComPort('COM9'); 

les 4 premiers sont valables, mais reviennent 1200 et le 5 est invalide et renvoie 0

function ComPort(l_port:String):TCommConfig; 
{Gets the comm port settings} 
    var 
    ComFile: THandle; 
    PortName: array[0..80] of Char; 
    size: cardinal; 
    CommConfig:TCommConfig; 
begin 
    FillChar(Result, SizeOf(TCommConfig), 0);//blank return value 

    try 
     StrPCopy(PortName,l_port); 
     ComFile := CreateFile(PortName,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0{ FILE_ATTRIBUTE_NORMAL},0); 
     try 
      if (ComFile <> INVALID_HANDLE_VALUE) then 
      begin 
       FillChar(CommConfig, SizeOf(TCommConfig), 0);//blank record 
       CommConfig.dwSize := sizeof(TCommConfig);//set size 
       //CommConfig.dcb.DCBlength := SizeOf(_dcb); 
       size := sizeof(TCommConfig); 

       if (GetCommConfig(ComFile,CommConfig,size)) then 
       begin 
        Result := CommConfig; 
       end; 
      end; 
     finally 
      CloseHandle(ComFile); 
     end; 
    except 
     Showmessage('Unable to open port ' + l_port); 
    end; 
end; 

pas à pas dans le code, le premier 4 touche toujours la ligne Résultat: = CommConfig;, donc le GetCommConfig est revenu un code valide, donc je dois manquer quelque chose.

Je tryed verious autres choses, telles que le réglage de la longueur de l'enregistrement de DCB, mais tous ont le même résultat, comme transmission de 1200.

Est-ce que quelqu'un sait où je me trompe?

+0

Avez-vous essayé GetCommState? http://msdn.microsoft.com/en-us/library/aa363260%28VS.85%29.aspx – stukelly

+0

Oui même résultat, autant que je peux dire, GetCommConfig utilise GetCommState en interne pour remplir l'enregistrement DCB. – Re0sless

Répondre

3

Il s'avère que j'utilisais la mauvaise fonction, j'aurais dû utiliser GetDefaultCommConfig et pas le GetCommConfig que j'utilisais. Par le regard si elle, et s'il vous plaît corrigez-moi si je me trompe, GetDefaultCommConfig renvoie les paramètres de Windows et GetCommConfig renvoie les paramètres de la connexion ouverte au port, writefile ouvre le port comme il le veut (ignorer le paramètres par défaut), d'où vient le débit de 1200 bauds.

Si cela aide quelqu'un dans le futur, voici la fonction que j'ai imaginée.

function ComPort(l_port:String):TCommConfig; 
{Gets the comm port settings (use '\\.\' for com 10..99) } 
    var 
    size: cardinal; 
    CommConfig:TCommConfig; 
begin 
    FillChar(Result, SizeOf(TCommConfig), 0); 

    //strip trailing : as it does not work with it 
    if (RightStr(l_port,1) = ':') then l_port := LeftStr(l_port,Length(l_port)-1); 

    try 
     FillChar(CommConfig, SizeOf(TCommConfig), 0); 
     CommConfig.dwSize := sizeof(TCommConfig); 

     size := sizeof(TCommConfig); 

     if (GetDefaultCommConfig(PChar(l_port),CommConfig,size)) then 
     begin 
      Result := CommConfig; 
     end 
     //if port is not found add unc path and check again 
     else if (GetDefaultCommConfig(PChar('\\.\' + l_port),CommConfig,size)) then 
     begin 
      Result := CommConfig; 
     end 
    except 
     Showmessage('Unable to open port ' + l_port); 
    end; 
end; 
3

La vitesse de transmission et les autres paramètres d'un port série sont définis lorsque le port série est ouvert. Je pense que vous lisez les valeurs par défaut.

+0

Je pensais que c'était ce que CreateFile faisait, en ouvrant une connexion au port? – Re0sless

Questions connexes