如何监视已打开的串口?(100分)

  • 主题发起人 主题发起人 yyk518
  • 开始时间 开始时间
Y

yyk518

Unregistered / Unconfirmed
GUEST, unregistred user!
我要知道它发送和接收的数据。
 
串口程序我后来研究了好久,写了下面的代码,后台生成一个线程监听串口,不
影响前台工作。效果很好,一直用于GPS仪器的数据接收,

unit frmComm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls,GeoUtils,GeoGPS;

const MAXBLOCK = 160;

type
TComm = record
idComDev : THandle;
fConnected : Boolean;
end;

TCommForm = class(TForm)
ComboBox1: TComboBox;
Button1: TButton;
StatusBar1: TStatusBar;
Button2: TButton;
ComboBox2: TComboBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

TCommThread = Class(TThread)
protected
procedure Execute;override;
public
constructor Create;
end;

var
CommForm: TCommForm;
CommHandle : THandle;
Connected : Boolean;
CommThread : TCommThread;

implementation

{$R *.DFM}

uses
frmMain,frmMdiMapView;

procedure TCommThread.Execute;
var
dwErrorFlags,dwLength : DWORD;
ComStat : PComStat;
fReadStat : Boolean;
InChar : Char;
AbIn : String;
XX,YY : double; //经度、纬度

VID : string; //车号
begin
while Connected do begin
GetMem(ComStat,SizeOf(TComStat));
ClearCommError(CommHandle, dwErrorFlags, ComStat);
if (dwErrorFlags > 0) then begin
PurgeComm(CommHandle,(PURGE_RXABORT and PURGE_RXCLEAR));
// return 0;
end;
dwLength := ComStat.cbInQue;
if (dwLength>0) then begin
fReadStat := ReadFile(CommHandle, InChar, 1,dwLength, nil);
if (fReadStat) then begin

if (InChar <> Chr(13)) and (Length(abIn) < MAXBLOCK+5 ) then AbIn := AbIn + InChar
else begin
...
{接收完毕,}
end;//if (fReadStat>0){
end; //if (dwLength>0){
FreeMem(ComStat);
end;{while}
end;

constructor TCommThread.Create;
begin
FreeOnTerminate := TRUE;
inherited Create(FALSE); //Createsuspended = false
end;

//
procedure TCommForm.Button1Click(Sender: TObject);
var

CommTimeOut : TCOMMTIMEOUTS;
DCB : TDCB;
fRetVal : Boolean;
begin
StatusBar1.SimpleText := '连接中...';
CommHandle := CreateFile(PChar(ComboBox1.Text),GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL
, 0);
if CommHandle = INVALID_HANDLE_VALUE then begin
StatusBar1.SimpleText := '连接失败';
Exit;
end;
StatusBar1.SimpleText := '已同端口 '+ ComboBox1.Text + ' 连接!';
CommTimeOut.ReadIntervalTimeout := MAXDWORD;
CommTimeOut.ReadTotalTimeoutMultiplier := 0;

CommTimeOut.ReadTotalTimeoutConstant := 0;
SetCommTimeouts(CommHandle, CommTimeOut);

GetCommState(CommHandle,DCB);
DCB.BaudRate := 9600;
DCB.ByteSize := 8;
DCB.Parity := NOPARITY;
DCB.StopBits := ONESTOPBIT;
fRetVal := SetCommState(CommHandle, DCB);
if (fRetVal) then begin
Connected := TRUE;
try
CommThread := TCommThread.Create;
except
Connected := FALSE;
CloseHandle(CommHandle);
fRetVal := FALSE;
StatusBar1.SimpleText := '线程建立失败';
Exit;

end;
end
else begin
Connected := FALSE;
CloseHandle(CommHandle);
end;
end;

procedure TCommForm.Button2Click(Sender: TObject);
begin
Connected := FALSE;
CloseHandle(CommHandle);
{终止线程}
CommThread.Terminate;
StatusBar1.SimpleText := '关闭端口'+ComboBox1.Text;
end;

procedure TCommForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Connected := FALSE;
CloseHandle(CommHandle);

StatusBar1.SimpleText := '关闭端口'+ComboBox1.Text;
end;

end.
 
TO :naughtboy
请问您的这段代码能否监视已经打开的串行口?
我原来也是用OPEN_EXISTING参数调用CreateFile函数的,但不行啊。
我再试试,如果行,分就是您的啦![:D]
 
不可能行的。
如果只想截数据,可以用工具
http://vip.6to23.com/NowCan1/tools/portmon.zip
http://nowcan.yeah.net
 

有一个软件,专门监视串口数据,界面很像示波器

可以实现你要的功能。

名字我要去找一下。
 
工具我有,就是想看看在DELPHI中编程如何实现!
如果不可能,那portmon为什么可以呢?
高手们哪去啦?????
 
后退
顶部