http://blog.sina.com.cn/s/blog_7880f98301010pi8.html

转自——飘雪的世界

最近两天一直在研究spcomm控件的使用,之前也是很不太明白,看了很多的例子,可是按照网上很多的例子它们多少都有点瑕疵,运行不了,鉴于自己在做这方面的项目,也用了645规约试验了下,现在终于明白了一点。不过要想精通还再要学习!先把我的学习经验跟大家分享下,也让很多新手快点上手。

其实相对于mscomm来讲,spcomm简单明了容易操作,其主要有几个属性要设置和它的方法判断以及事件驱动三大块,掌握了这三个步骤那全盘解决了!

一、属性设置-(不过我还没研究好怎么在程序中动态设置)

comm1.CommName:=‘COM1’;   //串口号
comm1.BaudRate:=1200; //波特率 1200 4800 9600 115200当然也可以有范围比方1201 1205 
comm1.ByteSize:=_8;         //数据位   5 6 7 8 
comm1.Parity:=Even;        //检验位 Even Odd None Space Mark
comm1.StopBits:=_1;       //停止位 1 1.5 2
comm1.OnReceiveData:=Comm1ReceiveData; //这个是你以后写事件驱动时的名称,你可以改成你的名字

二、方法

comm1.StartComm;   //打开串口 当然它也有异常捕获共七种::⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程;

comm1.StopComm方法用于关闭串口,没有返回值;

comm1.WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word )方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回 false。执行此函数将立即得到返回值,发送操作随后执行。该函数有两个参数,其中 pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。

3.事件

comm1.OnReceiveData :procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object

当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer中是收到的数据, BufferLength是收到的数据长度。

下面是我用645规约编写的一个例子 在delphi7.0中已经试验过。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm, ExtCtrls;

type
TForm1 = class(TForm)
    Comm1: TComm;
    memo1: TMemo;
    Button2: TButton;
    Panel1: TPanel;
    Label5: TLabel;
    ComboBox1: TComboBox;
    ComboBox4: TComboBox;
    Label1: TLabel;
    Label4: TLabel;
    ComboBox5: TComboBox;
    ComboBox2: TComboBox;
    Label2: TLabel;
    Label3: TLabel;
    ComboBox3: TComboBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
private
    { Private declarations }
    procedure senddata(Sarr:array of byte);
public
    { Public declarations }
end;

var
Form1: TForm1;
viewstring:string;
sbuf:array of byte;
rbuf:array of byte;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);   //属性设置
begin
comm1.CommName:=COMBOBOX1.Text;
comm1.BaudRate:=strtoint(combobox2.Text);
comm1.ByteSize:=_8;
comm1.Parity:=Even;
comm1.StopBits:=_1;
comm1.OnReceiveData:=Comm1ReceiveData;
    comm1.StartComm;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   comm1.StopComm;
   close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;

begin
setlength(sbuf,18);
for i:=0 to 3 do
sbuf[i]:=$fe;
sbuf[4]:=$68;
for i:=5 to 10 do
sbuf[i]:=$99;
sbuf[11]:=$68;
sbuf[12]:=$01;
   sbuf[13]:=$02;
   sbuf[14]:=$65;
   sbuf[15]:=$f3;
   sbuf[16]:=$c1;
   sbuf[17]:=$16;
   senddata(sbuf);     //调用发送数据函数 sbuf{254 254 254 254 104 153 153 153 153 153 153 104 1 2 193 22}
end;
procedure TForm1.senddata(Sarr:array of byte);
var
j:integer;
commflag:boolean;
begin
   viewstring:='';
   commflag:=true;
   for j:=0 to 17 do
     begin
       if not Form1.Comm1.WriteCommData(@Sarr[j],1) then   //应用WriteCommData方法
         begin
           commflag:=false;
           break;
         end;
         sleep(2);
         viewstring:=viewstring+inttohex(Sarr[j],2)+' ';
     end;
     viewstring:='发送'+viewstring;
     form1.memo1.Lines.Add(viewstring);
     form1.memo1.Lines.Add(' ');
     if not commflag then messagedlg('发送失败',mterror,[mbyes],0);

end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;   //事件
BufferLength: Word);
var
k:integer;
begin
   viewstring:='';
   setlength(rbuf,bufferlength);
   move(buffer^,pchar(rbuf)^,bufferlength);
   for k:=0 to bufferlength do
     viewstring:=viewstring+ inttohex(rbuf[k],2)+ ' ';
     viewstring:='接收'+viewstring;
     memo1.Lines.Add(viewstring);
     memo1.Lines.add(' ');
