我想把数据发送到com端口,但是我正在通话的设备只接受ASCII或HEX,而我发送的是字符串..我怎么能改变它来发送ASCII或Hex呢?
hCommFile: THandle;
在创建..
hCommFile := CreateFile(PChar('COM1'),
GENERIC_READ,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
发送数据
{****************************************************************************}
procedure TForm4.WriteString(sToSend:string);
//While in THIS program, we only write stings,
// this procedure is perfectly capable of sending a
// "string" consisting of a single character.
var NumberWritten : dWord;
//The type of NumberWritten is problematic... some
//posts online say use dWord, others say use longint.
//Perhaps it is a matter of what version of Windows
// and/or Delphi you have? For XP + Delphi 4, dWord is right.
begin
if WriteFile(hCommFile,
PChar(sToSend)^,
Length(sToSend),
NumberWritten,
nil)=false then
showmessage('Unable to send');
end;//WriteString
答案 0 :(得分:2)
更改
procedure TForm4.WriteString(sToSend:string);
到
procedure TForm4.WriteString(const sToSend:ansistring);
和
PChar(sToSend)^,
到
PAnsiChar(sToSend)^,
应该有用......
您的问题是XE2对字符串使用UniCode(每个字符2个字节),因此您需要将字符串转换为每个字符格式1个字节。最简单的方法是将参数声明为AnsiString(旧的STRING类型),让编译器在幕后为您完成所有hocus pocus。
答案 1 :(得分:2)
Delphi字符串从未进行过ASCII编码。在Delphi 2009之前,Delphi使用8位ANSI编码字符串。现代版本使用16位UTF-16编码的字符串。您正在发送UTF-16编码的文本,其中需要8位ASCII。更重要的是,因为UTF-16字符元素是两个字节宽,并且Length()
返回字符数而不是字节数,所以您只将错误编码的字符串的一半发送到comm端口。
使用SysUtils.TEncoding
类将UTF-16编码的字符串转换为8位ASCII编码的字节数组:
bytes := TEncoding.ASCII.GetBytes(text);
您对此的使用可能如下所示:
procedure WriteString(const str: string);
var
bytes: TBytes;
BytesWritten: DWORD;
begin
bytes := TEncoding.ASCII.GetBytes(str);
if not WriteFile(hCommFile, Pointer(bytes)^,
Length(bytes), BytesWritten, nil) then
// handle error
end;
您的代码是作为GUI表单中的方法实现的。这感觉就像是错误的地方。低级包装类可以为您提供更好的封装和可重用性。