admin管理员组

文章数量:1531285

2023年12月20日发(作者:)

目 录

第一章 课程设计要求 …………………………………………………………… 1

第二章 系统的组成及原理 ……………………………………………………… 2

2.1 系统的组成 ………………………………………………………………… 2

2.2 系统设计的原理 …………………………………………………………… 2

第三章 串口调试助手的设计 …………………………………………………… 3

3.1 串口调试助手的概要设计 ………………………………………………… 3

3.2 串口调试助手的详细设计 ………………………………………………… 3

3.2.1 窗体设计 ……………………………………………………………… 3

3.2.2 打开端口部分设计 …………………………………………………… 4

3.2.3 接收数据部分的设计 ………………………………………………… 5

3.2.4 发送数据部分的设计 …………………………………………………11

第四章 调试及测试结果与分析 …………………………………………………15

第五章 结论 ………………………………………………………………………16

参考文献 …………………………………………………………………………17

附录A:程序清单及注释 …………………………………………………………18

第一章 课程设计要求

利用Delphi或C++作为开发工具,根据SPCOM或MSCOMM控件、等,设计出一串口调试助手,要求在不同计算机之间实现串口间数据通信,并以此为基础,实现对不同数据格式间的转换功能。

要求:

1、串口通信。

2、数据格式。

3、系统软件(Delphi7.0)。

第二章 系统的组成及原理

2.1系统的组成

串口调试助手经常用于对串口的调试和检查,也可传送一些简单的数据。本软件主要包括:

1、接收部分

接收时能够分别以十六进制、二进制、十进制等格式接收数据,并能以*.Txt或*.Doc 保存接收的数据。

2、发送部分

发送部分分为手动发送和自动发送,并且都能以ASCII码和文本格式发送。

2.2 系统设计的原理

Microsoft Communication Control(简称MSCOMM控件)是微软公司为Visual Basic提供的一个串口控件,在Visval

C++、Visval Basic、Delphi等开发环境中均可使用。它通过串行端口传送和接收数据,为应用程序提供基本的串口通信功能,使得程序员不必花费大量的时间去了解较为复杂的API函数,因此被广泛使用。所以本软件可以利用Delphi7.0根据MSCOMM控件设计。

利用MSCOMM控件可以简化很多较繁琐的程序。它提供了两种处理通信问题的方法:一是事件驱动方法,一是查询法。用于串口调试助手的功能比较简单,不需要太复杂的处理方式,所以使用查询法就足够了。查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。

通信MSCOMM控件提供了27个关于通信控制方面的属性和5个标准属性。其中主要的和本次使用的属性如下:

CommPort 设置并返回通信端口号;

Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位;

PortOpen 设置并返回通信端口的状态,也可以打开和关闭端口;

Input 从接收缓冲区返回和删除字符;

Output 向传送缓冲区写一个字符。

第三章 串口调试助手的设计

3.1 串口调试助手的概要设计

串口调试助手的系统层次结构图如图3-1所示。

3.2 串口调试助手的详细设计

3.2.1 窗体设计

由于串口调试助手的功能比较简单,所以只需一个窗体就足够了,其窗体如图3-2所示。

3.2.2 打开端口部分设计

1.打开端口部分设计流程图如图3-3所示

2.端口初始化就是对波特率、校验、数据位和停止位的设置,端口的设置参数赋给ComSetting函数,然后赋给

g即可。当端口打开时指示灯为绿色,当端口为打开时指示灯为红色。代码如下:

procedure 1Click(Sender: TObject);

begin

if not en then

begin

//打开串口

rt:= dex +1;

ComSetting:= ;

ComSetting:= ComSetting + ',' + ;

ComSetting:= ComSetting + ',' + ;

ComSetting:= ComSetting + ',' + ;

gs:= ComSetting;

try

en:= True;

except

showmessage('该COM错误!');

ate; //关闭程序

end ;

d:=false;

ShowComSetting;

//变换各个组件的状态

:= clLime; //指示灯变绿

n:= '关闭串口';

end

else

begin

//关闭串口

//变换各个组件的状态

en:= False;

:= clRed; //指示灯变红

d:= True;

n:= '打开串口';

end;

end;

3.2.3 接收数据部分的设计

