我是靠谱客的博主 认真柠檬,最近开发中收集的这篇文章主要介绍php打开rs232,PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4],觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二、测试环境的构建:

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 COM1n";

/// read

$len = 2;

$t=0;while (($t++)<1000)

{

$data = dio_read($fd, $len);

if ($data) {

if($data==chr(0).chr(1)){

echo "S_RECV:01n";

echo "S_SEND:02n";

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:03n";

break;

}

elseif ($data) {

$len = intval($data);

$data = dio_read($fd, $len);

if($data){

echo "S_RECV:($len)$datan";

}

}

}

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 COM2n";

dio_write($fd,chr(0).chr(1));echo "C_SEND:01n";

$len = 2;

$t=0;while(($t++)<1000)

{

$data = dio_read($fd, $len);

if($data==chr(0).chr(2)){

echo "C_RECV:02n";

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)$sdatan";

//sleep(1);

}

dio_write($fd,chr(0).chr(3));echo "C_SEND:03n";

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:usrlocalphp5>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:usrlocalphp5>

CODE:[Copy to clipboard]F:usrlocalphp5>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:usrlocalphp5>

六:说明

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在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]的全部内容,希望文章能够帮你解决php打开rs232,PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部