gpt4 book ai didi

php - 无法使用fopen或php_serial.class.php写入/dev/ttyUSB0

转载 作者:行者123 更新时间:2023-11-30 17:42:28 25 4
gpt4 key购买 nike

我正在尝试将此 C 脚本重写为 PHP。(示例)

// send packet to network
tty_fd=open(buf50, O_RDWR | O_NOCTTY | O_SYNC);
write(tty_fd,&packet2send,34);
close(tty_fd);

此 C 脚本还以十六进制形式从/dev/ttyUSB0 读取数据,但我在写入时遇到问题(在 php 中)。

我已经能够成功阅读,但恐怕写作不起作用 - 或者我无法看到我写的内容。

我用过fopen:

$request_packet_ok = dechex(ord("~")). " 02 ff ff 07 ff ab 2c 4d 65 73 73 61 67 65 20 43 43 20 23 31 2f 34 20 20 20 20 ff ff d2 d7 00 00 b5 7a\r"; //Means "Message CC #1/4" on the thermostat


$device = "/dev/ttyUSB0";

if (is_writable($device)) {
echo "\n".'The file is writable'."\n";

$fp =fopen($device, "w+");
if( !$fp) {
echo "Error";die();
}

while(true){

echo "\n".'writing: '.$request_packet_ok;
fwrite($fp, $request_packet_ok);
$packet='';
$var = fread($fp, 35);
for ($i=0; $i < strlen($var);$i++){
$packet .= dechex(ord( substr($var,$i,1) ) );
}
var_dump($packet);
}
fclose($fp);

我也尝试过使用 php_serial.class.php:

define('PACKET_SIZE_LIMIT',70);
$serial = new phpSerial;
$serial->deviceSet('/dev/ttyUSB0');
$serial->confBaudRate(19200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("rts/cts");
$serial->deviceOpen();
$starttime = microtime(true);


$sof='~';
$packet = '';
$output = '';
while (true) {
$read = $serial->readPort();
if ($read) {


while (strlen($output) < PACKET_SIZE_LIMIT){
for($i = 0; $i <strlen($read);$i++){
$each_char = substr($read,$i,$i+1);

if ( strlen(dechex(ord($each_char))) != 2 ){
$output.= sprintf('%02d',dechex(ord($each_char)));
}else{
$output.= dechex(ord($each_char));
}

}
$read = $serial->readPort();
}

echo $output;

}


}


$serial->deviceClose();

目的是使用 PHP 而不是使用 C 代码向恒温器发送消息。

由于我能够使用 php 读取天线发送的数据包,我假设我可以访问/dev/ttyUSB0 进行写入,但由于某种原因,我永远看不到我发送/写入的内容天线(将文本消息发送到恒温器显示屏 - 这不会发生)。我也没有收到任何错误..!

我希望写入/dev/ttyUSB0,然后读取我从中写入的内容(以检查它是否有效 - 作为测试)。

我没有获得任何权限被拒绝,天线看起来像所附的图像(将其插入 Windows 来向您展示,它需要在 Ubuntu 上运行)

Antenna Plugged into the USB on Linux (/dev/ttyUSB0)

我尝试使用以下命令查看内容无济于事(当我使用 root 权限在该机器上运行 php 代码时):

screen /dev/ttyUSB0 19200
od -x < /dev/ttyUSB0

如何使用 php 通过/dev/ttyUSB0 发送消息并接收该消息?或者至少进行某种简单的测试来确认发送的内容实际上可以被读取。

最佳答案

在 C 程序中,您编写(tty_fd,&packet2send,34); i。 e. 34字节。在 PHP 脚本中 fwrite($fp, $request_packet_ok); 其中 $request_packet_ok 是一个 105 字节的字符串。显然,您错误地以十六进制空格分隔的表示形式发送消息,而您应该将其作为原始字节发送。

关于php - 无法使用fopen或php_serial.class.php写入/dev/ttyUSB0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20577013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com