如何监测串口数据?

bbsboyy 2000-04-22 12:18:00
如何监测流过串口的所有数据?
能否举例说明?
...全文
491 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbsboyy 2000-06-22
  • 打赏
  • 举报
回复
高级的怎么实现?
wpkiller 2000-05-30
  • 打赏
  • 举报
回复
如果是一个程序用来监视系统中所有的流过串口的数据(进,出),好像只有用硬件来实现。

我原来参加 moxa 的一个会时,他们有一个装置,简单说就是串口线的两边各多并了一个口出来。用这个装置应该可以。

另外,我觉得用高级的 windows ddk 应该也可以实现,而且不需要用硬件。
wpkiller 2000-05-29
  • 打赏
  • 举报
回复
如果是自己的程序用 api 就可以了。如 ClearCommError();WaitForSingleObject();等
bbsboyy 2000-05-29
  • 打赏
  • 举报
回复
能否在程序中直接监测串口1/2的数据?
最好不用硬件。
bbsboyy 2000-05-29
  • 打赏
  • 举报
回复
一个程序已经打开串口,另一个若再打开此串口出错,怎么办?
hlbl11 2000-04-23
  • 打赏
  • 举报
回复
如果你有moxa的窜口驱动程序,实现这个功能非常简单。以下是用于工业RS485通讯的例子
如果你要检测别人的程序所发送或接受的数据,你需要2台机器,自己编程序,作用相当于路由器。
Function GetPIDValue(ID: integer;Act: integer;Var Value:Real): Boolean;
var
S1,S2 : String;
i1,K,L : Longint;
i2 : integer;
CRCB : Byte;
Begin
Str(ID,S1);
if Length(S1)<2 then S1:='0'+S1;
S1:=Chr(4)+S1+ActDefine[Act]+Chr(5);
sioFlush(RS485Port,2);
i1:=sioWrite(RS485Port,S1,Length(S1));
if i1<0 then
Begin
WriteError(MyErrMsg(20));//写通讯错误
RS485Alarm:=True;
GetPIDValue:=False;
Exit;
End;
K:=0;
L:=sioIqueue(RS485Port);//有多少在缓冲区
Repeat
Sleep(20);
if L=sioIqueue(RS485Port) then inc(K)
else L:=sioIqueue(RS485Port)
until K>=2;
if L>0 then
Begin
SetLength(S2,100);//缓冲可以很大
i2:=sioRead(RS485Port,S2,L);
if i2>0 then
Begin
S2[i2+1]:=chr(0);
While (S2<>'')and(S2[1]=#4) do Delete(S2,1,1);
if Length(S2)>=11 then
Begin
CRCB:=0;
For i2:=2 to 10 do
CRCB:=CRCB XOR Ord(S2[i2]);
if Ord(S2[11])=CRCB then
Begin
Val(Copy(S2,4,6),Value,i2);
GetPIDValue:=True;
RS485Alarm:=False;
Exit;
End else Begin WriteError(MyErrMsg(23)); RS485Alarm:=True;end;//通讯校验错
End else Begin WriteError(MyErrMsg(22));RS485Alarm:=True;end;//通讯不完整
End else Begin WriteError(MyErrMsg(21));RS485Alarm:=True;end;//读通讯错误
End else Begin WriteError(MyErrMsg(24));RS485Alarm:=True;end;;//通讯无回应
GetPIDValue:=False;
End;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