仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1688|回复: 20
打印 上一主题 下一主题

[学习教程] PHP教程之PHP在RS232串口通信协定的使用演示[测试...

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:29 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
也许您在学习PHP的时候只想尽快的开发一个网站,也就会想我做网站,干嘛要学什么网页这些小儿科?不难看出,眼高手低的新手不在少数,这种思想无疑于建造空中楼阁,你不建地基,何来的房顶呢?php5|使用演示   一. 事后的常识:
甚么是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.百度.com/question/4578886.html
从串口双机春联线缆指南


QUOTE:
  (一)串行通信电缆的制造

  不管是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 停止检查

2、测试情况的构建:
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]<?php
// --------------------------------------------------------------------------
// 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 (honestqiao@hotmail.com/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]<?php
// --------------------------------------------------------------------------
// 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 (honestqiao@hotmail.com/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;
}
?>

5、演示进程:
上位机:入手下手->运转->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了,还是个新手,在这里受到了很多人的帮助,谢谢你们!
海妖 该用户已被删除
21#
发表于 2015-6-12 19:16:35 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
山那边是海 该用户已被删除
20#
发表于 2015-6-3 21:04:07 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
透明 该用户已被删除
19#
发表于 2015-5-8 14:42:43 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
不帅 该用户已被删除
18#
发表于 2015-5-6 00:09:10 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
飘灵儿 该用户已被删除
17#
发表于 2015-4-26 00:09:10 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
小妖女 该用户已被删除
16#
发表于 2015-4-20 03:49:16 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
乐观 该用户已被删除
15#
发表于 2015-4-16 23:10:47 | 只看该作者
实践是检验自己会不会的真理。
分手快乐 该用户已被删除
14#
发表于 2015-4-13 17:47:14 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
莫相离 该用户已被删除
13#
发表于 2015-4-13 17:46:30 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
第二个灵魂 该用户已被删除
12#
发表于 2015-4-4 14:07:10 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
再现理想 该用户已被删除
11#
发表于 2015-3-24 08:21:08 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
谁可相欹 该用户已被删除
10#
发表于 2015-3-17 23:20:36 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
因胸联盟 该用户已被删除
9#
发表于 2015-3-13 01:09:46 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
8#
发表于 2015-3-11 19:45:47 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
只想知道 该用户已被删除
7#
发表于 2015-3-8 17:06:46 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
老尸 该用户已被删除
6#
发表于 2015-2-26 19:49:29 | 只看该作者
实践是检验自己会不会的真理。
柔情似水 该用户已被删除
5#
发表于 2015-2-11 05:29:24 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
兰色精灵 该用户已被删除
地板
发表于 2015-2-5 05:47:55 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-2-4 13:34:07 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 18:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表