Delphi - 采用第三方控件TMS、SPComm开发串口调试助手

第三方控件TMS、SPComm的下载与安装

盒子上可搜索关键字进行下载,TMS是.dpk文件,SPComm.pas文件;

安装方法自行百度,不做赘述。

通过TMS控件进行界面布局

界面预览:

Delphi通过SPComm连接串口、发送和接收指令

连接串口

拖一个TComm控件到主窗体上,选中控件,单击F11,完成如下配置。

这里主要是将一些布尔类型的属性设置成False,其他属性在前台连接按钮事件下动态设置。

连接代码如下,这里需要特别主意一下:

当串口参数超过COM9(即COM10、COM11、COM12...)的时候,SPComm单元中有此BUG,ComName这里不可以直接赋值,需要做如下处理。

CommName := ‘//./‘ + cbbCOM.Text;

 1 procedure TMainFrm.advBtnConnectClick(Sender: TObject);
 2 var
 3   serialPortNO: string;
 4 begin
 5   try
 6     with comMain do
 7     begin
 8       StopComm;
 9       serialPortNO := Copy(cbbCOM.Text, 4, Length(cbbCOM.Text) - 3);
10       BaudRate := StrToInt(cbbBaudRate.Text);
11 //      ByteSize := TByteSize(cbbByteSize.ItemIndex);
12 //      StopBits := TStopBits(cbbStopBit.ItemIndex);
13 //      Parity := TParity(cbbCheckBit.ItemIndex);
14       if StrToInt(serialPortNO) > 9 then
15       begin
16         CommName := ‘//./‘ + cbbCOM.Text;
17       end
18       else
19       begin
20         CommName := cbbCOM.Text;
21       end;
22       comMain.StartComm;
23       connectStatus.Caption := ‘Connected‘;
24       connectStatus.FillColor := clLime;
25       advBtnConnect.Enabled := False;
26       gbSendMsg.Enabled := True;
27     end;
28   except
29     connectStatus.Caption := ‘Not Connected‘;
30     connectStatus.FillColor := clRed;
31     gbSendMsg.Enabled := False;
32   end;
33
34 end;

发送指令

WriteCommData();

 1 procedure TMainFrm.advBtnConfirmClick(Sender: TObject);
 2 begin
 3   if mmSendMsg.Lines.Count <= 0 then
 4   begin
 5     Application.MessageBox(‘There is no key word, please check the MsgSendList,thanks.‘, ‘Error Information‘, MB_OK + MB_ICONSTOP);
 6     mmSendMsg.SetFocus;
 7     Exit;
 8   end;
 9   if cbByte.Checked then
10   begin
11     SendHex(mmSendMsg.Text);
12   end
13   else
14   begin
15     comMain.WriteCommData(PChar(mmSendMsg.Text), Length(mmSendMsg.Text));
16   end;
17   if (cbAutoSend.Checked) and (edtTime.Text <> ‘‘) and (cbByte.Checked) then
18   begin
19     timerMain.Interval := StrToInt(edtTime.Text);
20     timerMain.Enabled := True;
21   end;
22 end;

SendHex函数

 1 procedure TMainFrm.SendHex(S: string);
 2 var
 3   s2: string;
 4   buf1: array[0..50000] of char;
 5   i: integer;
 6 begin
 7   s2 := ‘‘;
 8   for i := 1 to length(s) do
 9   begin
10     if ((copy(s, i, 1) >= ‘0‘) and (copy(s, i, 1) <= ‘9‘)) or ((copy(s, i, 1) >= ‘a‘) and (copy(s, i, 1) <= ‘f‘))
11       or ((copy(s, i, 1) >= ‘A‘) and (copy(s, i, 1) <= ‘F‘)) then
12     begin
13       s2 := s2 + copy(s, i, 1);
14     end;
15   end;
16   for i := 0 to (length(s2) div 2 - 1) do
17     buf1[i] := char(strtoint(‘$‘ + copy(s2, i * 2 + 1, 2)));
18   comMain.WriteCommData(buf1, (length(s2) div 2));
19   mmMsg.Lines.Add(‘MsgSend[‘ + S + ‘]‘);
20 end;

接收指令

选中控件,添加OnReceiveError事件,代码如下。

 1 procedure TMainFrm.comMainReceiveData(Sender: TObject; Buffer: Pointer;
 2   BufferLength: Word);
 3 var
 4   S: string;
 5   I, L: INTEGER;
 6   RBUF: array[0..2048] of BYTE;
 7 begin
 8   Move(Buffer^, pchar(@rbuf)^, BufferLength);
 9   L := BufferLength;
