⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chuank.txt

📁 从串口取字符串
💻 TXT
字号:
Ounit whuart;

interface
uses
Windows,SysUtils;
type
EUart = Class(Exception);
TUart = class(TObject)
constructor Create;
destructor Destroy; override;
//打开串口,例:Open('COM1',CBR_9600,'n',8,1)
procedure Open(com:string;bps:longint;par:char;dbit,sbit:byte);
//关闭串口
procedure Close;
//返回输入缓冲区中的字符数
function InbufChars:longint;
//返回输出缓冲区中的字符数
function OutBufChars:Longint;
//写串口 buf:存放要写的数据,len:要写的长度
procedure Send(var buf;len:integer);
//读串口 buf:存放读到的数据,len:要读的长度,tmout:超时值(ms)
//返回: 实际读到的字符数
function Receive(var buf;len:integer;tmout:integer):integer;
//向串口发一个字符
procedure PutChar(ch:char);
//向串口发一个字符串
procedure Puts(s:string);
//从串口读一个字符,未收到字符则返回#0
function GetChar:char;
//从串口取一个字符串,忽略不可见字符,收到#13或255个字符结束,tmout:超时值(ms)
//返回:true表示收到完整字符串,false表示超时退出
function Gets(var s:string;tmout:integer):boolean;
//清接收缓冲区
procedure ClearInBuf;
//等待一个字符串,tmout:超时值(ms),返回false表示超时
function Wait(s:String;tmout:integer):boolean;
//执行一个AT命令,返回true表示成功
function ExecAtComm(s:string):boolean;
//挂机,返回true表示成功
function Hangup:boolean;
//应答,返回true表示成功
function Answer:boolean;

private
OpenFlag: boolean; //打开标志
handle : THandle; //串口句柄
end;



implementation

{$H }

const
CommInQueSize = 4096; //输入缓冲区大小
CommOutQueSize = 4096; //输出缓冲区大小


{**********************
* 计时器 *
**********************}
type
Timers=Class
private
StartTime: TTimeStamp;
public
constructor Create;
Procedure Start; {开始计时}
Function Get:LongInt; {返回计时值(单位:ms)}
end;

//构造函数
constructor Timers.Create;
begin
inherited Create;
Start;
end;

//开始计时
Procedure Timers.Start;
begin
StartTime:=DateTimeToTimeStamp(Now);
end;

//返回计时值(单位:ms)
Function Timers.Get:LongInt;
var
CurTime: TTimeStamp;
begin
CurTime:=DateTimeToTimeStamp(Now);
result:=(CurTime.Date-StartTime.Date)*24*3600000 (CurTime.Time-StartTime.Time);
end;


{******************
* TUart *
******************}

//构造函数
constructor TUart.Create;
begin
inherited Create;
OpenFlag:=False;
end;

//析构函数
Destructor TUart.Destroy;
begin
Close;
inherited Destroy;
end;

{*****
打开串口,例:Open('COM1',CBR_9600,'n',8,1)
波特率:
CBR_110 CBR_19200
CBR_300 CBR_38400
CBR_600 CBR_56000
CBR_1200 CBR_57600
CBR_2400 CBR_115200
CBR_4800 CBR_128000
CBR_9600 CBR_256000
CBR_14400
校验位:
'n'=no,'o'=odd,'e'=even,'m'=mark,'s'=space
数据位: 4-8 (other=8)
停止位: 1-2 (other=1.5)
****}
procedure TUart.Open(com:string;bps:longint;par:char;dbit,sbit:byte);
var
dcb : TDCB;
begin
OpenFlag:=false;
//初始化串口
handle:=CreateFile(PChar(com),
GENERIC_READ GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0 );
if handle = INVALID_HANDLE_VALUE then
begin
raise EUart.Create('无法打开串口:' com);
exit;
end;
GetCommState(handle,dcb);
with dcb do
begin
BaudRate:=bps; // 波特率
if dbit in [4,5,6,7,8] then // 数据位
ByteSize:=dbit
else
ByteSize:=8;
case sbit of // 停止位
1: StopBits:=0; // 1
2: StopBits:=2; // 2
else StopBits:=0; //1
//else StopBits:=1; // 1.5
end;
case par of //校验
'n','N': Parity:=0; //no
'o','O': Parity:=1; //odd
'e','E': Parity:=2; //even
'm','M': Parity:=3; //mark
's','S': Parity:=4; //space
else Parity:=0; //no
end;
end;
SetCommState(handle,dcb);
SetupComm(handle,CommOutQueSize,CommInQueSize);
OpenFlag:=true;
end;

