我在Delphi 2010中遇到了问题。我想从我的PC发送一些带有串行端口(COM端口)的Unicode(16位)字符到打印机。 我在D2010中使用TCiaComPort组件。
例如:
CiaComPort1.Open := True; \\I open the port
Data := #$0002 + UnicodeString(Ж) + #$0003;
CiaComPort1.SendStr(Parancs); //I send the data to the device
如果打印机字符集是ASCII,则字符到达,但是字符是'?'在打印机屏幕上。但如果打印机字符集是Unicode,则字符不会到达打印机。
以2个字节表示的Unicode字符。如何将Unicode字符分解为字节的字节?例如#$ 0002? 如何使用comport发送这个字符串字节的字节?哪个功能?
答案 0 :(得分:0)
CiaComPort1.SendStr()
是否接受AnsiString
或UnicodeString
作为输入?您是否尝试使用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端口。
答案 1 :(得分: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;