end;

end.

这个是根据645规约的协议写的。

动态设置spcomm的属性值

终于找到了动态设置spcomm属性值的方法了,真的很感谢“暴风雨前的宁静"的文章,他给了很大的提示和帮助。

spcomm的属性主要是5个方面的设置,其中串口名和波特率都很好处理,直接设置text / strtoint就可以了,而其他三个属性就不是这么容易。其动态设置如下,但是如果在运行中若更改则是需要先关闭stopcomm,然后再设置,否则会出错。

comm1.CommName:=combobox1.Text;
   comm1.BaudRate:=strtoint(combobox2.Text);
   comm1.ByteSize:=Tbytesize(combobox3.ItemIndex);
   comm1.StopBits:=Tstopbits(combobox4.ItemIndex);
   comm1.Parity:=Tparity(combobox5.ItemIndex);

delphi中使用spcomm来实现串口通讯(转载)的更多相关文章

  1. C#中的WinFrom技术实现串口通讯助手(附源码)

    C#中的WinFrom技术实现串口通讯助手(附源码)   实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...

  2. delphi之动态库调用和串口通讯

    串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...

  3. 引用kernel32.dll中的API来进行串口通讯

    串口通讯可以引出kernel32.dll中的API来操作,相关源码如下:using System;using System.Runtime.InteropServices; namespace Tel ...

  4. Delphi中的Sender:TObject对象解析转载

    https://blog.csdn.net/jl_tiny/article/details/24376661 Delphi中的Sender:TObject对象解析 procedure TForm1.B ...

  5. delphi 中OutputDebugString 函数的妙用(转载)

    原文地址 https://www.peganza.com/delphi-and-outputdebugstring.html Ever wanted to monitor your Delphi ap ...

  6. delphi 中如何处理“幽灵”、“熔断”?(转载)

    原始连接:http://dannywind.nl/delphi/meltdown-spectre-and-delphi/ Meltdown, Spectre and Delphi Don’t pani ...

  7. 在Delphi中关于UDP协议的实现

    原文地址:在Delphi中关于UDP协议的实现作者:菜心 首先我把UDP无连接协议的套接字调用时序图表示出来 在我把在Delphi中使用UDP协议实现数据通讯收发的实现方法总结如下:   例子描述:下 ...

  8. 用SPCOMM 在 Delphi中实现串口通讯 转

      用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...

  9. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

随机推荐

  1. oracle-asm,acfs

    两个类比asm与lvm比较asm实例与oracle实例比较 ASM是OMF的一个扩展,通过ASM和OMF的结合,oracle在上层将数据文件进行自我管理,在底层将存储进行自我管理.同时,ASM模式下, ...

  2. 2的N次方 【转】

    题目的链接为:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1009 题目为: 2的N次 ...

  3. Apache ab并发负载压力测试

    由于现在网站都需要能够承受高并发要求的能力,所以当我们写完代码后,如果需要上线,最好都经过压力测试后,这样比较好 运行: 在Windows系统下,打开cmd命令行窗口,定位到apache安装目录的bi ...

  4. mybatis 中的稍微复杂些的sql语句

    mybatis 中的稍微复杂些的sql语句: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  5. 详解@Autowired、@Qualifier和@Required

    A.@Autowired org.springframework.beans.factory.annotation.Autowired public @interface Autowired Mark ...

  6. Google Play开发者账号注册与失败申诉攻略

    Google Play开发者账号注册与失败申诉攻略 这篇文章我在网上找了好久,是在Google play进行开发者账号注册方法,介绍的很详细.现在分享一下.[原文地址] 为了方便开发者们注册谷歌的官方 ...

  7. java单例模式和双例模式

    今天朋友找我给做道题,双例模式,我是没听说过,都说是单例模式和多例模式, 也不知道双例模式什么时候用,就简单写了一个案例,不知道对不对,个人感觉蛮对的,双例就是单例+单例,废话不说了!!!! /* * ...

  8. android 反编译 逆向工具整理

    需要准备的道具需要哪些软件会在后面逆向过程中详细介绍,这里先大致罗列一下 android一台root并安装了xposed框架的手机(主要是为了脱壳) 类似[海马玩]这种模拟器 android-kill ...

  9. 【PDF】java使用Itext生成pdf文档--详解

    [API接口]  一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...

  10. Spring实战2:装配bean—依赖注入的本质

    主要内容 Spring的配置方法概览 自动装配bean 基于Java配置文件装配bean 控制bean的创建和销毁 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的,这些组件必须 ...