Connexion via Bluetooth avec Delphi XE7 à l'aide d'une imprimante portable
j'essaie de communiquer avec un Sewoo LK-P32 imprimante via Bluetooth. Pour cela, je suis en utilisant Delphi XE7. J'ai fait quelques exemples qui viennent avec Delphi et n'ont pas de succès. J'ai mis l'imprimante jumelée dans la tablette et même alors je ne suis pas en mesure d'imprimer en continu.
quand j'imprime quelque chose doit redémarrer l'application, pour que je puisse imprimer quelque chose à nouveau. Ci-dessous mes sources.
quelqu'un Pourrait-il m'aider? Appuyer sur cette question? Mon temps est court pour essayer d'autres technologies.
méthode qui initie la communication avec l'imprimante
procedure TForm2.ButtonClickStart(Sender: TObject);
var
Msg, Texto: string;
I, B: Integer;
BluetoothAdapter: TBluetoothAdapter;
ListaDeAparelhosPareados: TBluetoothDeviceList;
LServices: TBluetoothServiceList;
begin
try
Memo1.Lines.Add('Ponto 1');
FBluetoothManager := TBluetoothManager.Current;
if FBluetoothManager = nil then
Memo1.Lines.Add('FBluetoothManager esta nulo');
Memo1.Lines.Add('Ponto 2');
BluetoothAdapter := FBluetoothManager.CurrentAdapter;
if BluetoothAdapter = nil then
Memo1.Lines.Add('BluetoothAdapter esta nulo');
ListaDeAparelhosPareados := BluetoothAdapter.PairedDevices;
Memo1.Lines.Add('Ponto 3');
if ListaDeAparelhosPareados = nil then
Memo1.Lines.Add('ListaDeAparelhosPareados esta nulo');
for I := 0 to ListaDeAparelhosPareados.Count - 1 do
begin
LDevice := ListaDeAparelhosPareados[I] as TBluetoothDevice;
if LDevice.IsPaired then
begin
LServices := LDevice.GetServices;
for B := 0 to LServices.Count - 1 do
begin
ServiceGUI := GUIDToString(LServices[B].UUID);
Guid := LServices[B].UUID;
ServiceName := LServices[B].Name;
Memo1.Lines.Add(LServices[B].Name + ' --> ' + ServiceGUI);
Memo1.GoToTextEnd;
end;
end;
end;
except
on E: Exception do
begin
Msg := E.Message;
Memo1.Lines.Add('Erro ao Conectar na Impressora: ' + Msg);
Memo1.GoToTextEnd;
end;
end;
end;
Méthode qui envoie le texte à l'imprimante
procedure TForm2.ButtonClickSendText(Sender: TObject);
var
FSocket: TBluetoothSocket;
ToSend: TBytes;
Msg, Texto: String;
begin
try
Memo1.Lines.Add('Aparelho pareado:' + BoolToStr(LDevice.IsPaired));
Memo1.Lines.Add('Dados do Guid:' + GUIDToString(Guid));
FSocket := LDevice.CreateClientSocket(Guid, true);
if FSocket = nil then
Memo1.Lines.Add('FSocket nulo');
Memo1.Lines.Add('Criou Bluetooth Cliente.');
Memo1.GoToTextEnd;
if FSocket <> nil then
begin
// FSocket.Connect;
FSocket.Connect;
Memo1.Lines.Add('Criou socket cliente com o ServerSocket');
Texto := #27 + '|cA' + 'Teste' + #13#10;
ToSend := TEncoding.UTF8.GetBytes(Texto);
FSocket.SendData(ToSend);
Memo1.Lines.Add('Enviou ' + Texto + ' para a impressora.');
end
else
begin
Memo1.Lines.Add('FSocket nulo.');
end;
except
on E: Exception do
begin
Msg := E.Message;
Memo1.Lines.Add('Erro ao Conectar na Impressora: ' + Msg);
Memo1.GoToTextEnd;
end;
end;
end;
2 réponses
dans votre boucle, vous continuez à assigner lDevice
. Si il y a une deuxième dissociée de l'appareil, puis lDevice
pointe vers que. Vous avez besoin de haut Exit
une fois que vous avez détecté qu'il est couplé.
de plus, personnellement, je n'aime pas soulever des exceptions délibérément. Si une instance de classe est nulle, alors vous devriez sortir, et y percer..
Par exemple
if FBluetoothManager = nil then
begin
Memo1.Lines.Add('FBluetoothManager esta nulo');
Exit;
end;
j'ai recréé votre programme, et j'ai le même problème, mais le changement de votre code, ça fonctionne pour moi maintenant.
Le problème est ici
if FSocket <> nil then
begin
// FSocket.Connect;
FSocket.Connect;
Memo1.Lines.Add('Criou socket cliente com o ServerSocket');
Texto := #27 + '|cA' + 'Teste' + #13#10;
ToSend := TEncoding.UTF8.GetBytes(Texto);
FSocket.SendData(ToSend);
Memo1.Lines.Add('Enviou ' + Texto + ' para a impressora.');
end
tout d'abord, je recommande D'ajouter Fsocket comme propriété privée, et de ne créer qu'un seul objet fsocket. Ainsi, votre code sera changé en
if (Assigned(LDevice)) And (Assigned(FSocket))
then Begin
if Not FSocket.Connected
then FSocket.Connect
End
Else Begin
FSocket := LDevice.CreateClientSocket(Guid, True);
Memo1.Lines.Add('Device Socked created to '+LDevice.DeviceName);
FSocket.Connect;
End;
après la connexion, vous pouvez appeler un TTimer pour envoyer ce que vous voulez, o créer une vérification de méthode si Fsocket est connecté.
if Assigned(FSocket)
then Begin
if FSocket.Connected
then Begin
Texto := #27 + '|cA' + 'Teste' + #13#10;
ToSend := TEncoding.UTF8.GetBytes(Texto);
FSocket.SendData(ToSend);
Sleep(100);
End;
End;
vous pouvez aussi ajouter un sommeil entre 2 commandes, pour être sûr que les données sont reçues et exécutées par votre imprimante.
dans mon cas, j'ai utilisé un module Arduino width Bluetooth HC-06.