1.
什么是RS232/RS484及其应用?
引用:
RS232接口就是串口,电脑机箱后方的9芯(或25芯)插座,旁边一般有
一般机箱有两个,新机箱有可能只有一个。笔记本电脑有可能没有。
有很多工业仪器将它作为标准通信端口。通信的内容与格式一般附在仪器的用户说明书中。
计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输 时,避免了多条线路特性的不一致而被广泛采用。
(1)接口的信号内容
(2)接口的电气特性
(3)
(4)传输电缆长度
1.RS-232-C是美国电子工业协会EIA(Electronic
2.RS-485总线,在要求通信距离为几十米到上千米时,广泛采用RS-485
以往,PC与智能设备通讯多借助RS232、RS485、以太网等方式,主要取决于设备的接口规范。但RS232、RS485只能代表通讯的物理 介质层和链路层,如果要实现数据的双向访问,就必须自己编写通讯应用程序,但这种程序多数都不能符合ISO/OSI的规范,只能实现较单一的功能,适用于 单一设备类型,程序不具备通用性。在RS232或RS485设备联成的设备网中,如果设备数量超过2台,就必须使用RS485做通讯介质,RS485网的 设备间要想互通信息只有通过“主(Master)”设备中转才能实现,这个主设备通常是PC,而这种设备网中只允许存在一个主设备,其余全部是从 (Slave)设备。而现场总线技术是以ISO/OSI模型为基础的,具有完整的软件支持系统,能够解决总线控制、冲突检测、链路维护等问题。
来源网址:http://zhidao.baidu.com/question/4578886.html
从串口双机对联线缆指南
引用:
(一)串行通讯电缆的制作
无论是9孔插头,还是25孔插头,其串行通讯电缆连接时都要遵循下列对接关系:
SG←→SG TXD←→RXD RXD←→TXD RTS←→CTS
CTS←→RTS DTR←→DSR DSR←→DTR
根据上述对接关系,就可以非常方便地连接串行通讯电缆。这里顺便介绍一下上述各引脚所代表的含义:
SG英文全称为Signal
TXD指Transmitted
RXD指Received
RTS指Request
CTS指Clear
DTR指Data
DSR指Data
在制作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://win2000server.vicp.net:88/Article_Show.asp?ArticleID=25
二、测试环境的构建:
1.
当然,你也完全可以这么操作一台电脑上面的两个串口,而不需要两台电脑;如果你有两个串口的话。
因为我以前做过工业控制底层开发,所以我可以很容易的构建这个基本的环境;
实际上,只要:[color=red]RxD
这一点不做任何答疑。
2.
操作系统:WindowsXP(其他Windows系统没有测试)
PHP5.1.4:
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,并打开设置然后保存:
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
四:演示代码:
[color=Green][font=Times
//-------------------------------------------------------------------------- // 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);
//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("d",$t) . "=" . microtime() . " (" . randomkeys(rand(0,35)) . ")"; $slen = strlen($sdata); $stxlen = sprintf("d",$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 = "1234567890abcdefghijklmn opqrstuvwxyz"; 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 实际结果如下:
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 (krruv981gpf1pmi1fz4qz09e 9) 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 (idb0laix4a6ryxz5nb7u74ia za601it6sv) S_RECV:(56)009=0.19170100 1150031782 (r9ypgtvu4j7w1u141qx6im20 ajy7) S_RECV:(53)010=0.19171000 1150031783 (wq5mp1sdfuet1tp0x3vk67n4 7) S_RECV:03 F:\usr\local\php5>
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 (krruv981gpf1pmi1fz4qz09e 9) 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 (idb0laix4a6ryxz5nb7u74ia za601it6sv) C_SEND:(56)009=0.19170100 1150031782 (r9ypgtvu4j7w1u141qx6im20 ajy7) C_SEND:(53)010=0.19171000 1150031783 (wq5mp1sdfuet1tp0x3vk67n4 7) 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 ));