2016-12-28 54 views
5

Historia: Moja aplikacja jest przeznaczona dla platform mobilnych i ma własne połączenie z drukarką mozaiką punktową, aby wydrukować niektóre faktury i dokumenty na temat obszaru lub pola. Niektóre z urządzeń z Androidem działają świetnie, ale niektóre z nich zawsze wyrzucają zepsute wyjątki, gdy użytkownicy próbują coś wydrukować.Delphi Firemonkey "Broken Pipe" Wyjątek

Proces:

  1. użyłem TBluetoothManager i TBluetoothDeviceList uzyskania listy sparowanych urządzeń i przechowywane wszystkie sparowane urządzenia w config plików INI.
  2. Gdy użytkownik chce drukować, inicjuję połączenie z urządzeniem, które jest gotowe do drukowania, a następnie wysyłam fakturę po linii do obiektu TBluetoothSocket.
  3. Zmieniam każdą linię na Bajtową tablicę za pomocą tej funkcji;

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

Wtedy wyślę moje wartości jako Byte Array do TBluetoothSocket.SendData(Byte>) Method

Problem: Próbowałem wydrukować moje wartości z 10+ różnymi urządzeniami i wskaźnik sukcesu nie jest wystarczająco dobre (8/20 urządzeń działa bez zarzutu). Co powinienem zrobić?

Odpowiedz

3

Najprostszym sposobem jest użycie biblioteki Androidapi.JNI.BluetoothAdapter.pas do obsługi wszystkich tych konfiguracji bezpośrednio z kodów Delphi. Ma JBluetoothSocketClass i działa poprawnie!

-

Konwersja wartości ciągów bajt 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; 

wykorzystanie strumienia wyjściowego

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