10   for I := 0 to L - 1 do
11   begin
12     S := S + INTTOHEX(RBUF[I], 2);
13   end;
14   mmMsg.Lines.Add(‘MsgReceived[‘ + S + ‘]‘);
15 end;

断开串口连接

comMain.StopComm;

附录

  1 unit uMain;
  2
  3 interface
  4
  5 uses
  6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7   Dialogs, StdCtrls, ExtCtrls, SPComm, RzPanel, AdvSmoothButton,
  8   AdvSmoothStatusIndicator, AdvGlassButton, RzButton, RzRadChk, RzStatus,
  9   RzPrgres;
 10
 11 type
 12   TMainFrm = class(TForm)
 13     gbSerialParams: TRzGroupBox;
 14     gbMsg: TRzGroupBox;
 15     mmMsg: TMemo;
 16     gbPortSet: TRzGroupBox;
 17     gbSendMsg: TRzGroupBox;
 18     lbCom: TLabel;
 19     lbStopBit: TLabel;
 20     lbByteSize: TLabel;
 21     lbCheckBit: TLabel;
 22     lbBaudRate: TLabel;
 23     comMain: TComm;
 24     cbbCOM: TComboBox;
 25     cbbStopBit: TComboBox;
 26     cbbByteSize: TComboBox;
 27     cbbBaudRate: TComboBox;
 28     cbbCheckBit: TComboBox;
 29     gbMsgSendParams: TRzGroupBox;
 30     gbMsgSendList: TRzGroupBox;
 31     cbByte: TRzCheckBox;
 32     cbAutoSend: TRzCheckBox;
 33     lbCT: TLabel;
 34     edtTime: TEdit;
 35     advBtnConfirm: TAdvGlassButton;
 36     advBtnConnect: TAdvGlassButton;
 37     AdvGlassButton1: TAdvGlassButton;
 38     lbMs: TLabel;
 39     mmSendMsg: TMemo;
 40     statusBar: TRzStatusBar;
 41     clock: TRzClockStatus;
 42     versionStatus: TRzVersionInfoStatus;
 43     mqStatus: TRzMarqueeStatus;
 44     progressBar: TRzProgressBar;
 45     connectStatus: TRzStatusPane;
 46     timerMain: TTimer;
 47     procedure advBtnConnectClick(Sender: TObject);
 48     procedure comMainReceiveData(Sender: TObject; Buffer: Pointer;
 49       BufferLength: Word);
 50     procedure advBtnConfirmClick(Sender: TObject);
 51     procedure SendHex(S: string);
 52     procedure AdvGlassButton1Click(Sender: TObject);
 53     procedure timerMainTimer(Sender: TObject);
 54   private
 55     { Private declarations }
 56   public
 57     { Public declarations }
 58   end;
 59
 60 var
 61   MainFrm: TMainFrm;
 62
 63 implementation
 64
 65 {$R *.dfm}
 66
 67 procedure TMainFrm.SendHex(S: string);
 68 var
 69   s2: string;
 70   buf1: array[0..50000] of char;
 71   i: integer;
 72 begin
 73   s2 := ‘‘;
 74   for i := 1 to length(s) do
 75   begin
 76     if ((copy(s, i, 1) >= ‘0‘) and (copy(s, i, 1) <= ‘9‘)) or ((copy(s, i, 1) >= ‘a‘) and (copy(s, i, 1) <= ‘f‘))
 77       or ((copy(s, i, 1) >= ‘A‘) and (copy(s, i, 1) <= ‘F‘)) then
 78     begin
 79       s2 := s2 + copy(s, i, 1);
 80     end;
 81   end;
 82   for i := 0 to (length(s2) div 2 - 1) do
 83     buf1[i] := char(strtoint(‘$‘ + copy(s2, i * 2 + 1, 2)));
 84   comMain.WriteCommData(buf1, (length(s2) div 2));
 85   mmMsg.Lines.Add(‘MsgSend[‘ + S + ‘]‘);
 86 end;
 87
 88
 89 procedure TMainFrm.advBtnConnectClick(Sender: TObject);
 90 var
 91   serialPortNO: string;
 92 begin
 93   try
 94     with comMain do
 95     begin
 96       StopComm;
 97       serialPortNO := Copy(cbbCOM.Text, 4, Length(cbbCOM.Text) - 3);
 98       BaudRate := StrToInt(cbbBaudRate.Text);
 99 //      ByteSize := TByteSize(cbbByteSize.ItemIndex);
