我试图向开发者发送命令。董事会然后收到回复
E.G
(我)设置attrib = yes
(开发板)O.K
或
(开发板)E.R.R
但它没有反弹任何东西......不是O.K或E.R.R
当主板启动时,回显已启用..所以如果我在主板启动时发送命令 它会反弹'set attrib = yes'并且一旦启动'E.R.R',因为你无法在启动时发送命令。
我最好的猜测是,它没有及时阅读回复或试图过早阅读。
procedure TReaderProgrammer.Button2Click(Sender: TObject);
Var
Buffer: AnsiString;
RxData: string;
Count : integer;
begin
if ComPort1.Connected then
begin
ComPort1.WriteStr(edtSendText.Text+#13);
comport1.ReadStr(RxData,Count);
Buffer := Buffer + Rxdata;
memoRxData.Text := memoRxData.Text+Buffer+#13+#10;
end;
end;
答案 0 :(得分:3)
这里有几个悬而未决的问题,所以我必须做出一些可能错误的假设,但是让我们看看。
我不知道你正在使用什么通讯端口库,所以我假设它是来自SourceForge的CPort库。我自己从未使用过它,但我已经读过它可以识别Unicode,因此您可以使用unicodestring参数调用write方法,该参数在发送之前将由库转换为ansistring。类似地,当从外部世界接收ansistring时,库将转换为用于Read方法的unicodestring。
由于串行通信的异步性质,重要的是要理解当您使用write方法发送内容时,该方法会立即返回,而库和操作系统会按照由此定义的速度一次性地吐出一个字符。波特率。因此,您的第一个代码从未收到任何内容,因为您已经尝试在外部设备甚至收到第一个字符之前从通信端口读取。 很高兴看到你现在通过为(可能是库事件)OnRxChar实现事件处理程序迈出了成功的第一步。
OnRxChar可能会为每个字符(或几个字符)触发。您需要在这些事件之间具有持久性的缓冲区。事件处理程序中的本地var(就像你现在拥有它并在栈上分配的那样)不是持久的,每次事件处理程序退出时它都会丢失。 您应该将Buffer变量声明为TReaderProgrammer的字段。我不知道为什么你将缓冲区定义为AnsiString,但我建议你尝试使用string(上面有关Unicode认知的参考讨论)。
type
TReaderProgrammer = class
..
RxBuffer: string;
..
end;
当您向外部设备发送新命令时,需要清除缓冲区,以便它准备好接收新数据作为对命令的响应。
编辑:或者,您可以在收到并处理完整回复后立即清除RxBuffer。
TReaderProgrammer.ComPort1RxChar应该看起来像这样:
procedure TReaderProgrammer.ComPort1RxChar(Sender: TObject; Count: Integer);
var
RxData : string;
begin
(Sender as TComPort).ReadStr(RxData,Count);
RxBuffer := RxBuffer + Rxdata;
...
end;
我想,事件处理程序的其余部分可能只是为了看到接收的进展,所以没有更多关于此。