串行端口是一个物理接口,通过该接口一次一位地传输数据(单向或双向)。该术语通常指的是带有9针d-sub连接器的RS-232端口,该连接器曾经是PC上的标准串行接口。
我正在尝试使用以下脚本从使用 PHP 发送到 RS485 设备的命令中获取响应: 我正在尝试使用以下脚本从我使用 PHP 发送到 RS485 设备的命令中获取响应: <?php class rapidserial{ function _blocking($device,$mode){ stream_set_blocking($device, $mode); return true; } } $rapidserial = new rapidserial(); $device = "COM3"; shell_exec("mode $device BAUD=9600 PARITY=n DATA=8 STOP=2 xon=off octs=off rts=off"); $comport = fopen($device, "r+b"); if ($comport === false) { die("Failed opening com port<br/>"); } else { echo "Com Port Open<br/>"; } //Set non-blocking mode for writing $rapidserial->_blocking($comport,0); $atcmd = "\x0A\x04\x00\x00\x00\x49\x30\x87"; // fputs($comport, $atcmd); usleep(2000); // Set blocking mode for reading $rapidserial->_blocking($comport,1); echo 'Response:'; $res = fgets($comport, 4017); var_dump ($res); fclose($comport); ?> 这取自我在这里发表的相关帖子:https://superuser.com/questions/1815811/issue-addressing-modbus-via-rs485-and-php-on-windows在那里我被帮助发送了命令,帮助我的人提供的脚本有效。现在我尝试发送命令并获取响应,但它不起作用,响应为空。 我也尝试过使用https://github.com/toggio/PhpSerialModbus但它告诉我“无法打开设备”。 我知道我可以与设备通信,因为如果我使用某些 modbus 软件,我可以发送命令并获取响应。 更新:所以我已经从 Windows 设备转移到 Linux 设备来执行此操作,现在我在 PHP 中使用不同的 modbus 类取得了一些成功(https://github.com/toggio/PhpSerialModbus),但是问题是我没有收到所有返回的数据,它似乎被截断了,即使我尝试进一步请求寄存器(不是从零开始),我也没有收到我期望的所有数据。我知道它在那里,因为如果我使用如图所示的 modbus 软件,我可以看到它。 我的代码现在看起来像这样: <?php include("/var/www/html/PhpSerialModbus.php"); $modbus = new PhpSerialModbus(); $modbus->deviceInit('/dev/ttyUSB0',9600,'none',8,2,'none'); $modbus->deviceOpen(); $modbus->debug = false; $rawquery="\x0A\x04\x00\x00\x00\x49\x30\x87"; $modbus->sendRawQuery($rawquery.$modbus->crc16($rawquery),false); $result=$modbus->getResponse(true); function hex2float($strHex) { $hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x"); $bin = implode('', array_map('chr', $hex)); $array = unpack("Gnum", $bin); return $array['num']; } $bin_result = bin2hex($result); $bin_result = chunk_split($bin_result, 2, ','); $bin_result = substr($bin_result, 9); $myresults = print_r($bin_result, true); $final_array = explode(",", $myresults); print_r ($final_array); ?> 这给了我这个: [0] => 42 [1] => 48 [2] => 33 [3] => 33 [4] => 43 [5] => d3 [6] => 92 [7] => 00 [8] => 43 [9] => 75 [10] => 54 [11] => 86 [12] => 40 [13] => 66 [14] => 66 [15] => 72 [16] => be [17] => dc [18] => 7a [19] => de [20] => 44 [21] => 5c [22] => f0 [23] => 0a [24] => 44 [25] => 34 [26] => 50 [27] => 09 [28] => 42 [29] => f2 [30] => cc [31] => cd [32] => be [33] => f9 [34] => db [35] => 24 [36] => 40 [37] => 25 [38] => c2 [39] => 8f [40] => 42 [41] => 06 [42] => cc [43] => cd [44] => 42 [45] => 90 [46] => 00 [47] => 07 [48] => 42 [49] => ef [50] => 99 [51] => 9a [52] => 43 [53] => d3 [54] => 51 [55] => 65 [56] => 43 [57] => 73 [58] => c2 [59] => 9b [60] => 40 [61] => 80 [62] => PhpSerialModbus.php执行的读取循环是: while( ($byte = $this->serial->ReadPort()) && ((microtime(true)-$startTime)<3.0)) { $responseString=$responseString.$byte; usleep(50); } 它有问题:它只等待 50 微秒,这太短了。没有额外的数据 足够的时间到达并且循环提前终止。也许开发者的意思是 50 毫秒, 所以你可以像这样改变它: usleep(50000); 如果您不想更改 PhpSerialModbus.php,您可以在代码中执行以下操作: $result = $modbus->getResponse(true); do { usleep(50000); $data = $modbus->getResponse(true); $result .= $data; } while($data);
我在 python 脚本中成功读入并打印了一些串行端口数据。 我在使用什么工具/功能将串行端口数据更改为表格或连续数据时遇到困难...
Linux TTY 驱动程序等待接收 1024 字节,我需要无缓冲 [已关闭]
我正在寻找一个命令来监视串行终端端口,以十六进制转储未缓冲的数据。数据不是面向行的。 我试过: socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - | socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - |猫 >/dev/nul...
我正在通过串行方式使用 C++ 和 Arduino 通信。 我能够写入字节,但我注意到当我设置 DCB 设置并使用 SetCommState(m_hComm, &m_dcb) 时,它会写入三个字节...
socat -v 等待接收到 1024 字节,我需要无缓冲显示
我正在寻找一个命令来监视串行终端端口,以十六进制转储未缓冲的数据。数据不是面向行的。 我试过: socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - | socat -b 1 -v -x /dev/ttymxc2,cfmakeraw - |猫 >/dev/nul...
有时,我的一些集成测试会失败并出现上述消息。我正在使用下面的代码来准备端口。 for(int i = 0; i < 5; i++) { t...
使用 Windows cmd 测试 COM 端口 LED 客户显示屏
我买客显,客显有PL-2303HXD芯片。客户显示器连接到我的 PC 的 COM1。我可以使用该客户显示器附带的测试软件发送任何号码。但我不能
如何在 Yocto sysvinit-inittab 配方中从 /etc/inittab 中排除特定行?
我正在使用 Yocto 构建系统,并且遇到了管理 /etc/inittab 的配方的问题。具体来说,我在构建中使用 Karo Q93 板和 Karo 层。其中
我尝试通过串行(OSX w/多产驱动程序 -> USB RS232 适配器 -> 设备串行 ttl 端口上的 Tx、Rx 和 GND 引脚)与设备进行通信,并使用成功完成此操作 屏幕 /dev/tty.usb...
我几乎可以肯定这个问题以前曾被问过,但可能不会以我要问的方式。 我正在尝试创建一个名为 DAwaiter 的简单方法,该方法会等待特定的公共 bool
我尝试通过 COM 端口发送文件,但每次都失败。 首先,我在每台机器上配置一个串口,如下所示: 模式 COMx:115200,N,8 其中 x 是 COM 端口号。 在此之后我正在尝试...
我不明白为什么 RS232 接收到错误的十六进制值。 例如: 就像从 PC 0x01 发送一样,但在 STM32 上,它接收 7F。 如果从 PC 0x03 发送并在 STM32 上,则其接收 7E。 我尝试...
从 Windows 或 Linux 编译的 Arduino 草图表现不同
我有一个非常奇怪的问题,如果从 Windows XP Home sp3 或 Elementary OS Luna(Ubuntu Linux 的发行版)编译并上传到 Arduino,该草图的性能会有所不同。 这个草图,b...
我正在尝试从正在嗅探标准收据打印机的COM端口读取数据。我正在使用 MSDN 中有关文档中找到的 SerialPort.DataReceived 事件的示例。 我正在获取数据...
我正在寻找有关 EVA-DTS (DEXUCS/DDCMP) 的信息,以便获取自动售货机中的所有信息(价格、库存、销售等)我与欧洲自动售货协会联系寻求
我正在尝试将文本框中的数字转换为 2 个字节,然后可以通过串行发送。数字范围从 500 到 -500。我已经有了一个设置,所以我可以简单地发送一个字符串,然后
在linux中使用setserial配置matrox图像采集卡的串口时出现“无法设置串行信息:设备或资源忙”
我的ubuntu 18.04中安装了matrox抓帧卡,我尝试使用blow命令检查串口配置: [ 正如你所看到的,lspci 输出告诉抓取卡有 红外...
dotnet SerialPort 从 USB <->RS485 转换器读取错误数据
从 dotnet SerialPort 读取错误数据 我使用 dotnet SerialPort 类通过 USB 到 RS485 转换器从 RS485 总线读取数据。 有时返回的数据与实际总线数据不匹配。
我编写了一个从压力传感器串行读取RPi的代码。不知何故,我的代码从串行传感器读取原始数据,但我的 while 循环不起作用,我打赌是空白屏幕。 我做错了什么?整个
VS Code 串行监视器不工作,但其他串行监视器工作正常?
我有一个树莓派 pico 运行一个简单的 hello world 程序(如下)。当我在 pico 上运行该程序并查看 VS code 的内置串行监视器时,没有任何反应。然而,当我看到