2016-12-28 111 views
5

Story:我的應用程序專爲移動平臺而設計,並與藍牙點陣打印機有自己的連接,用於打印區域或現場的一些發票和文檔。一些Android設備運行良好,但其中一些在用戶嘗試打印某些內容時總會拋出破損的管道異常。德爾福Firemonkey「Broken Pipe」異常

過程:

  1. 我用TBluetoothManagerTBluetoothDeviceList用於獲取配對設備列表,我存儲在配置INI文件的所有配對設備。
  2. 當用戶想要打印時,我初始化連接已準備好打印的設備,然後我將發票一行一行地發送到TBluetoothSocket對象。
  3. 我用這個函數把我的每一行改爲Byte數組;

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

然後,我把我的值作爲字節數組TBluetoothSocket.SendData(Byte>) Method

問題:我試圖用10+不同的設備打印我的價值觀和成功率不夠好( 8/20設備工作正常)。我該怎麼辦?

回答

3

最簡單的方法是使用Androidapi.JNI.BluetoothAdapter.pas庫直接從Delphi代碼處理所有這些配置。 它有JBluetoothSocketClass它工作正常!

-

將您的字符串值,以字節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; 

輸出流的使用

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