如何在Delphi 2010中使用串行端口发送Unicode字符(16位)?

时间:2013-05-08 19:40:46

标签: delphi delphi-2010

我在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发送这个字符串字节的字节?哪个功能?

2 个答案:

答案 0 :(得分: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端口。

答案 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;