2013-05-08 57 views
0

我在德爾福2010年有問題。我想從我的電腦發送一些Unicode(16位)字符到串行端口(COM端口)的打印機。 我在D2010中使用TCiaComPort組件。如何在Delphi 2010中使用串口發送Unicode字符(16位)?

例如: '?'

CiaComPort1.Open := True; \\I open the port 
Data := #$0002 + UnicodeString(Ж) + #$0003; 
CiaComPort1.SendStr(Parancs); //I send the data to the device 

如果打印機字符集是ASCII,則字符到達,但ciril性格在打印機屏幕上。但是如果打印機字符集是Unicode,那麼字符不會到達打印機。

以2個字節表示的Unicode字符。如何將Unicode字符分解爲字節的字節?例如#$ 0002? 我怎樣才能發送字符串字節的字節與comport?哪個功能?

+0

爲什麼不使用windows界面打印機? – 2013-05-08 19:44:44

+1

'CiaComPort1.SendStr()'接受一個'AnsiString'或'UnicodeString'作爲輸入嗎?您是否嘗試使用COM端口嗅探器來確保'CiaComPort'正在傳輸實際的Unicode字節? – 2013-05-09 01:44:48

+0

恕我直言,發送原始字節,處理編碼以及你有什麼並且只是發送字節 – ComputerSaysNo 2013-05-09 06:57:03

回答

0

在Windows下(檢查您的操作系統如何打開和寫入通信端口),我使用以下函數將UnicodeString寫入COMM端口:請記住,必須正確設置端口,波特率,位數等等。參見設備管理器=>通信端口

function WriteToCommPort(const sPort:String; const sOutput:UnicodeString):Boolean; 
var 
    RetW:DWORD; 
    buff: PByte; 
    lenBuff:Integer; 
    FH:THandle; 
begin 
    Result:=False; 
    lenBuff:=Length(sOutput)*2; 
    if lenBuff = 0 then Exit; // Nothing to write, empty string 

    FH:= Windows.CreateFile(PChar(sPort), GENERIC_READ or GENERIC_WRITE, 0, Nil, OPEN_EXISTING, 0, 0); 
    if (FH <> Windows.INVALID_HANDLE_VALUE) then 
    try 
     Buff:=PByte(@sOutput[1]); 
     Windows.WriteFile(FH, buff^, lenBuff, RetW, Nil); 
     Result:= Integer(RetW) = lenBuff; 
    finally 
     Windows.CloseHandle(FH); 
    end; 
end; 
+0

親愛的大家。感謝您的回覆和幫助。 – user2363754 2013-05-10 19:41:09

0

是否CiaComPort1.SendStr()接受AnsiStringUnicodeString作爲輸入?您是否嘗試使用COM端口嗅探器來確保CiaComPort正在傳輸實際的Unicode字節?

您使用#$0002#$0003讓我覺得這其實不是,因爲這些字符通常在COM端口傳輸8位值,而不是16位值的事實。如果是這種情況,那麼這將解釋爲什麼Ж字符正在轉換爲?,前提是CiaComPort在傳輸之前正在執行Unicode-> Ansi數據轉換。在這種情況下,你可能不得不做這樣的事情,而不是:

var 
    B: TBytes; 
    I: Integer; 

B := WideBytesOf('Ж'); 
SetLength(Data, Length(B)+2); 
Data[1] := #$0002; 
for I := Low(B) to High(B) do 
    Data[2+I] := WideChar(B[I]); 
Data[2+Length(B)] #$0003; 
CiaComPort1.SendStr(Data); 

但是,如果CiaComPort內部實際上是執行數據轉換,那麼你仍然會碰到那些超過$7F任何編碼字節的轉換問題。

在這種情況下,請查看CiaComPort是否有其他可用的發送方法,以允許您發送原始字節而不是字符串。如果沒有,那麼你幾乎是SOL,並且需要切換到更好的COM組件,或者直接使用OS API直接訪問COM端口。

相關問題