首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi-xe7 arduino tpapro ApdComPort读

Delphi-xe7 arduino tpapro ApdComPort读
EN

Stack Overflow用户
提问于 2015-04-11 18:33:32
回答 2查看 1.9K关注 0票数 1

我想通过Usb(串行)从我的Arduino读取一个字符串。我做了这个脚本,但它有一个问题:

代码语言:javascript
复制
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
msg:string;
I:word;
C:ansichar;
begin
msg := '';
for I := 1 to count do
begin
C := apdComPort1.GetChar;
if C = #7 = false then
begin
if C in [#32..#126] then
begin
  msg := msg + C;
end;
end;
end;
listbox1.Items.Add(msg);
msg := '';
end;

问题是“伯爵”是不对的。例如,当我发送"Backspace“时,这是输出:

代码语言:javascript
复制
Bac
kspace

但是在arduino系列监视器上它工作得很好。有谁知道为什么“伯爵”是不正确的,以及如何修正它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-12 01:41:38

正如雷米所说,在串行通信中接收数据时,同一字符串可能会有许多事件触发器。事实上,每个字节都是一个事件,但是驱动程序通常会缓冲数据。

要知道消息的结尾,您应该在消息的末尾添加一些char序列。如果您使用Serial.println()而不是Serial.print()从Arduino发送字符串,那么它将在文本之后添加一个新的行标记。这样,您只需要将字符添加到ListBox1.Items.Text属性中,而不是使用Add函数。您需要允许字符#10和#13使这一工作。

代码语言:javascript
复制
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  C: AnsiChar;
begin
  while Count > 0 do
  begin
    Dec(Count);
    C := apdComPort1.GetChar;
    if C in [#32..#126, #10, #13] then
    begin
      ListBox1.Items.Text := ListBox1.Items.Text + C;
    end;
  end;
end;

此外,如果您这样做,您不需要发送钟字符(#7)。

票数 1
EN

Stack Overflow用户

发布于 2015-04-11 19:58:15

假设完整的数据和事件之间存在1比1的关系.没有这样的保证。接收完整数据可能需要多个事件。这一事件只是简单地报告了当时有一些可用的数据。在您的示例中,您可能收到一个包含3个字符的事件,然后收到其余6个字符的第二个事件。您调用了两次Add(),一次针对数据的每一部分,而不是一次针对完整的数据。

因此,您必须分析正在接收的数据,根据需要在事件之间缓存数据,然后只有在需要显示完整数据时才调用Add()。例如:

代码语言:javascript
复制
var
  msg: string;

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  I: Word;
  C: AnsiChar;
begin
  for I := 1 to Count do
  begin
    C := apdComPort1.GetChar;
    if C <> #7 then
    begin
      if C in [#32..#126] then
      begin
        msg := msg + C;
      end;
    end else
    begin
      ListBox1.Items.Add(msg);
      msg := '';
    end;
  end;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29581576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档