Lazarus实战开发之串口通信(WINCE-WIN32)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Lazarus实战开发之串口通信(WINCE/WIN32)
Lazarus最吸引人的地方就是她的开发方式类似Delphi,支持超好用的RAD开发方式,并且最厉害的地方是她还支持多个平台,多个CPU,例如ARM9的WINCE。
本文要讲述的就是“如何使用LAZARUS开发Wince上的串口程序”,并且,本文的串口程序同时支持WINCE和WINXP系统,当然编译时要选择平台啦。WINCE与WINXP 在本文中的代码区别只是OpenPort(‘COM1:’,CBR_9600,8,NOPARITY,ONESTOPBIT);//wince用COM1:表示串口1;WINXP用COM1表示串口1.
一、建立一个可重用的类,文件名为CE_Series.pas:
unit CE_Series;
interface
uses
Windows,Classes, SysUtils, LResources, StdCtrls,ExtCtrls;
type
TCE_Series = class(TObject)
private
hComm: THandle;
public
Function OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;
procedure Send(str:String);
Function Receive():String;
procedure ClosePort();
end;
implementation
//============================================================================== =================
// 语法格式:OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer)// 实现功能:打开串口
// 参数:port,串口号;例如wince下为从COM1:,COM2:。..。.win32下为COM1,COM2.。..。.. ;其他略,顾名思义哈
// 返回值:错误信息
//============================================================================== =================
function TCE_Series.OpenPort(Port:LPCWSTR;BaudRate,ByteSize,Parity,StopBits:integer):String;
var
cc:TCOMMCONFIG;
begin
result:=‘’;
hComm:=CreateFile(port, GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0); // 打开COM
if (hComm = INVALID_HANDLE_VALUE) then begin // 如果COM 未打开
result:=‘CreateFile Error!’;
exit;
end;
GetCommState(hComm,cc.dcb); // 得知目前COM 的状态
cc.dcb.BaudRate:=BaudRate; // 设置波特率为BaudRate
cc.dcb.ByteSize:=ByteSize; // 字节为 ByteSize(8 bit)
cc.dcb.Parity:=Parity; // Parity 为 None
cc.dcb.StopBits:=StopBits; // 1 个Stop bit
if not SetCommState(hComm, cc.dcb) then begin// 设置COM 的状态
result:=‘SetCommState Error!’;
CloseHandle(hComm);
exit;
end;
end;
//============================================================================== =================
// 语法格式:Send(str:String)
// 实现功能:发送数据
// 参数:str,数据
// 返回值:无
//============================================================================== =================
procedure TCE_Series.Send(str:String);
var
lrc:LongWord;
begin
if (hComm=0) then exit; //检查Handle值
WriteFile(hComm,str,Length(str), lrc, nil); // 送出数据
end;
//=====================================================================
//语法格式: Receive()
//实现功能:接收串口数据
//参数:无
//返回值:收到的字符串
//=====================================================================
Function TCE_Series.Receive():String;
var
inbuff: array[0..2047] of Char;
nBytesRead, dwError:LongWORD ;
cs:TCOMSTAT;
begin