2012-09-27 6 views
0

Windows CE 6 장치 (Motorola MC3100 스캐너 터미널)를 프로그래밍 중입니다. Lazarus FPC를 사용하여 컴파일하기.Windows CE 프로그래밍 직렬 포트 - 왜곡 된 출력 받기

3 주 후에 저는 마지 못해 여기 누군가가 왜 직렬 포트에서 왜곡 된 출력을 얻고 있는지 제안 할 수있는 희망을 게시합니다.

사용중인 코드는 아래에 게시되어 있습니다. 이것은 여러 곳에서 찾은 표준 코드입니다.

OpenPort가 정상적으로 작동합니다.

4 # 131] [# 26] [# 0] # 0] : I가 SendString를 사용하여 문자열을 보내면

는 ('ABCDEF')는 I는 등의 PC 직렬 포트에 잘못된 입력을받을 # 0] [# 0] (대괄호로 묶인 데이터는 인쇄 할 수없는 문자 ASCII 코드임을 나타냅니다.)

분명히 포트에 연결하고 올바른 문자를 보내고 있습니다 (7).

저는 Baud Rate, Data Bits, Parity 및 Stop Bits의 모든 조합을 기쁨없이 시도했습니다. 다른 PC 등에서도 케이블 교체를 시도했습니다.

DCB에 다른 것을 설정할 필요가 있습니까?

어떤 도움이나 제안이라도 대단히 감사하겠습니다.

unit Unit1; 
{$mode objfpc}{$H+} 
interface 
uses 
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, 
Windows, LResources; 

type 
{ TForm1 } 
TForm1 = class(TForm) 
Button1: TButton; 
Button2: TButton; 
Label1: TLabel; 
procedure Button1Click(Sender: TObject); 
procedure Button2Click(Sender: TObject); 
function OpenPort(ComPort:String;BaudRate,ByteSize,Parity,StopBits:integer):String; 
procedure SendString(str:String); 

private 
{ private declarations } 
public 
{ public declarations } 
end; 

var 
Form1: TForm1; 

cc:TCOMMCONFIG; 
Connected:Boolean; 

implementation 
{$R *.lfm} 
var F: TextFile; 
var hComm: THandle; 
str: String; 
lrc: LongWord; 

{ TForm1 } 
function 
OpenPort(ComPort:String;BaudRate,ByteSize,Parity,StopBits:integer):String; 

var 
cc:TCOMMCONFIG; 
SWide:WideString; 
Port:LPCWSTR; 

begin 
SWide:=ComPort; 
Port:=PWideChar(SWide); 
result:=''; 
if (1=1) then begin 
Connected:=False; 
hComm:=CreateFile(Port, GENERIC_READ or GENERIC_WRITE,0, nil,OPEN_EXISTING,0,0); 
if (hComm = INVALID_HANDLE_VALUE) then begin 
ShowMessage('Fail to Open'); 
exit; 

end; 
GetCommState(hComm,cc.dcb); 
cc.dcb.BaudRate:=BaudRate; 
cc.dcb.ByteSize:=ByteSize; 
cc.dcb.Parity:=Parity; 
cc.dcb.StopBits:=StopBits; 

if not SetCommState(hComm, cc.dcb) then begin 
result:='SetCommState Error!'; 
CloseHandle(hComm); 
exit; 
end; 
Connected:=True; 
end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
OpenPort('COM1:',9600,8,0,0); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
SendString('ABCDEFG'); 
end; 

procedure TForm1.SendString(str:String); 
var 
lrc:LongWord; 
begin 
if (hComm=0) then exit; 
try 
if not PurgeComm(hComm, PURGE_TXABORT or PURGE_TXCLEAR) then 
raise Exception.Create('Unable to purge com: '); 
except 
Exit; 
end; 
WriteFile(hComm,str,Length(str), lrc, nil); 
end; 

end. 

답변

2

답을 찾았습니다.

WriteFile (hComm, str, Length (str), lrc, nil);

은 "STR"매개 변수가 실제로 문자열에 대한 포인터가 아닌이 작품에 변경 문자열 자체

했다.

WriteFile (hComm, str [1], Length (str), lrc, nil);