//关闭串口
procedure TUart.Close;
begin
if OpenFlag then
CloseHandle(handle);
OpenFlag:=false;
end;

//检测输入缓冲区中的字符数
function TUart.InbufChars:longint;
var
ErrCode : Integer;
Stat : TCOMSTAT;
begin
result:=0;
if not OpenFlag then exit;
ClearCommError(handle,ErrCode,@Stat);
result:=stat.cbInQue;
end;

//检测输出缓冲区中的字符数
function TUart.OutBufChars:Longint;
var
ErrCode : Integer;
Stat : TCOMSTAT;
begin
result:=0;
if not OpenFlag then exit;
ClearCommError(handle,ErrCode,@Stat);
result:=stat.cbOutQue;
end;

//写串口 buf:存放要写的数据,len:要写的长度
procedure TUart.Send(var buf;len:integer);
var
i : integer;
begin
WriteFile(handle,Buf,len,i,nil); //写串口
end;


//读串口 buf:存放读到的数据,len:要读的长度,tmout:超时值(ms)
//返回: 实际读到的字符数
function TUart.Receive(var buf;len:integer;tmout:integer):integer;
var
Timer : Timers;
i : Integer;
BufChs : Integer;
begin
Timer:=Timers.Create;
Timer.Start;
repeat until (InBufChars>=len) or (Timer.Get>tmout); //收到指定长度数据或超时
BufChs:=InBufChars;
if len>BufChs then len:=BufChs;
ReadFile(handle,Buf,len,i,nil); //读串口
result:=i;
Timer.free;
end;

//向串口发一个字符
procedure TUart.PutChar(ch:char);
var
i : integer;
begin
WriteFile(handle,ch,1,i,nil); //写串口
end;

//向串口发一个字符串
procedure TUart.Puts(s:string);
var
i : integer;
begin
for i:=1 to length(s) do Putchar(s[i]);
end;

//从串口读一个字符,未收到字符则返回#0
function TUart.GetChar:char;
var
i: integer;
begin
result:=#0;
if InBufChars>0 then
ReadFile(handle,result,1,i,nil); //读串口
end;

//从串口取一个字符串,忽略不可见字符,收到#13或255个字符结束,tmout:超时值(ms)
//返回:true表示收到完整字符串,false表示超时退出
function TUart.Gets(var s:string;tmout:integer):boolean;
var
Timer : Timers;
ch : char;
begin
Timer:=Timers.Create;
Timer.Start;
s:='';
result:=false;
repeat
ch:=GetChar;
if ch<>#0 then Timer.Start; //如收到字符则清定时器
if ch>=#32 then s:=s ch;
if (ch=#13) or (length(s)>=255) then
begin
result:=true;
break;
end;
until Timer.Get>tmout; //超时
Timer.free;
end;


//清接收缓冲区
procedure TUart.ClearInBuf;
begin
if not OpenFlag then exit;
PurgeComm(handle,PURGE_RXCLEAR);
end;

//等待一个字符串,tmout:超时值(ms),返回false表示超时
function TUart.Wait(s:String;tmout:integer):boolean;
var
s1 : string;
timer : Timers;
begin
timer:=Timers.Create;
timer.Start;
result:=false;
repeat
Gets(s1,tmout);
if pos(s,s1)>0 then
begin
result:=true;
break
end;
until timer.Get>tmout;
timer.Free;
end;

//执行一个AT命令,返回true表示成功
function TUart.ExecAtComm(s:string):boolean;
begin
ClearInBuf;
Puts(s);
result:=false;
if Wait('OK',3000) then
result:=true;
end;

//挂机,返回true表示成功
function TUart.Hangup:boolean;
begin
result:=false;
ExecAtComm(' ');
if not ExecAtComm('ATH'#13) then exit;
result:=true;
end;

//应答,返回true表示成功
function TUart.Answer:boolean;
begin
ClearInBuf;
Puts('ATA'#13);
result:=false;
if Wait('CONNECT',30000) then
result:=true;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -