概述
二、测试环境的构建:
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]所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复