热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP在RS232串口通讯协议的应用演示[测试_php

一.预先的知识:什么是RS232RS484及其应用?QUOTE:RS232接口就是串口,电脑机箱后方的9芯(或25芯)插座,旁边一般有|O|O|样标识。一般机箱有两个,新机箱有

一. 预先的知识:

什么是RS232/RS484及其应用?

 

 

 

QUOTE:
RS232接口就是串口,电脑机箱后方的9芯(或25芯)插座,旁边一般有 “|O|O|” 样标识。
一般机箱有两个,新机箱有可能只有一个。笔记本电脑有可能没有。
有很多工业仪器将它作为标准通信端口。通信的内容与格式一般附在仪器的用户说明书中。

计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。 在串行通讯时,要求通讯双方都采用一个标准接口,使不同 的设备可以方便地连接起来进行通讯。 RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标 准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间 串行二进制数据交换接口技术标准”该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信 号的电平加以规定。

(1)接口的信号内容 实际上RS-232-C的25条引线中有许多是很少使用的,在计算机与终端通讯中一般只使用3-9条引线。RS-232-C最常用的9条引线的信号内容见附表1所示

(2)接口的电气特性 在RS-232-C中任何一条信号线的电压均为负逻辑关系。即:逻 辑“1”,-5― -15V;逻辑“0” +5― +15V 。噪声容限为2V。即 要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号 作为逻辑“1”
(3) 接口的物理结构 RS-232-C接口连接器一般使用型号为DB-25的25芯插头座,通常插头在DCE端,插座在DTE端. 一些设备与PC机连接的RS-232-C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。

(4)传输电缆长度 由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应为50英尺,其实这个4%的码元畸变是很保守的,在实际应用中,约有99%的用户是按码元畸变10-20%的范围工作的,所以实际使用中最大距离会远超过50英尺,美国DEC公司曾规定允许码元畸变为10%而得出附表2 的实验结果。其中1号电缆为屏蔽电缆,型号为DECP.NO.9107723 内有三对双绞线,每对由22# AWG 组成,其外覆以屏蔽网。2号电缆为不带屏蔽的电缆。型号为DECP.NO.9105856-04是22#AWG的四芯电缆。

1.RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道,在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。RS-232-C标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。

2.RS-485总线,在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准。RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便,可以省掉许多信号线。应用RS-485 可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。

 

以往,PC与智能设备通讯多借助RS232、RS485、以太网等方式,主要取决于设备的接口规范。但RS232、RS485只能代表通讯的物理介质层和链路层,如果要实现数据的双向访问,就必须自己编写通讯应用程序,但这种程序多数都不能符合ISO/OSI的规范,只能实现较单一的功能,适用于单一设备类型,程序不具备通用性。在RS232或RS485设备联成的设备网中,如果设备数量超过2台,就必须使用RS485做通讯介质,RS485网的设备间要想互通信息只有通过“主(Master)”设备中转才能实现,这个主设备通常是PC,而这种设备网中只允许存在一个主设备,其余全部是从(Slave)设备。而现场总线技术是以ISO/OSI模型为基础的,具有完整的软件支持系统,能够解决总线控制、冲突检测、链路维护等问题。

来源网址:http://zhidao.baidu.com/question/4578886.html
从串口双机对联线缆指南

 

QUOTE:

http://www.gaodaima.com/46642.htmlphp在RS232串口通讯协议的应用演示[测试_php

  (一)串行通讯电缆的制作

  无论是9孔插头,还是25孔插头,其串行通讯电缆连接时都要遵循下列对接关系:

  SG←→SG TXD←→RXD RXD←→TXD RTS←→CTS
  CTS←→RTS DTR←→DSR DSR←→DTR

  根据上述对接关系,就可以非常方便地连接串行通讯电缆。这里顺便介绍一下上述各引脚所代表的含义:

  SG英文全称为Signal Ground/Common Return,表示信号地;
  TXD指Transmitted Data,表示数据发送;
  RXD指Received Data,表示接收数据;
  RTS指Request To Send,表示发送请求;
  CTS指Clear To Send,表示清除请求;
  DTR指Data Terminal Ready,表示数据终端准备就绪;
  DSR指Data Signal Rate Selector,表示数据置位准备就绪。

  在制作9芯串口连线时,需要2个9孔插头和1.5米长的至少7芯的扁平电缆,引脚连线如下所示。

  9孔插头-9孔插头引脚连线为:2-3、3-2、4-6、5-5、6-4、7-8、8-7。
  9孔插头-25孔插头引脚连线为:2-2、3-3、4-6、5-7、6-20、7-5、8-4。
  25孔插头-25孔插头引脚连线为:2-3、3-2、4-5、5-4、6-20、7-7、20-6。

 

说明:这里有部分串口通信说明图片,请到 http://bbs.chinaunix.net/viewthread.php?tid=771726 进行查看

二、测试环境的构建:
1.  参考上面的《(一)串行通讯电缆的制作》,首先把两台电脑通过串口连结起来。
  当然,你也完全可以这么操作一台电脑上面的两个串口,而不需要两台电脑;如果你有两个串口的话。
  因为我以前做过工业控制底层开发,所以我可以很容易的构建这个基本的环境;
  实际上,只要:RxD TxD对接,GND直连即可,俗称三线连接。
  这一点不做任何答疑。

2. PHP运行环境的构建:
操作系统:WindowsXP(其他Windows系统没有测试)
PHP5.1.4: http://cn.php.net/get/php-5.1.4-Win32.zip/from/a/mirror
PECL5.1.4:http://cn.php.net/get/pecl-5.1.4-Win32.zip/from/a/mirror
解压PHP5.1.4,把PECL5.1.4之中的php_dio.dll放到PHP5.1.4的ext目录之下
把PHP5.1.4之中的php.ini-dist拷贝粘贴为php.ini,并打开设置然后保存:

CODE:[Copy to clipboard]extension=php_dio.dll
  这一点不做任何答疑。

 

三:参考资料:
1. 参考手册文档:
http://cn.php.net/manual/zh/ref.dio.php
http://cn.php.net/manual/zh/ref.exec.php
  如果代码之中有你没有见过,或者没有使用过,或者不熟悉的函数,请访问以上网址。
  主要使用了PHP的Direct IO Functions.

 

四:演示代码:

CODE:[Copy to clipboard]// ————————————————————————–
// File name   : RS232_Server.php
// Description : RS232演示上位机程序
// Requirement : PHP 5.1.4 (cli) (http://www.php.net)
//
// Copyright(C), HonestQiao, 2006, All Rights Reserved.
//
// Author: HonestQiao ([email protected]/QQ:5601680)
//
// 程序简介:
// 本程序与RS232_Client构成一个完整的演示系统,展示了PHP在RS232串口通讯上的应用。
// 程序之中实现了一个基础但是完整的RS232通讯协议(HQB232),通讯协议格式如下:
// 协议内容:
//             C->S 01 //请求通讯
//             S->C 02 //响应通讯
//             C->S LEN DATA //LEN表示数据(DATA)长度 DATA表示实际数据
//             C->S 03 //结束通讯
// 说明:S表示上位机 C表示下位机
//       HQB232表示HonestQiao演示的基础(Base)RS232通讯协议,包含了协议的
//   请求和响应,数据帧的结构。
//       演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束
//       数据帧的结构为当前的序号,microtime(),随机字符串
//       
//       欢迎探讨PHP在RS232串口通讯上的应用。
// ————————————————————————–
set_time_limit(0);
exec(‘mode COM1: baud=115200 data=8 stop=1 parity=n xon=on’);

$fd = dio_open(‘COM1:’, O_RDWR);
if(!$fd)
{
        die(“Error when open COM1”);
}

$ff = dio_stat($fd);print_r($ff);
echo “HQB232 SERVER is listenning on COM1/n”;
/// read
$len = 2;
$t=0;while (($t++)<1000)
{
        $data = dio_read($fd, $len);
        if ($data) {
                if($data==chr(0).chr(1)){
                        echo “S_RECV:01/n”;
                        echo “S_SEND:02/n”;
                        dio_write($fd,chr(0).chr(2));
                        break;
                }
        }
}

/// read
$len = 2;
$t=0;while (($t++)<1000)
{
        $len = 2;
        $data = dio_read($fd, $len);
        if($data==chr(0).chr(3)){
                echo “S_RECV:03/n”;
                break;
        }
        elseif ($data) {
                $len = intval($data);
                $data = dio_read($fd, $len);
                if($data){
                        echo “S_RECV:($len)$data/n”;
                }
        }
}
dio_close($fd);
?>

 

CODE:[Copy to clipboard]// ————————————————————————–
// File name   : RS232_Client.php
// Description : RS232演示下位机程序
// Requirement : PHP 5.1.4 (cli) (http://www.php.net)
//
// Copyright(C), HonestQiao, 2006, All Rights Reserved.
//
// Author: HonestQiao ([email protected]/QQ:5601680)
//
// 程序简介:
// 本程序与RS232_Server构成一个完整的演示系统,展示了PHP在RS232串口通讯上的应用。
// 程序之中实现了一个基础但是完整的RS232通讯协议(HQB232),通讯协议格式如下:
// 协议内容:
//             C->S 01 //请求通讯
//             S->C 02 //响应通讯
//             C->S LEN DATA //LEN表示数据(DATA)长度 DATA表示实际数据
//             C->S 03 //结束通讯
// 说明:S表示上位机 C表示下位机
//       HQB232表示HonestQiao演示的基础(Base)RS232通讯协议,包含了协议的
//   请求和响应,数据帧的结构。
//       演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束
//       数据帧的结构为当前的序号,microtime(),随机字符串
//       
//       欢迎探讨PHP在RS232串口通讯上的应用。
// ————————————————————————–
set_time_limit(0);
exec(‘mode COM2: baud=115200 data=8 stop=1 parity=n xon=on’);

$fd = dio_open(‘COM2:’, O_RDWR);
if(!$fd)
{
        die(“Error when open COM2”);
}

$ff = dio_stat($fd);print_r($ff);
echo “HQB232 CLIENT is start on COM2/n”;
dio_write($fd,chr(0).chr(1));echo “C_SEND:01/n”;
$len = 2;
$t=0;while(($t++)<1000)
{
        $data = dio_read($fd, $len);
        if($data==chr(0).chr(2)){
                echo “C_RECV:02/n”;       
                break;
        }
}
$len = 2;
$t=0;while(($t++)<10)
{
        $sdata = sprintf(“%03d”,$t) . “=” . microtime() . ” (” . randomkeys(rand(0,35)) . “)”;
        $slen = strlen($sdata);
        $stxlen = sprintf(“%02d”,$slen);
        dio_write($fd,”$stxlen”);
        dio_write($fd,”$sdata”);echo “C_SEND:($stxlen)$sdata/n”;
        //sleep(1);
}
dio_write($fd,chr(0).chr(3));echo “C_SEND:03/n”;
dio_close($fd);

function randomkeys($length)
  {
   $pattern = “1234567890abcdefghijklmnopqrstuvwxyz”;
   for($i=0;$i<$length;$i++)
   {
     $key .= $pattern{rand(0,35)};
   }
   return $key;
}
?>
 

五、演示过程:
上位机:开始->运行->CMD
然后转到PHP5.1.4目录之下,执行:
php -f RS232_Server.php

下位机:开始->运行->CMD
然后转到PHP5.1.4目录之下,执行:
php -f RS232_Client.php

实际结果如下:

CODE:[Copy to clipboard]F:/usr/local/php5>php -f e:/RS232_Server.php
Array
(
    [device] => 3
    [inode] => 0
    [mode] => 8192
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [device_type] => 3
    [size] => 0
    [atime] => 0
    [mtime] => 0
    [ctime] => 0
)
HQB232 SERVER is listenning on COM1
S_RECV:01
S_SEND:02
S_RECV:(53)001=0.19238200 1150031774 (krruv981gpf1pmi1fz4qz09e9)
S_RECV:(42)002=0.19144800 1150031775 (jrhw41mphuy0ui)
S_RECV:(40)003=0.19148500 1150031776 (lqq560p6v17r)
S_RECV:(36)004=0.19148900 1150031777 (3ct02xmc)
S_RECV:(28)005=0.19212700 1150031778 ()
S_RECV:(33)006=0.19162500 1150031779 (2ilqf)
S_RECV:(34)007=0.19167800 1150031780 (vwmdfc)
S_RECV:(62)008=0.19168700 1150031781 (idb0laix4a6ryxz5nb7u74iaza601it6sv)
S_RECV:(56)009=0.19170100 1150031782 (r9ypgtvu4j7w1u141qx6im20ajy7)
S_RECV:(53)010=0.19171000 1150031783 (wq5mp1sdfuet1tp0x3vk67n47)
S_RECV:03

F:/usr/local/php5>

 

CODE:[Copy to clipboard]F:/usr/local/php5>php -f e:/RS232_Client.php
Array
(
    [device] => 3
    [inode] => 0
    [mode] => 8192
    [nlink] => 1
    [uid] => 0
    [gid] => 0
    [device_type] => 3
    [size] => 0
    [atime] => 0
    [mtime] => 0
    [ctime] => 0
)
HQB232 CLIENT is start on COM2
C_SEND:01
C_RECV:02
C_SEND:(53)001=0.19238200 1150031774 (krruv981gpf1pmi1fz4qz09e9)
C_SEND:(42)002=0.19144800 1150031775 (jrhw41mphuy0ui)
C_SEND:(40)003=0.19148500 1150031776 (lqq560p6v17r)
C_SEND:(36)004=0.19148900 1150031777 (3ct02xmc)
C_SEND:(28)005=0.19212700 1150031778 ()
C_SEND:(33)006=0.19162500 1150031779 (2ilqf)
C_SEND:(34)007=0.19167800 1150031780 (vwmdfc)
C_SEND:(62)008=0.19168700 1150031781 (idb0laix4a6ryxz5nb7u74iaza601it6sv)
C_SEND:(56)009=0.19170100 1150031782 (r9ypgtvu4j7w1u141qx6im20ajy7)
C_SEND:(53)010=0.19171000 1150031783 (wq5mp1sdfuet1tp0x3vk67n47)
C_SEND:03

F:/usr/local/php5>
 

六:说明
1. exec(‘mode COM1: baud=115200 data=8 stop=1 parity=n xon=on’);
    exec(‘mode COM2: baud=115200 data=8 stop=1 parity=n xon=on’);

mode是CMD下面的命令,表示设置串口的参数,因为dio_tcsetattr() 未在Windows下面实现,所以需要使用CMD的mode命令来进行设置,具体用法,请看:help mode

2. 通讯协议使用ASCII文本进行,没有使用HEX十六进制。因为是演示程序,所以协议非常简单,但是一个协议基本的内容都有了。

3. 下位机程序的sleep(1),这个是通讯之中常见的情况,数据传输和上位机处理需要一定的时间。

4. 演示的为RS232,以此类推,你也可以用到其他的场合。例如:简单修改,应用到HTTP通讯。

5. 硬件环境的建立,PHP环境的建立,不做任何答疑。

6. 欢迎探讨。

7. 感谢mikespook的意见,附加,如果是*nix,则:
‘/dev/ttyS0’表示第一个COM端口,依此类推;端口的设置,应该在dio_open之后,使用:
dio_tcsetattr($fd, array(
  ‘baud’ => 9600,
  ‘bits’ => 8,
  ‘stop’  => 1,
  ‘parity’ => 0
));

 

欢迎大家阅读《PHP在RS232串口通讯协议的应用演示[测试_php》,跪求各位点评,若觉得好的话请收藏本文,by



推荐阅读
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
author-avatar
神秘的霸气沉默_168
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有