PHP 串行适用于 Windows,但不适用于 linux

我有一个 PHP 脚本,我试图在 Linux 上通过 Apache 运行它。该脚本使用 PHP Serial 向使用 TAP 协议的寻呼系统发送通知。问题是脚本在 Linux 上不起作用,无论我是 localhost PHP 文件还是远程。 该脚本在 Windows 上工作,但在 Linux 上不起作用


我尝试将串行端口从 USB 串行端口交换到真正的串行端口,但这不起作用,我尝试从服务器本身和远程连接运行它,并且网络正常工作,我尝试将代码更改为只发送一个串行端口上的消息我无法使用 PHP 发送消息,我尝试使用 python 通过端口接收消息,并且能够向端口发送消息并使用 python 获取消息,因此端口正在工作。


<?php

header('Access-Control-Allow-Origin: *');

include "php_serial.class.php";


$pagerSerial = new phpSerial();

$pagerSerial->deviceSet("/dev/ttyUSB0");

$pagerSerial->confBaudRate(9600);

$pagerSerial->confParity("none");

$pagerSerial->confCharacterLength(8);

$pagerSerial->confStopBits(1);

$pagerSerial->confFlowControl("none");



$pagerSerial->deviceOpen();



$msg_to = 102;

$msg_text = "Test"; 


$message = chr(2).$msg_to.chr(13).$msg_text.chr(13).chr(3);

$checksum = calcChecksum($message);

$message .= $checksum.chr(13);

$CR = chr(13);

$end = chr(27).chr(4).chr(13);

$login = chr(27)."PG1".chr(13);


$pagerSerial->sendMessage($CR);

sleep(2);

$pagerSerial->sendMessage($message);

sleep(2);

$pagerSerial->sendMessage($end);



function calcChecksum($message) {

$split = str_split($message); $sum = 0;

foreach ($split as $value) { $numb = ord($value); $sum += $numb; }

$d3 = 48 + $sum - intval($sum / 16) * 16;

$sum = intval($sum / 16);

$d2 = 48 + $sum - intval($sum / 16) * 16;

$sum = intval($sum / 16);

$d1 = 48 + $sum - intval($sum / 16) * 16;

return chr($d1).chr($d2).chr($d3);

};

我不明白为什么它适用于 Windows,而不适用于 Linux。当我使用 python 时,我可以让端口与 pyserial 一起工作。我一直无法让脚本在 python 上运行,但我一直在尝试。最后,最好让它在 PHP 中为我长期尝试设置的界面工作。任何线索为什么它可以在一个操作系统中工作,而不是另一个?


编辑:系统之间的 Chrs 可能不同吗?我认为 window 和 linux 处理字符返回的方式不同,但我只需要发送该数据,以便寻呼系统了解我发送的 TAP 协议。


料青山看我应如是
浏览 165回答 1
1回答

墨色风雨

默认情况下,Windows 将返回作为 chr(13).chr(10) 处理,因此在 linux 上您需要添加 chr(10) 以便 TAP 能够使用返回。正如用户 Dave 所提到的。在评论中添加此内容以关闭它。
打开App,查看更多内容
随时随地看视频慕课网APP