SPCOMM的一些用法注意
使用串口SPCOMM接收数据的时候0x11和0x13无法接受,从时间间隔上看来可以接收,但是无法显示。网上查错误得:
------------------------------------------------------------------------
OutX_XonXOffFlow/InX_XonXoffFlow:这个属性是指进行发送/接收时的软件握手标志,两个握手信号之间的数据被认为是通讯数据,收到握手信号后,通讯就中止了。
FOutx_XonXoffFlow := True;
FInx_XonXoffFlow := True;
XOffChar/XOnChar:这是指握手的字节,默认的初始中,有
FXonChar := chr($11);
FXoffChar := chr($13);
至此,真相大白。0x11,0x13被占用为通讯握手信号,自然不会得到正确的处理。
问题找到了,解决也很容易。只需要在Comm的初始化中,自己定义
Comm.Inx_XonXoffFlow := False;
Comm.Outx_XonXoffFlow := False;
用Delphi 实现串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函数;在Delphi 中调用其它串口通信程序。
使用API方法的优点是比较适合于编写较为复杂的低层次通信程序,但缺点是编写串口通信程序较为复杂,需要掌握大量通信知识。
Spcomm是Small-Pig Team开发的一个第三方Delphi串口控件,该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,且编程简单、通用性强、可移植性好。在Delphi软件开发中已经成为一个被广泛应用的串口通信开发控件。
Spcomm共实现了三个类:串口类Tcomm、读线程类TreadThread以及写线程类TwziteThread[1]。Tcomm的某个实例在方法StartComm中打开串口,并实例化了一个读线程ReadThread和一个写线程WriteThread,它们和主线程之间进行消息的传递,实现串口通信。
在Delphi7.0中安装Spcomm串口通信控件的方法为:选择Delphi7.0的“Component”菜单,点击“Install Component...”菜单项,然后在弹出的Into existing package属性页中Unit file name输人框中选择SPCOMM.pas文件,单击两次 “OK”按钮后,就可以将Spcomm控件安装到Delphi7.0的System组件页上。
Spcomm串口通信控件的基本属性、方法和事件说明如下:
CommName属性:计算机串口端口号的名字,COM1、COM2……等,在打开串口前,必须填写好此值。
Parity属性:校验位 None、Odd、Even、Mark、Space等。
BaudRate:设定支持串口通信用的波特率9600,4800等,根据实际需要来定,在串口打开后也可更改波特率,实际波特率随之更改。
ByteSize属性:表示一个字节中,使用多少个数据位收发数据,根据具体情况设定5、6、7、8等。
StopBits属性:表示一个字节中,使用停止位的位数,根据具体情况设定1、1.5、2等。
SendDataEmpty属性:布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。
StartComm方法:用来打开通信串口,开始通信。如果失败,则会导致串行口错误。错误类型大致分为串行口己处于打开状态,所以不能打开串行口,不能创建读写进程,不能建立串行口缓冲区等。
StopComm方法:用来停止通信串行口的所有进程,关闭串口。
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word)方法是带有布尔型返回值的函数,其中参量pszStr-ingToWrite是要写入串行口的字符串,DwSizeaf- DataToWrite是要写入的字符串的长度。该函数通过一个写线程向串行口输出缓冲区发送数据。发送操作将在后台默认执行。如果写线程PostMessage成功,则返回值是True,若写线程失败,返回值是False。
OnReceiveData(Buffer:Pointer;BufferLength:Word),其中Buffer是指向输入缓冲区的指针。BufferLength是从缓冲区收到的数据长度。当输入缓冲区收到数据时,该事件被触发。当输入缓存有数据时将触发该事件,对从串口收到的数据进行处理。
Spcomm串行通信控件具有多线程的特性,接收和发送数据分别在两个线程内完成,接收线程负责收到数据时触发OnReceiveData事件;用WriteCommData()函数将待发送的数据写入输出缓冲器,发送线程在后台完成数据发送工作。在接收和发送数据前需要初始化串口,用StartComm方法打开串口,退出程序时用StopComm方法关闭串口。
Spcomm应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关信息的传递也是以消息传递的方式进行的。在使用Spcomm进行串口通信编程,除按照说明使用外,还需要特别注意以下两个问题。
首先,Spcomm是通过ReadIntervalTimeout属性的设置,来确定所接收到的数据是否属子同一帧数据,其默认值是100ms,也就是说,只要任何两个字节到达的时间间隔小于1OOms,都被认为是属于同一帧数据,在与单片机协同工作时,要特别注意这个问题[2]。
另外,Spcomm的默认属性设置是支持软件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),当单片机以二进制方式发送数据时,必须要禁用Spcomm对于软件流控制的支持,否则,在数据帧中出现的13H,11H会被Spcomm作为控制字符而加以忽略。
SPCOMM的一些用法注意的更多相关文章
- delphi SPCOMM的一些用法注意
使用串口SPCOMM接收数据的时候0x11和0x13无法接受,从时间间隔上看来可以接收,但是无法显示.网上查错误得: --------------------------------------- ...
- 教程-Delphi中Spcomm使用属性及用法详解
Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
随机推荐
- Ubuntu上安装mono并进行C#代码测试
微软的.NET框架与Linux开发和管理,是Buider AU和一个更广泛行业的两个最流行的主题. 大多数时候,这两个主题往往会产生冲突,很少有开发者需要同时了解这两个工具.但是,许多人都没意识到, ...
- 127 Word Ladder
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...
- 第一次正式java web开发项目的总结
去年下半年到现在,因为公司人员流动,也有好几个新进的员工分给我来带领,也有刚从学校出来的,在和他们交流的过程中,不由的想起自己刚刚进入这行的一些感想. 记得自己当初写过一篇总结的,我想这些对于刚出校门 ...
- ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)(转载)
背景: ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度(包括米聊也是这么做的). 可是在ios5中,键盘布局变了, ...
- C#应用程序单进程检测
以下程序经过VS2010测试通过: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Ma ...
- Apache+php在windows下的安装和配置
下载和配置php 下载php:http://windows.php.net/download/ php-5.4.16-Win32-VC9-x86.zip 下载apache: http://ht ...
- [Vue]学习中遇到的疑点
computed:计算属性,官方api上说计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.但是经过测试并没有缓存.案例: computed: { now: function () { c ...
- 使用Spring的命名空间p装配属性-摘自《Spring实战(第3版)》
使用<property>元素为Bean的属性装配值和引用并不太复杂.尽管如此,Spring的命名空间p提供了另一种Bean属性的装配方式,该方式不需要配置如此多的尖括号. 命名空间p的sc ...
- SparkSql官方文档中文翻译(java版本)
1 概述(Overview) 2 DataFrames 2.1 入口:SQLContext(Starting Point: SQLContext) 2.2 创建DataFrames(Creating ...
- 大神:python怎么爬取js的页面
大神:python怎么爬取js的页面 可以试试抓包看看它请求了哪些东西, 很多时候可以绕过网页直接请求后面的API 实在不行就上 selenium (selenium大法好) selenium和pha ...