php打开rs232,PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]

本文介绍了如何使用PHP的DirectIO函数在Windows环境下构建RS232串口通讯环境,包括串口连接、PHP运行环境的配置以及简单的通讯协议。通过提供上位机和下位机的PHP代码示例,展示了数据的发送与接收过程。
摘要由CSDN通过智能技术生成

二、测试环境的构建:

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]

$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]

$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 {

$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

));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值