2016-12-28 5 views
5

Geschichte: Meine Anwendung ist für mobile Plattformen konzipiert und hat eine eigene Verbindung mit Bluetooth-Nadeldrucker, um einige Rechnungen und Dokumente auf Fläche oder Feld zu drucken. Einige Android-Geräte funktionieren gut, aber einige von ihnen werfen immer gebrochene Pipe-Ausnahme, wenn Benutzer versuchen, etwas zu drucken.Delphi Firemonkey "Broken Pipe" Ausnahme

Prozess:

  1. benutzte ich TBluetoothManager und TBluetoothDeviceList für gekoppelte Geräte Liste bekommen und ich alle gekoppelten Geräte in Config-ini-Dateien gespeichert.
  2. Wenn Benutzer drucken möchte, initiiere ich die Verbindung mit dem Gerät, das zum Drucken bereit ist, und dann zahle ich Rechnung Zeile für Zeile an TBluetoothSocket Objekt.
  3. Ich ändere meine jede Zeile zu Byte-Array mit dieser Funktion;

function StrToByteArr(strData: String): TArray<Byte>; var eEncoding: TEncoding; begin eEncoding := TEncoding.GetEncoding(857); Result := eEncoding.GetBytes(strData); end;

Dann sende ich meine Werte als Byte-Array zu TBluetoothSocket.SendData(Byte>) Method

Problem: Ich versuchte, meine Werte mit 10+ verschiedenen Geräten und Erfolgsquote ist nicht gut genug zu drucken (8/20 Geräte sind in Ordnung). Was soll ich machen?

Antwort

3

Der einfachste Weg ist die Verwendung Androidapi.JNI.BluetoothAdapter.pas Bibliothek, um alle diese Konfigurationen direkt aus Delphi-Codes zu behandeln. Es hat JBluetoothSocketClass und es funktioniert gut!

-

Ihre String-Werte konvertieren Javaarray

function StringToJA(Data: String): TJavaArray<Byte>; 
var 
    X: integer; 
    len: integer; 
begin 
    len := Length(Data); 
    Result := TJavaArray<Byte>.Create(len); 
    for X := 0 to len do 
    begin 
    Result.Items[X] := Ord(Data[X]); 
    end; 
end; 

Output Stream Nutzung

oStream := Sock.getOutputStream; 
    text := CHR(15) + ' ------ ----- HELLO WORLD ----- ------' 
       + CHR(10) + CHR(13); 
    oStream.write(StringToJA(text)); 
bis Byte
Verwandte Themen