最近需要用PHP实现串口通信,由于通信对方发送数据没有结束标志,DIO函数总是阻塞,设置其O_NOBLOCK模式也不管用,想用MSCOMM32吧,还不能发16进制数(127以下可用ASCII),最后自己用DELPHI和SPCOMM做了一个,现在是能发送数据,但是其内部ONRECEIVEDATA事件接收的数据要如何才能送到PHP这个问题,一直解决不了,
PHP做这些明显感到不行了,控件的数据输出也得做成字符串,否则PHP还是接收不了,哪 位大侠做过类似的工作,给点帮助或提示,真是着急啊,PHP+烂通信协议要没招了。

解决方案 »

  1.   

    查看手册就知道了。具体根据你的需要去调用了
    <?php
    $Engine = new COM("SAPI.SpVoice");
    $File = new COM("SAPI.SpFileStream");
    ?>
      

  2.   

    两位误会我的意思了,用PHP调用COM我会,就是这个控件能发不能收,其SPCOMM内部的onreceivedata事件没有触发,可是我在html上用object标签引用,它就能正常触发。判断方法有两个,一个是我的控件有按键,可是操作和看到输出,这是在静态网页上,二是接收到数据后向C盘下写个文件,均证明html下正常。在PHP下调用该控件,却只能发不能收,c盘没有文件生成。以前我测试时,是通过修改全局变量的方法判断,觉得象是事件没有触发,今天用写文件的方法,确实证实没有接收事件触发,各位老大,遇到过这种情况吗?
    $comm_obj=new COM("rs232comproj.rs232com");
    $comm_obj->sportname="COM1";
    $comm_obj->baudrate=2400;
    $comm_obj->databits=8;
    $comm_obj->stopbits="1";
    $comm_obj->parity="none";
    echo "初始化串口完毕<br>";
    $comm_obj->opencom();
    echo "打开串口<br>";
    sleep(1);//打开串口后需要延时1秒才能发送数据
    $sdata="abccddeeff";
    echo $comm_obj->send_data($sdata);
    sleep(1);
    while(1){
    if($comm_obj->sendbufempty){echo "发送完毕<br>";break;}else echo "正在发送<br>";sleep(1);
    }
    echo "<hr>";
    echo "接收标志".$comm_obj->rcvdataflag."\.<br>";
    sleep(1);
    $j=0;
    while(1){
    if($comm_obj->rcvdataflag!=0){echo $comm_obj->rcv_data();$j=0;}else{sleep(1);$j++;if($j>=50)break;}
    }sleep(5);/*
    echo "数据接收完毕<br>";
    */
    $comm_obj->closecom();
    echo "关闭串口<br>";