1.接收数据部分的设计流程图如图3-4所示。

2.当接收数据后对数据进行变换时,要先判断接收的数据是否符合变换的条件,例如当以十进制显示时,接收的数据不是十六进制数就会报错。

判断数据是否是十六进制的代码如下:

function PanDuan16(Str: string):boolean;

var

mLen, i: Integer;

begin

mLen:= Length(Str);

for i:= mLen downto 1 do

begin

if Str[i] in ['0'..'9','a'..'f','A'..'F'] then

begin

Continue;

Result:=true;

end

else

Result:=false;

break;

end;

end;

判断数据是否是十进制的代码如下:

function PanDuan(Str: string):boolean;

var

mLen, i: Integer;

begin

mLen:= Length(Str);

for i:= mLen downto 1 do

begin

if Str[i] in ['0','1','2','3','4','5','6','7','8','9'] then

begin

Continue;

Result:=true;

end

else

Result:=false;

break;

end;

end;

procedure 1Comm(Sender: TObject);

var

InputLen: Integer;

tmpvar: Variant;

a:string;

begin

InputLen:= 0;

if ent = 2 then //接收数据时

begin

InputLen:= erCount; //返回输入缓冲区内等待读取的字节数

//接收二进制数据,转换为ASCII码显示

if d = true then //ASCII码

begin

tmpvar:= ; //读取接收缓冲区中的数据

InputStr:='';

inputstr:= inputstr+ StrToASCIIStr(tmpvar)+#72+#32;

end

else

if d = true then //ASCII码字符

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan16(tmpvar) then

begin

InputStr:='';

InputStr:= InputStr + chr(strtoint('$'+tmpvar)) + #32;

end

else

begin

showmessage('输入数据有错!');

InputStr:='';

end;

end

else

if d=true then //十六进制

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan(tmpvar)then

begin

InputStr:='';

a:= tmpvar;

InputStr:=InputStr +inttohex(strtoint(a),2)+#72+ #32;

end

else

begin

showmessage('请输入0~9之间的数');

InputStr:='';

end;

end

else

if d=true then //二进制

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan16(tmpvar) then

begin

InputStr:='';

a:= tmpvar;

InputStr:=InputStr +dtoB(strtoint('$'+a)) +#66+ #32;

end

else

begin

showmessage('输入数据有错!');

InputStr:='';

end;

end

else

if d=true then //十进制

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan16(tmpvar) then

begin

InputStr:='';

a:= tmpvar;

InputStr:=InputStr +inttostr(strtoint('$'+a)) + #32;

end

else

begin

showmessage('输入数据有错!');

InputStr:='';

end;

end

else

//直接接收字符

begin

InputStr:='';

InputStr:= ;

end;

:= + InputStr;

end;

//加入数据显示模块

RecvStr:= ;

RXNum:= RXNum + InputLen;

ShowRX;

end;

3.2.4 发送数据部分的设计

1.发送数据部分的设计流程图如图3-5所示。

2.发送数据之前必须保证串口打开,所以先判断端口有没有打开。由于发送空内容没有意义,所以还要保证发送内容不能为空。

procedure dClick(Sender: TObject);

var

Len: Integer;

i, Count, MaxCount, tmpInt: Integer;

tmpvar: Variant;

tmpStr, Output: string;

begin

Len:= 0;

Count:= 1;

MaxCount:= 1;

if not en then

begin

ShowMessage('没有打开串口!');

Exit;

end

else

begin