100 //      StopBits := TStopBits(cbbStopBit.ItemIndex);
101 //      Parity := TParity(cbbCheckBit.ItemIndex);
102       if StrToInt(serialPortNO) > 9 then
103       begin
104         CommName := ‘//./‘ + cbbCOM.Text;
105       end
106       else
107       begin
108         CommName := cbbCOM.Text;
109       end;
110       comMain.StartComm;
111       connectStatus.Caption := ‘Connected‘;
112       connectStatus.FillColor := clLime;
113       advBtnConnect.Enabled := False;
114       gbSendMsg.Enabled := True;
115     end;
116   except
117     connectStatus.Caption := ‘Not Connected‘;
118     connectStatus.FillColor := clRed;
119     gbSendMsg.Enabled := False;
120   end;
121
122 end;
123
124 procedure TMainFrm.comMainReceiveData(Sender: TObject; Buffer: Pointer;
125   BufferLength: Word);
126 var
127   S: string;
128   I, L: INTEGER;
129   RBUF: array[0..2048] of BYTE;
130 begin
131   Move(Buffer^, pchar(@rbuf)^, BufferLength);
132   L := BufferLength;
133   for I := 0 to L - 1 do
134   begin
135     S := S + INTTOHEX(RBUF[I], 2);
136   end;
137   mmMsg.Lines.Add(‘MsgReceived[‘ + S + ‘]‘);
138 end;
139 //var
140 //    tmpArray: array[0..4096] of Byte;
141 //    i: DWORD;
142 //    tmpStr: string;
143 //    pStr: PChar;
144 //begin
145 //    pStr := Buffer;
146 //    tmpStr := string(pStr);
147 //    mmMsg.Lines.Add(tmpStr);
148 //    Dec(PStr);
149 //    for i := 0 to Length(tmpStr) - 1 do
150 //    begin
151 //        inc(PStr);
152 //        tmpArray[i] := Byte(PSTR^);
153 //        mmMsg.Lines.Add(IntToHEX(Ord(tmpArray[i]), 2));
154 //    end;
155 //    exit;
156 //    pStr := Buffer;
157 //    mmMsg.Lines.Add(pStr);
158 //end;
159
160 procedure TMainFrm.advBtnConfirmClick(Sender: TObject);
161 begin
162   if mmSendMsg.Lines.Count <= 0 then
163   begin
164     Application.MessageBox(‘There is no key word, please check the MsgSendList,thanks.‘, ‘Error Information‘, MB_OK + MB_ICONSTOP);
165     mmSendMsg.SetFocus;
166     Exit;
167   end;
168   if cbByte.Checked then
169   begin
170     SendHex(mmSendMsg.Text);
171   end
172   else
173   begin
174     comMain.WriteCommData(PChar(mmSendMsg.Text), Length(mmSendMsg.Text));
175   end;
176   if (cbAutoSend.Checked) and (edtTime.Text <> ‘‘) and (cbByte.Checked) then
177   begin
178     timerMain.Interval := StrToInt(edtTime.Text);
179     timerMain.Enabled := True;
180   end;
181 end;
182
183 procedure TMainFrm.AdvGlassButton1Click(Sender: TObject);
184 begin
185   timerMain.Enabled := False;
186   gbSendMsg.Enabled := False;
187   cbByte.Checked := False;
188   cbAutoSend.Checked := False;
189   edtTime.Text := ‘‘;
190   mmMsg.Text := ‘‘;
191   mmSendMsg.Text := ‘‘;
192   comMain.StopComm;
193   connectStatus.Caption := ‘Not Connected‘;
194   connectStatus.FillColor := clRed;
195   advBtnConnect.Enabled := True;
196 end;
197
198 procedure TMainFrm.timerMainTimer(Sender: TObject);
199 begin
200   SendHex(mmSendMsg.Text);
201 end;
202
203 end.

原文地址:https://www.cnblogs.com/h2zZhou/p/12561465.html

时间: 2024-10-15 06:15:12

Delphi - 采用第三方控件TMS、SPComm开发串口调试助手的相关文章

牛腩新闻发布系统———如何在开发中使用第三方控件

开发的项目多了以后,很多时候系统自带控件根本不能满足我们的需要,所以有时候就需要我们使用第三方控件来让我们的系统更加Perfect! 下面 ,我记录一下牛腩是如何添加第三方控件的 比如我们要使用 FreeTextBox控件 第一步:先把第三方控件(某个DLL或者其他文件)下载下来 第二步:然后添加对该文件的引用(右击自己的启动项目-添加–引用) 第三步:看到VS左边的工具箱了吗,在空白处右击选择 选择项 第四步:然后会看到如下界面,在单击 浏览,找到自己要添加的第三方控件,确定. 第五步:依次单

Delphi中代替WebBrowser控件的第三方控件

