php使用rs232串口通讯传送文件的应用演示

jackxiang 2009-2-11 17:46 | |
先看这篇文章:
http://www.chinaunix.net/jh/27/771726.html


引用:
接上篇:
[硬件 通讯]PHP在RS232串口通讯协议的应用演示[测试环境PHP5.1.4]
http://bbs.chinaunix.net/viewthread.php?tid=771726


<?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通讯协议,包含了协议的
//   请求和响应,数据帧的结构。
//       演示过程为通讯的请求和响应,文件的发送(数据帧), 通讯的结束
//       数据帧的结构为当前的当前数据的长度,数据的HEX字符串(两位补足)
//        
//       欢迎探讨PHP在RS232串口通讯上的应用。
// --------------------------------------------------------------------------
set_time_limit(0);
exec('mode COM1: baud=9600 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;
        }
    }
}

$handle = fopen("E:\\RS232\\TEST\\S_WAPMMonitor.exe", 'w');
/// read
$len = 2;
$t=0;while ($handle && ($t++)<1000)
{
    $len = 2;
    $data = dio_read($fd, $len);
    if($data==chr(0).chr(3)){
        echo "S_RECV:03\n";
        break;
    }
    elseif ($data) {
        $len = hexdec($data);
        if($len>0)
        {
        $data = dio_read($fd, $len);
        if($data){
            fwrite($handle, str2hex($data));
            echo "S_RECV:($len) ".microtime()."\n";
        }
        }
    }
}
fclose($handle);
dio_close($fd);

function str2hex($string)
{
    $str = '';
    for($i=0; $i<strlen($string); $i+=2){
        $str .= chr(hexdec(substr($string,$i,2)));
    }
    return $str;
}
?>





<?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通讯协议,包含了协议的
//   请求和响应,数据帧的结构。
//       演示过程为通讯的请求和响应,文件的发送(数据帧), 通讯的结束
//       数据帧的结构为当前的当前数据的长度,数据的HEX字符串(两位补足)
//        
//       欢迎探讨PHP在RS232串口通讯上的应用。
// --------------------------------------------------------------------------
set_time_limit(0);
exec('mode COM2: baud=9600 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);
}
*/

$handle = fopen ("E:\\RS232\\TEST\\WAPMMonitor.exe", "rb");
$data = "";
while ($handle && !feof($handle)) {
  $sdata = fread($handle, 127);
  $sdata = hex2str($sdata);
  $slen = strlen($sdata);
  $stxlen = sprintf("%02X",$slen);
  dio_write($fd,"$stxlen");
  dio_write($fd,"$sdata");echo "C_SEND:($slen) ".microtime()."\n";
  usleep(300);
}
fclose($handle);


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;
}

function hex2str($hexstring)
{
    $str = '';
    for($i=0; $i<strlen($hexstring); $i++){
        $str .= sprintf("%02X",ord(substr($hexstring,$i,1)));
    }
    return $str;
}
?>



引用:
1. 代码之中的:    请修改为你自己的实际测试文件

$handle = fopen ("E:\\RS232\\TEST\\WAPMMonitor.exe", "rb");


$handle = fopen("E:\\RS232\\TEST\\S_WAPMMonitor.exe", 'w');


2. 进过测试,可以传送文本文件、二进制文件。

3. HQB232协议修改,原01、02、03指令,修改为chr(0).chr(1)、chr(0).chr(2)、chr(0).chr(3)来构成


http://blog.sina.com.cn/s/blog_44c07fb301000449.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/1619/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2009-2-11 17:48
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]