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.
版权声明:本文标题:DELPHI串口助手 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1703023132a35278.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论