原文地址:http://blog.csdn.net/nanfeiyannan/article/details/7341492 这几天,接触到在delphi中内嵌网页,用delphi7自带的TWebBrowser控件,显示的内容与本机IE8显示的不一样,但是跟装IE8之前的IE6显示一个效果.现在赶脚是下面两个原因中的一个: 1.Navigate这个方法用的有点问题,里面的参数不同及Navigate2等不同方法,调用的IE内核版本不同 2.这个自带的控件用着不爽,直接换一个第三方控件 对于第一点,

Delphi第三方控件安装卸载指南

基本安装1.对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2.对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可: 3.对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可: 4.如果以上Install按钮为失效的话,试试Compile按钮: 5.是run time lib则在option下的

iOS开发不借助第三方控件实现侧边栏效果

最近在研究iOS程序的侧边栏,因为发现渐渐的iOS的程序也开始走侧边栏的风格了,QQ,今日头条,Path(Path算最早出现侧边栏的app了,所以也把侧边栏效果说成是Path效果),所以就研究了下. 然后发现Git Hub上有很多侧边栏的控件,这些控件效果也都挺玄的,但是我想找到不用第三方控件自己实现侧边栏呢?后来参照这篇blog,然后自己搞了下,算搞清楚了.下面详细介绍一下吧. 1. 首先我们需要在storyboard里面新建3个view controlle,这里也可以是navigation

iOS开发无第三方控件的援助达到的效果侧边栏

最近的研究iOS程序侧边栏.渐渐的发现iOS该方案还开始采取风侧边栏格该,QQ,今日头条,Path(Path运营商最早的侧边栏app该,效果说成是Path效果),所以就研究了下. 然后发现Git Hub上有非常多側边栏的控件,这些控件效果也都挺玄的.可是我想找到不用第三方控件自己实现側边栏呢?后来參照这篇blog,然后自己搞了下,算搞清楚了.以下具体介绍一下吧. 1. 首先我们须要在storyboard里面新建3个view controlle,这里也能够是navigation controlle

C#编写第三方控件,实现窗体控件的一键赋值

. 事出有因 在写程序的时候,经常会写上面这样的代码,把查询的结果显示到窗体上,我们怎么做的呢? 一行一行的进行赋值,这样的代码写起来最枯燥,而且还容易出错.大家有没有发现,上面的代码都在做相同的事情-赋值.相类似的代码写了三遍以上,就要考虑是不是能对这个过程进行封装.封装出一个方法,帮我们自动完成这些重复性的操作. 思考过程 所接触项目中也有写好的类似方法.只是它涉及到了很多其它的方法,一个套一个,抽离出来特别不方便.而且还有几个令人不爽的地方: 第一是,控件在命名的时候必须和相对应实体属性相

Delphi 编写ActiveX控件(OCX控件)的知识和样例(有详细步骤)

一.ActiveX应用情况简介: ActiveX控件也就是一般所说的OCX控件,它是 ActiveX技术的一部分.ActiveX是微软公司推出的基于组件对象模型COM的技术,包括对Windows 32位应用编程接口(Win32 API)和组件对象模型的一系列扩充和增强,目标是把计算机桌面环境与因特网环境集成起来,同时保护在Windows技术中现有的开发投资.微软的 ActiveX技术根本上就是修改过的OCX技术,使它能够跨越Internet,主要是使用WWW来传递控件.            A

开发环境VS2005,三方控件Dev8.2开发的软件在VS2010上跑起来的问题

大三了,到公司实习,公司有Java和.Net两个方向的软件开发,我主要是做.Net开发,且公司主要是做C/S开发,并且用的第三方控件Dev Express.这个东西以前从未接触过,公司给了我们一个以前做好的软件,让我们练手.这个软件是用vs2005,基于framework2.0开发的,用的Dev的版本是8.2的,数据库是mssql2005,现在要求我们用vs2010开发,现将从vs2005转换到vs2010过程中遇到的问题记录下来,供自己和有需要的朋友看看哈,第一次写博客,写的不好还请多多担待,

WPF第三方控件盘点

WPF统一的编程模型.语言和框架,实现了界面设计人员和开发人员工作可以分离的境界,鉴于WPF强大的优势,且一直是开发者关注的地方,下面和大家分享基于WPF项目开发需要用到的第三方控件,包括业界最受好评的网格控件.图表控件.停靠窗口和文本编辑器. 网格控件 1. Mindscape WPF Property Grid 这款表格控件是100%原生WPF表格控件,是Mindscape公司旗下WPF Elements用户界面套包里的一个商业子控件,当前已经更新到了5.1版本,新的版本在属性表格的性能以及