web-dev-qa-db-ja.com

ポータブルプリンターを使用して、Bluetooth経由でDelphiXE7に接続します

ブルートゥース経由でSewoo LK-P32プリンターと通信しようとしています。このために、私はDelphi XE7を使用しています。 Delphiに付属しているいくつかの例を作成しましたが、成功していません。ペアリングしたプリンターをタブレットに置いても、連続して印刷できません。

何かを印刷するときは、アプリケーションを再起動する必要があるため、何かを再度印刷できます。私の情報源の下。

誰かが私を助けることができますか?この問題をサポートしますか?私の時間は他の技術を試すのに短いです。

プリンターとの通信を開始する方法

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;

テキストをプリンターに送信する方法

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; 
18

私はあなたのプログラムを再作成しました、そして私は同じ問題を抱えています、しかしあなたのコードを変えることは今私にとってうまく働いています。

問題はここにあります

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

まず、Fsocketをプライベートプロパティとして追加し、fsocketオブジェクトを1つだけ作成することをお勧めします。したがって、コードは次のように変更されます

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;

接続後、TTimerを呼び出して必要なものを送信できます。oFsocketが接続されているかどうかを確認するメソッドを作成します。

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;

また、2つのコマンドの間にスリープを追加して、データがプリンターによって受信および実行されるようにすることもできます。

私の場合、Arduino幅のBluetoothhc-06モジュールを使用しました。

1
Lionel Siero

ループでは、lDeviceに割り当て続けます。ペアリングされていない2番目のデバイスがある場合、lDeviceはそれを指しています。ペアリングされていることを検出したら、top Exitが必要です。

また、私は個人的に意図的に例外を発生させるのは好きではありません。クラスインスタンスがnilの場合は、終了する必要があります。ドリルダウンしないでください。

例えば

if FBluetoothManager = nil then
begin
  Memo1.Lines.Add('FBluetoothManager esta nulo');
  Exit;
end;
0
Rohit Gupta