发送ASCII而不是字符串

时间:2014-06-02 03:31:46

标签: delphi delphi-xe2

我想把数据发送到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

2 个答案:

答案 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表单中的方法实现的。这感觉就像是错误的地方。低级包装类可以为您提供更好的封装和可重用性。