Ainda nao testei tudo mas ai está uma parte:
procedimento para conectar em uma porta verificando se ela está livre
- Código: Selecionar todos
uses SynaSer,Sysutils,QForms;
...
procedure teste;
var
com:byte;
conectou:boolean;
serial:TBlockSerial;
begin
inherited;
serial:=TBlockSerial.Create;
serial.RaiseExcept:=True;
com:=1;
conectou:=false;
try
//LastError = [ 5 {porta sendo usada}, 2 {porta inexistente}]
while (serial.LastError <> 2) and (not conectou) do
begin
try
serial. Connect('COM'+IntToStr(com));
//no caso do linux o componente transforma a string COMx para o formato linux e visse versa
//se der erro ele pula direto pro except,
//OBS*
conectou:=true;
except
Inc(com);
end;
end;
if serial.LastError = 2 then
Application.MessageBox('Não foi possível conectar, as '+IntToStr(com-2)+' portas estão ocupadas'
,'Transferência de dados',[smbOK]) // com -2 pois a ultima nao existia, deu erro e incremento +1
else
Application.MessageBox('Conectado na COM'+IntToStr(com)
,'Transferência de dados',[smbOK]);
serial.Config(9600,8,'N',0,false,false);
//aqui pode fazer a comunicacao, enviar/receber, tem varias funcoes prontas para todos os gosto
finally
serial.free; //fecha a conecxao
end;
end;
*OBS: neste ponto pode testar se está recebendo uma string pela serial que no caso seria enviada por um uC para que saiba em qual porta ele está conectado (teste duas vezes pois na primeira pode ter pego só a metade da mensagem, de um delay entre as mensagens enviadas pelo uC, e um delay maior para o procedimento de leitura neste programa) , caso não esteja recebendo é só usar serial.RaiseSynaError(5); pra ele pular pro except como se a porta já estivesse sendo usada.
Se alguém tiver outro modo de saber se a porta está livre me avissa!