登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

梦想之鹰的天空

天高任鸟飞......放飞....心情..........放飞.....梦想

 
 
 

日志

 
 

PHP使用RS232串口通讯传送文件的应用演示  

2010-12-31 12:11:16|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
<?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;
}
?>
[/font][/color]


引用:
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)来构成
  评论这张
 
阅读(880)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018