Serial port Windows CE编程串行端口-获取乱码输出

Serial port Windows CE编程串行端口-获取乱码输出,serial-port,lazarus,fpc,Serial Port,Lazarus,Fpc,我正在编程一个WindowsCE6设备(摩托罗拉MC3100扫描终端)。使用Lazarus FPC进行编译 经过3周的工作后,我不情愿地在这里发帖,希望有人能建议我为什么从串行端口得到乱码输出 下面是我使用的代码。这是我在几个地方找到的标准代码 OpenPort工作正常 当我使用SendString('ABCDEF')发送字符串时,会将乱码输入到PC串行端口,例如: 4[#131][#26][#0][#0][#0][#0](括号内的数据表示它是不可打印的字符ASCII码) 显然,它正在连接到端口

我正在编程一个WindowsCE6设备(摩托罗拉MC3100扫描终端)。使用Lazarus FPC进行编译

经过3周的工作后,我不情愿地在这里发帖,希望有人能建议我为什么从串行端口得到乱码输出

下面是我使用的代码。这是我在几个地方找到的标准代码

OpenPort工作正常

当我使用SendString('ABCDEF')发送字符串时,会将乱码输入到PC串行端口,例如:

4[#131][#26][#0][#0][#0][#0](括号内的数据表示它是不可打印的字符ASCII码)

显然,它正在连接到端口OK,并且正在发送正确的字符数(7)

我尝试过波特率、数据位、奇偶校验位和停止位的所有组合,没有任何乐趣。还尝试在不同的电脑上更换电缆等

我是否需要在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.

找到了答案

写文件(hComm,str,Length(str),lrc,nil)

“str”参数实际上是指向字符串的指针,而不是字符串本身

把它改成这样行得通

写文件(hComm,str[1],长度(str),lrc,nil)