output:=stringreplace(,#13#10,'',[rfReplaceAll]); //去掉换行符

Len:= Length(output);

if len=0 then

ShowMessage('没有输入数据!')

else

if Len > 0 then

begin

//发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节

if ASCIISend then

begin

i:= 1;

//创建一个Variant数组

tmpvar:= VarArrayCreate([1,1], varByte);

while (i < Len) do

begin

//转换为16进制

tmpStr:= Copy(Output,i,2);

tmpStr:= LowerCase(tmpStr); //将字符转换成小写

tmpstr:= TrimAll(tmpstr);

tmpInt:= HexToInt(tmpStr);

if tmpInt = -1 then

begin

ShowMessage('发送的数据格式有问题!');

break;

end

else

begin

if Count = (MaxCount +1) then

begin

Inc(MaxCount);

//增大Variant数组

VarArrayRedim(tmpvar, MaxCount); //调整数组大小,VarArrayRedim()函数能修改variant数组的最高限

end;

tmpvar[Count]:= tmpInt;

Inc(Count);

end;

i:= i+2;

end;

:= tmpvar;

end

end

else

begin

output:=stringreplace(,#13#10,'',[rfReplaceAll]);

:=Output;

end;

Len:= length();

end;

TXNum:= TXNum + Len div 2;

ShowTX;

end;

3.自动发送当选中CheckAutosend时,串口调试助手以设置好的时间间隔发送数据。

procedure utosendClick(Sender: TObject);

begin

if d then //自动发送

if length(stringreplace(,#13#10,'',[rfReplaceAll]))=0 then //输入内容是空时

begin

ShowMessage('请输入要发送的内容!');

d:= False;

us;

end

else

begin

al:= StrToInt(); //设置时间间隔

d:= True;

end

else

begin

d:= False;

end;

end;

第四章 调试及测试结果与分析

先从网上下载一个调试助手放到另一个电脑上,使用下载的调试助手来调试和测试所编软件的功能。由于串口调试助手主要包括接收和发送两部分,所以才用分步调试的方法。接收和发送部分再加上端口的初始化串口调试助手的调试共分三步:

1.端口初始化的调试。刚开始时端口的参数设置,我放在另一个窗体里,编程时没有现在简单,而且不能了解现在的端口参数,所以最后把端口的参数设置部分放到了主窗体里。由于打开端口后,端口的参数不能再更改,所以把端口的参数设置放到了Panel上,端口打开时,该Panel不能用,端口关闭后该Panel可用,从而可以保证端口打开后,端口的参数不变。

当打开的端口不存在时,delphi会报错,后利用try…except函数抛出异常,当要打开的端口不存在时,弹出对话框后关闭程序。

2.接收部分的调试。刚开始时没有对数据进行变换,而是先实现接收的功能。直接把的内容赋给显示。

以不同形式显示数据,即先把数据变成需要的形式后再显示即可。我先建一个新的工程,在该工程里实现各种需要的转换后,再在串口调试助手里使用。当以ASCII码形式显示时,有些符号显示不了,例如控制字符。后把要显示的Memo换成RichEdit后可以了。

对接收的数据实现以.Txt和.Doc的形式保存,刚开始时只能实现以.Txt形式保存,最后通过判断Index的值来判断是以.Txt还是以.Doc的形式保存,从而实现能够以这两种形式保存接收的数据。

3.发送部分的调试。与接收部分相同也是先实现发送后再转换发送。以文件形式发送是先把文本文件的内容赋给Memo再发送。

调试过程中出现"自发自收"的情况,经过检查发现串口线出现毛刺使串口的2、3脚连接,消除毛刺后没有出现过这种情况。各功能都实现以后,两台电脑都使用该软件进行通信,发现以ASCII码发送数据时,以文本接收的内容出现黑方框,最后把显示的内容先去掉回车符后就可以了。再用该软件与下载的调试助手进行通信也没出现异常。

第五章 结论

经过两个星期的编写和调试终于完成了串口调试助手,它能实现基本的接收和发送以及进制的转换。本软件集端口初始化、发送控制以及接收控制于一个界面,方便设置和使用。由于只使用了端口的2、3、5脚进行传输,所以并没有使用握手协议。软件只能即发即收,不能检测对方是否收到所发的信息。

通过本专业课程设计,本人了解了一般小程序的制作过程,学会了调试程序,通过网络等资源获取所需要的知识。增加了自信心,刚开始时,由于对串口和串口通信不了解所以不自信,感觉自己做不出来。后来通过查书、请教老师和上网搜索了解了串口以及如何用Delphi来制作串口通信的工具。使用Delphi可以通过使用MSCOMM控件或SPCOMM控件来制作串口调试助手,由于串口调试助手的功能不多,使用MSCOMM即可,也简单,所以采用了MSCOMM。通过对书上和网上的程序的分析掌握了MSCOMM控件的使用,然后对比网上的调试助手的功能制作了本软件。通过使用说明本软件能够满足课设的要求。

参考文献

[1]张仿彦、赛奎春等.Delphi接口技术开发实例解析.北京:机械工业出版社,2007.1

[2]黄军、熊勇、刘燕、刘晓梅等.Delphi串口通信编程.北京:人民邮电出版社,2001.8

[3]刘瑞新.Delphi2005程序设计教程.北京:机械工业出版社,2005.7

附录

附录A:程序清单及注释

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, OleCtrls, MSCommLib_TLB, StdCtrls, Buttons, ExtCtrls, ComCtrls,

Menus;

type

TForm1 = class(TForm)

MSComm1: TMSComm;

Panel1: TPanel;

CmbComPort: TComboBox;

StatusBar1: TStatusBar;

HeaderControl1: THeaderControl;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

MemSend: TMemo;

CheckHexSend: TCheckBox;

ShpSerialPort: TShape;

TimerStatus: TTimer;

BtnSend: TBitBtn;

Timer: TTimer;

CheckAutosend: TCheckBox;

EdtTimeInterval: TEdit;

Label1: TLabel;

ComboBox1: TComboBox;

Label2: TLabel;

ComboBox2: TComboBox;

Label3: TLabel;

ComboBox3: TComboBox;

ComboBox4: TComboBox;

Label4: TLabel;

Label5: TLabel;

Button2: TButton;

Button3: TButton;

brecv: TRadioButton;

ASCIIRecv: TRadioButton;

HRecv: TRadioButton;

DRecv: TRadioButton;

RadioButton1: TRadioButton;

SaveRecv: TButton;

Openfile: TButton;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Label7: TLabel;

SendFile: TButton;

Button4: TButton;

Button1: TButton;

Button5: TButton;

MemRecv: TRichEdit;

zifu: TRadioButton;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure TimerStatusTimer(Sender: TObject);

procedure MSComm1Comm(Sender: TObject);

procedure BtnSendClick(Sender: TObject);

procedure CheckAutosendClick(Sender: TObject);

procedure TimerTimer(Sender: TObject);

procedure CheckHexSendClick(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure SaveRecvClick(Sender: TObject);

procedure OpenfileClick(Sender: TObject);

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

HexSend: Boolean;

RXNum, TXNum: Integer;

InputStr, RecvStr: string;

ComSetting: string;

procedure ShowTX;

procedure ShowRX;

procedure ShowComSetting ;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses

unit2, ComObj;

{$R *.dfm}

//*********************************************************

//该函数接收1个字符,转换成功后输出相应的数,否则输出-1

//*********************************************************

function Hex(c: char): Integer;

var

x: Integer;

begin

if ( Ord(c)>= Ord('0')) and (Ord(c) <= Ord('9')) then

x:= Ord(c) - Ord('0')

else if (Ord(c) >= Ord('a')) and (Ord(c) <= Ord('f')) then

x:= Ord(c) - Ord('a') + 10

else if (Ord(c) >= Ord('A')) and (Ord(c) <= Ord('F')) then

x:= Ord(c) - Ord('A') + 10

else

x:= -1; //输入错误

Result:= x;

end;

//*******************************************************************

//该函数接收1~2个,字符转换成功后输出对应的值,否则输出-1

//*******************************************************************

function HexToInt(Str: string): Integer;

var

tmpInt1, tmpInt2: Integer;

begin

if Length(Str) = 1 then

begin

Result:= Hex(Str[1]);

end

else if Length(Str) = 2 then

begin

tmpInt1:= Hex(Str[1]);

tmpInt2:= Hex(Str[2]);

if (tmpInt1 = -1) or (tmpInt2 = -1) then

Result:= -1

else

Result:= tmpInt1 * 16 + tmpInt2;

end

else

Result:= -1; //输入错误,转换失败

end;

//****************************

//字符串转换成ASCII码字符串

//****************************

function StrToASCIIStr(const S: string): string;

var

i: Integer;

begin

for i:= 1 to Length(S) do

begin

if i = 1 then

Result:= IntToHex(Ord(S[1]), 2)

else

Result:= Result + ' ' + IntToHex(Ord(S[i]), 2);

end;

end;

//***************************

//该函数去掉字符串中所有空格

//***************************

function TrimAll(Str: string): string;

var

mLen, i: Integer;

begin

mLen:= Length(Str);

//初始化返回值

Result:= '';

for i:= 0 to mLen do

begin

//是空格就去掉

if Str[i] = '' then

Continue;

Result:= Result + Str[i];

end;

end;

//***************************

//十进制转换成二进制字符串

//***************************

function DTob(decimal:longint):string;

const symbols:string[16]='01';

var

scratch:string;

remainder:byte;

begin

repeat

remainder:=decimal mod 2;

scratch:=symbols[remainder+1]+scratch;

decimal:=decimal div 2;

until(decimal=0);

result:=scratch;

end;

//***************************

//判断输入的数是否在0~9之间

//***************************

function PanDuan(Str: string):boolean;

var

mLen, i: Integer;

begin

mLen:= Length(Str);

for i:= mLen downto 1 do

begin

if Str[i] in ['0','1','2','3','4','5','6','7','8','9'] then

begin

Continue;

Result:=true;

end

else

Result:=false;

break;

end;

end;

function PanDuan16(Str: string):boolean;

var

mLen, i: Integer;

begin

mLen:= Length(Str);

for i:= mLen downto 1 do

begin

if Str[i] in ['0'..'9','a'..'f','A'..'F'] then

begin

Continue;

Result:=true;

end

else

Result:=false;

break;

end;

end;

procedure 1Click(Sender: TObject);

begin

if not en then

begin

//打开串口

rt:= dex +1;

ComSetting:= ;

ComSetting:= ComSetting + ',' + ;

ComSetting:= ComSetting + ',' + ;

ComSetting:= ComSetting + ',' + ;

gs:= ComSetting;

try

en:= True;

except

showmessage('该COM错误!');

ate;

end ;

d:=false;

ShowComSetting;

//变换各个组件的状态

:= clLime; //指示灯变绿

n:= '关闭串口';

end

else

begin

//关闭串口

//变换各个组件的状态

en:= False;

:= clRed; //指示灯变红

d:= True;

n:= '打开串口';

end;

end;

procedure eate(Sender: TObject);

begin

ShowComSetting;

erSize:= 1024; //设置或返回输入缓存大小

ferSize:= 512; //设置或返回输出缓存大小

dex:= 0; //选择串口

RXNum:= 0; //接收字节数

TXNum:= 0; //发送字节数

ode:= 0; //以文本方式读取

d:= True; //ASCII发送

d :=false; //关闭自动发送

:= clRed;//灯变红即串口没打开

d:= True;

[0]:= DateTimeToStr(Now())+'Recv:'

end;

procedure 1Comm(Sender: TObject);

var

InputLen: Integer;

//tmpInt: Integer;

tmpvar: Variant;

a:string;

begin

InputLen:= 0;

if ent = 2 then //接收数据时

begin

InputLen:= erCount; //返回输入缓冲区内等待读取的字节数

//接收二进制数据,转换为ASCII码显示

if d = true then //ASCII码

begin

tmpvar:= ; //读取接收缓冲区中的数据

InputStr:='';

inputstr:= inputstr+ StrToASCIIStr(tmpvar)+#72+#32;

end

else

if d = true then //ASCII码字符

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan16(tmpvar) then

begin

InputStr:='';

InputStr:= InputStr + chr(strtoint('$'+tmpvar)) + #32;

end

else

begin

showmessage('输入数据有错!');

InputStr:='';

end;

end

else

if d=true then //十六进制

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan(tmpvar)then

begin

InputStr:='';

a:= tmpvar;

InputStr:=InputStr +inttohex(strtoint(a),2)+#72+ #32;

end

else

begin

showmessage('请输入0~9之间的数');

InputStr:='';

end;

end

else

if d=true then //二进制

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan16(tmpvar) then

begin

InputStr:='';

a:= tmpvar;

InputStr:=InputStr +dtoB(strtoint('$'+a)) +#66+ #32;

end

else

begin

showmessage('输入数据有错!');

InputStr:='';

end;

end

else

if d=true then //十进制

begin

tmpvar:= ; //读取接收缓冲区中的数据

if PanDuan16(tmpvar) then

begin

InputStr:='';

a:= tmpvar;

InputStr:=InputStr +inttostr(strtoint('$'+a)) + #32;

end

else

begin

showmessage('输入数据有错!');

InputStr:='';

end;

end

else

//直接接收字符

begin

InputStr:='';

InputStr:= ;

end;

:= + InputStr;

end;

//加入数据显示模块

RecvStr:= ;

RXNum:= RXNum + InputLen;

ShowRX;

end;

procedure ; //状态栏显示接收字节数

begin

[2].Text:= 'RX:' + IntToStr(RXNum);

end;

procedure ; //状态栏显示发送字数

begin

[1].Text:= 'TX:' + IntToStr(TXNum);

end;

procedure tatusTimer(Sender: Tobject); //状态栏显示时间

var

tmpTime: string;

begin

tmpTime:= DateTimeToStr(Now());

[3].Text:= '今天是:' + DateToStr(Date()) + #32 + #32 +

'当前时间为:' + Copy(tmpTime,11, 16);

end;

procedure mSetting; // 状态栏显示串口状态

begin

if not en then

[0].Text:='串口状态是:未打开'

else

[0].Text:='串口状态是:'+ComSetting;

end;

procedure dClick(Sender: TObject);

var

Len: Integer;

i, Count, MaxCount, tmpInt: Integer;

tmpvar: Variant;

tmpStr, Output: string;

begin

Len:= 0;

Count:= 1;

MaxCount:= 1;

if not en then

begin

ShowMessage('没有打开串口!');

Exit;

end

else

begin

//发送二进制数,需要使用Variant变量矩阵,矩阵大小自动调节

if HexSend then

begin

output:=stringreplace(,#13#10,'',[rfReplaceAll]); //去掉换行符

Len:= Length(output);

if len=0 then

ShowMessage('没有输入数据!')

else

if Len > 0 then

begin

i:= 1;

//创建一个Variant数组

tmpvar:= VarArrayCreate([1,1], varByte);

while (i < Len) do

begin

//转换为16进制

tmpStr:= Copy(Output,i,2);

tmpStr:= LowerCase(tmpStr); //将字符转换成小写

tmpstr:= TrimAll(tmpstr);

tmpInt:= HexToInt(tmpStr);

if tmpInt = -1 then

begin

ShowMessage('发送的数据格式有问题!');

break;

end

else

begin

if Count = (MaxCount +1) then

begin

Inc(MaxCount);

//增大Variant数组

VarArrayRedim(tmpvar, MaxCount); //调整数组大小,VarArrayRedim()函数能修改variant数组的最高限

end;

tmpvar[Count]:= tmpInt;

Inc(Count);

end;

i:= i+2;

end;

:= tmpvar;

end

end;

begin

output:=stringreplace(,#13#10,'',[rfReplaceAll]);

end;

:=Output;

end;

Len:= length();

TXNum:= TXNum + Len div 2;

ShowTX;

end;

procedure utosendClick(Sender: TObject);

begin

if d then //自动发送

if length(stringreplace(,#13#10,'',[rfReplaceAll]))=0 then //输入内容是空时

begin

ShowMessage('请输入要发送的内容!');

d:= False;

us;

end

else

begin

al:= StrToInt(); //设置时间间隔

d:= True;

end

else

begin

d:= False;

end;

end;

procedure imer(Sender: TObject);

begin

//如果串口已经打开,则发送数据

if en then

BtnSendClick(Sender);

end;

procedure exSendClick(Sender: TObject);

begin

HexSend:= d;

end;

procedure 2Click(Sender: TObject);

begin

;

[0]:= DateTimeToStr(Now())+'Recv:'+#13+#10;

end;

procedure 3Click(Sender: TObject);

begin

;

end;

procedure 4Click(Sender: TObject);

begin

close;

end;

procedure cvClick(Sender: TObject);

var

FileName:string;

begin

if e then

begin

if Index=2 then

begin

ext:=false;

FileName:=me+'.doc' ;

end

else

begin

ext:=true;

FileName:=me+'.txt' ;

end;

File(FileName);

end;

end;

procedure leClick(Sender: TObject);

var

FileName:string;

begin

if e then

begin

;

Filename:=me;

n:=me;

omFile(Filename);

end;

end;

procedure 5Click(Sender: TObject);

begin

RXNum:=0;

TXNum:=0;

ShowRX;

ShowTX;

end;

end.

本文标签: 串口调试发送端口助手