0

0

php串口通信如何发送十六进制数据_php pack函数打包hex数据发送【解答】

看不見的法師

看不見的法師

发布时间:2025-12-29 21:46:03

|

540人浏览过

|

来源于php中文网

原创

PHP发送十六进制数据需用pack("H*", "a1b2c3")转二进制,再写入串口设备;Linux可用file_put_contents直写/dev/ttyUSB0(需stty配置和权限),Windows需php_serial扩展或fwrite;PHP 8已弃用该扩展,推荐用Python/Node.js处理串口。

php串口通信如何发送十六进制数据_php pack函数打包hex数据发送【解答】

PHP 本身不直接支持串口通信,必须借助外部扩展(如 php_serial)或系统命令(如 stty + echo),而发送十六进制数据的关键在于:先用 pack() 将 hex 字符串转为二进制字节流,再原样写入串口设备文件(如 /dev/ttyUSB0COM3)。

如何用 pack() 把十六进制字符串转成可发送的二进制

pack() 不接受形如 "A1B2C3" 的字符串直接转换,必须先拆分成字节对,再用 "H*""H2" 格式打包。常见错误是误用 hex2bin()(PHP ≥ 5.4.0 才有)却忽略其对非法字符的严格校验。

  • pack("H*", "a1b2c3") → 正确:把整个 hex 字符串按两位一组解析为字节
  • pack("H2", "a1", "b2", "c3") → 错误:"H2" 每次只取一个参数的前两位,多参数会截断或报错
  • hex2bin("a1b2c3") → 可用,但遇到空格、非十六进制字符(如 "A1 B2")会返回 false,需提前 str_replace(" ", "", $hex)ctype_xdigit() 校验

Linux 下绕过扩展,用 file_put_contents() 直写串口设备

前提是串口设备已配置好(波特率、停止位等由 stty 设置),且 PHP 进程有设备文件写权限(常需加到 dialout 用户组)。此时发送就是写二进制流,和普通文件无异。

file_put_contents("/dev/ttyUSB0", pack("H*", "02010400ff")); // 发送 6 字节:0x02 0x01 0x04 0x00 0xff
  • 必须确保 /dev/ttyUSB0 已被 stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb 配置好,否则数据会乱或丢
  • 写入后建议 usleep(10000) 等待硬件发出,尤其对低速设备(如 1200bps)
  • Windows 下对应路径是 COM3,但需用 fopen("COM3", "wb"),且不能用 file_put_contents() 直写(会失败)

Windows 下用 php_serial 扩展发送 hex 数据的典型流程

该扩展已多年未更新,仅兼容 PHP 5.x 和旧版 VC 编译器,PHP 7+ 基本不可用。若强行使用,核心是:打开 → 配置 → sendMessage() 传入 pack() 结果。

Word-As-Image for Semantic Typography
Word-As-Image for Semantic Typography

文字变形艺术字、文字变形象形字

下载

立即学习PHP免费学习笔记(深入)”;

$serial = new phpSerial();
$serial->deviceSet("COM3");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();
$serial->sendMessage(pack("H*", "aa5500ff")); // 发送 4 字节
$serial->deviceClose();
  • 扩展内部未做二进制安全处理,若 pack() 结果含 \x00,可能被 C 层截断(因误判为字符串结尾)
  • 更稳妥做法是用 fwrite() 替代 sendMessage():获取资源句柄后 fwrite($fp, pack("H*", "aa55"))
  • PHP 8 完全放弃该扩展,推荐改用 Python/Node.js 处理串口,PHP 只做业务逻辑

真正容易卡住的地方不是 pack() 用法,而是串口设备的硬件层配置是否生效、权限是否到位、以及发送后有没有等待足够时间让设备完成物理传输——这些在脚本里看不见,却决定数据发没发出去。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

713

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

738

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

574

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

696

2023.08.11

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号