2013-05-08 1 views
0

Delphi 2010에 문제가 있습니다. PC에서 직렬 포트 (COM 포트)가있는 유니 코드 (16 비트) 문자를 프린터로 보내고 싶습니다. D2010에서 TCiaComPort 구성 요소를 사용합니다.Delphi 2010에서 직렬 포트로 유니 코드 문자 (16 비트)를 보내려면 어떻게해야합니까?

예를 들어

: '?'

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

프린터 characterset이 ASCII가 다음 문자가 도착하지만 ciril 문자 인 경우 프린터 화면에. 그러나 프린터 문자 집합이 유니 코드이면 문자가 프린터에 도착하지 않습니다.

2 바이트로 표시된 유니 코드 문자입니다. 유니 코드 문자를 바이트 단위로 분해하려면 어떻게해야합니까? 예 : # $ 0002? 그리고이 문자열을 comport와 함께 byte로 보낼 수 있습니까? 어떤 기능이 있습니까?

+0

왜 프린터 용 Windows 인터페이스를 사용하지 않습니까? –

+1

'CiaComPort1.SendStr()'는'AnsiString' 또는'UnicodeString'을 입력으로 받아들입니까? COM 포트 스니퍼를 사용하여 'CiaComPort'가 예상대로 실제 유니 코드 바이트를 전송하는지 확인 했습니까? –

+0

IMHO, 원시 바이트를 보내고, 인코딩을 처리하고, 무엇을 가지고 있고, 바이트를 전송하는 것이 항상 좋은 생각입니다. – ComputerSaysNo

답변

0

Windows에서 (통신 포트를 열고 쓰는 방법을 OS에 확인하십시오.) COMM 포트에 UnicodeString을 쓰려면 다음 함수를 사용하십시오. 포트가 올바르게 설정되어 있어야한다는 것을 명심하십시오. 비트 수 등을 확인하십시오. 장치 관리자 => 통신 포트

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

0

CiaComPort1.SendStr()AnsiString 또는 UnicodeString 입력으로 동의합니까? COM 포트 스니퍼를 사용하여 CiaComPort이 예상대로 실제 유니 코드 바이트를 전송하는지 확인 했습니까?

당신이 #$0002을 사용하고 #$0003 그 문자는 일반적으로하지 16 비트 값으로, 8 비트 값으로 COM 포트에 전송되기 때문에 나, 실제로 아니라고 생각하게 사실. 이 경우 CiaComPort이 전송하기 전에 유니 코드 -> Ansi 데이터 변환을 수행하는 경우 Ж 문자가 ?으로 변환되는 이유가 설명됩니다. 이 경우에, 당신은 대신이 같은 일을 할 수 있습니다 : CiaComPort 실제로 내부적으로 데이터 변환을 수행하는 경우

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); 

그러나, 당신은 여전히 ​​$7F 위에있는 어떤 인코딩 된 바이트 변환 문제로 실행됩니다.

그런 경우 CiaComPort에 문자열 대신 원시 바이트를 보낼 수있는 다른 전송 방법이 있는지 확인하십시오. 그렇지 않다면, 당신은 거의 SOL이며 더 나은 COM 구성 요소로 전환하거나 OS 포트를 사용하여 COM 포트에 직접 액세스해야합니다.