|
|
 |
Delphi串口通讯的监听 |
热 ★★★★ |
|
Delphi串口通讯的监听 |
|
作者:闵涛 文章来源:闵涛的学习笔记 点击数:700 更新时间:2009/4/23 18:24:52  |
|
|
串口程序我后来研究了好久,写了下面的代码,后台生成一个线程监听串口,不影响前台工作。效果很好,一直用于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; file://经度、纬度 VID : string; file://车号 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; file://if (dwLength>0){ FreeMem(ComStat); end;{while} end; constructor TCommThread.Create; begin FreeOnTerminate := TRUE; inherited Create(FALSE); file://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.
没有相关教程
|
|
| 教程录入:mintao 责任编辑:mintao |
|
|
上一篇教程: 多层结构连接方式选择的分析 下一篇教程: Delphi数据库编程技巧 |
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网] |
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| |
|
|
|
|
|
 |
同类栏目 |
 |
 |
赞助链接 |
 |
|
500 - 内部服务器错误。
|
|
|
|
|
|