zoukankan      html  css  js  c++  java
  • PHP在RS232串口通讯协议的应用演示[测试环境WinXP/PHP5.1.4]

    一. 预先的知识:

    计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。 在串行通讯时,要求通讯双方都采用一个标准接口,使不同 的设备可以方便地连接起来进行通讯。 RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标 准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间 串行二进制数据交换接口技术标准”该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信 号的电平加以规定。

    (2)接口的电气特性 在RS-232-C中任何一条信号线的电压均为负逻辑关系。即:逻 辑“1”,-5— -15V;逻辑“0” +5— +15V 。噪声容限为2V。即 要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号 作为逻辑“1” 
    (3) 接口的物理结构 RS-232-C接口连接器一般使用型号为DB-25的25芯插头座,通常插头在DCE端,插座在DTE端. 一些设备与PC机连接的RS-232-C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。

    1.RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道,在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。RS-232-C标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。

     

    来源网址:http://zhidao.baidu.com/question/4578886.html
    从串口双机对联线缆指南

    QUOTE:
      (一)串行通讯电缆的制作

      SG←→SG TXD←→RXD RXD←→TXD RTS←→CTS
      CTS←→RTS DTR←→DSR DSR←→DTR

      SG英文全称为Signal Ground/Common Return,表示信号地;
      TXD指Transmitted Data,表示数据发送;
      RXD指Received Data,表示接收数据;
      RTS指Request To Send,表示发送请求;
      CTS指Clear To Send,表示清除请求;
      DTR指Data Terminal Ready,表示数据终端准备就绪;
      DSR指Data Signal Rate Selector,表示数据置位准备就绪。

      9孔插头-9孔插头引脚连线为:2-3、3-2、4-6、5-5、6-4、7-8、8-7。
      9孔插头-25孔插头引脚连线为:2-2、3-3、4-6、5-7、6-20、7-5、8-4。
      25孔插头-25孔插头引脚连线为:2-3、3-2、4-5、5-4、6-20、7-7、20-6。

    说明:这里有部分串口通信说明图片,请到 http://bbs.chinaunix.net/viewthread.php?tid=771726 进行查看

    }

    $ff = dio_stat($fd);print_r($ff);
    echo "HQB232 SERVER is listenning on COM1 ";
    /// 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 ";
                            echo "S_SEND:02 ";
                            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 ";
                    break;
            }
            elseif ($data) {
                    $len = intval($data);
                    $data = dio_read($fd, $len);
                    if($data){
                            echo "S_RECV:($len)$data ";
                    }
            }
    }
    dio_close($fd);
    ?>


     

    CODE:[Copy to clipboard]<?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 COM2: baud=115200 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 ";
    dio_write($fd,chr(0).chr(1));echo "C_SEND:01 ";
    $len = 2;
    $t=0;while(($t++)<1000)
    {
            $data = dio_read($fd, $len);
            if($data==chr(0).chr(2)){
                    echo "C_RECV:02 ";        
                    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 ";
            //sleep(1);
    }
    dio_write($fd,chr(0).chr(3));echo "C_SEND:03 ";
    dio_close($fd);

    function randomkeys($length)
      {
       $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
       for($i=0;$i<$length;$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
    ));

  • 相关阅读:
    maven 错误:读取 xxx.jar 时出错;invalid LOC header (bad signature) 1 错误
    设计模式总结篇系列:建造者模式(Builder)
    java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
    Rxlifecycle使用详解,解决RxJava内存泄露问题
    详细解析RxAndroid的使用方式
    Android开源项目:GifView——Android显示GIF动画
    Rxjava2的学习与总结
    Pycharm连接gitlab
    Pycharm+Django+Python+MySQL开发 后台管理数据库
    Django-Model操作数据库(增删改查、连表结构)
  • 原文地址:https://www.cnblogs.com/66w66/p/13888768.html
Copyright © 2011-2022 走看看