[运行正常]PHP串口编程代码实例

jackxiang 2008-11-3 11:49 | |
PHP 5.2.6 (cli) (built: May  2 2008 18:02:07),扩展了一个:extension=php_dio.dll
可以通过:mode com1 来查询com1的情况!

exec() 這個 PHP 函式執行 mode 外部指令,用來設定 com port 相關資訊,以範例來說是設定傳輸速率=19200、資料位元=8、停止位元=1、同位檢查=無,這要視設備而定,設定正確才能做存取動作。
_____________________________________Server端_______________________________
<?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通讯协议,包含了协议的

//   请求和响应,数据帧的结构。

//       演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束

//       数据帧的结构为当前的序号,microtime(),随机字符串

//

//       欢迎探讨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;
    }
  }
}
/// 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);
?>





_____________________________________client端_______________________________


<?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通讯协议,包含了协议的

//   请求和响应,数据帧的结构。

//       演示过程为通讯的请求和响应,十次数据帧的发送, 通讯的结束

//       数据帧的结构为当前的序号,microtime(),随机字符串

//

//       欢迎探讨PHP在RS232串口通讯上的应用。

// --------------------------------------------------------------------------

set_time_limit(0);
//exec('mode COM1: baud=9600 data=8 stop=1 parity=n xon=on');
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);
echo "HQB232 CLIENT is start on COM1\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<$length;$i++)
   {
     $key .= $pattern{rand(0,35)};
   }
   return $key;
}
?>


注意:在window下com是当作一个文件打开的,只能有一个进程控制,可能导致clien 或者 server 出现:Warning: dio_open(): cannot open file COM1: with flags 2 and permissions 0: Permission denied in ****

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


最后编辑: jackxiang 编辑于2008-11-3 17:13
评论列表
2012-7-1 12:44 | root Email Homepage
需要安装扩展,2012/07/01最近出的,以前的扩展好像多少有一点Bug。
2011-9-24 03:05 | Irene Email
想请问下 我得到的error是
** flags 2 and permissions 0: invalid argument in ****

dio_open(),fopen(),或php_serial.class.php的方法全试过了,但就是连接不到....

希望可以得到你的帮助 谢谢你
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

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