【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据

2024-03-07 10:20

本文主要是介绍【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

之前写过两篇PHP实现与硬件串口交互的文章,一篇是【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据(上)_php串口通信-CSDN博客,另一篇是【PHP】PHP实现与硬件串口交互,向硬件设备发送指令数据(下)-CSDN博客。上篇是介绍怎样通过RS232接口接收硬件发送的数据,下篇是介绍通过USB转RS232线怎样向硬件设备发送数据。

本篇把两个功能综合一起介绍,成为一个完整的功能,适用于RS232串口和USB串口。

二、开发前说明

需求:PHP通过串口与天平通信,PHP能够向天平发送指令,并接收天平返回的响应信息。

硬件设备:天平。

传输线:USB转RS232接口,USB插到电脑上,RS232接到天平单片机上。

指令集:由天平供应商提供。

开发语言:PHP。

业务逻辑是:PHP先向硬件设备发送指令,硬件设备接收到指令后,返回响应结果,PHP再去接收返回的响应结果,进行后续业务处理。

三、效果图

四、代码

后端代码说明:

1、接收前端穿过来的指令,根据天平供应商给的文档拼接要发送的数据格式,这里是以“\r\n”为结束符,同时返回的数据也带有"\r\n",所以需要对接收的数据进行处理后才能使用;

2、定义串口、波特率、数据位、停止位等参数,这样按照硬件开发文档填写;

3、打开串口,并向串口发送指令;

4、发送成功后,等待0.5s,再去接收设备返回的数据,因为软件发送数据给硬件,硬件再接收处理,返回响应数据,中间需要点时间,如果不设置等待时间而是直接读取,是没有数据的,因为硬件还没来得及返回;

5、关闭串口连接;

6、其中“TLog()”方法是我用来记录整个执行流程调试使用的,就是往txt写下执行内容。

PHP代码

/*** 发送数据 页面*/
public function put()
{$list = array(array("num" => "1", "gongneng" => "测试", "commond" => "AT"),array("num" => "3", "gongneng" => "清零", "commond" => "AT+ZERO"),array("num" => "4", "gongneng" => "获取重量", "commond" => "AT+WEI"),array("num" => "5", "gongneng" => "设置获取重量方式", "commond" => "AT+AUTO=X"),array("num" => "6", "gongneng" => "查看当前重量获取方式", "commond" => "AT+AUTO?"),array("num" => "7", "gongneng" => "设置开机清零方式", "commond" => "AT+OPENC=X"),array("num" => "8", "gongneng" => "查看当前开机清零方式", "commond" => "AT+OPENC?"),array("num" => "9", "gongneng" => "校准及校准参数", "commond" => "AT+CAL=X"),array("num" => "10", "gongneng" => "发送校准砝码指令", "commond" => "AT+CALW"),array("num" => "11", "gongneng" => "校准参数查询", "commond" => "AT+CAL?"),array("num" => "12", "gongneng" => "切换重量输出格式", "commond" => "AT+PRINTX=X"),array("num" => "13", "gongneng" => "查看当前输出格式", "commond" => "AT+PRINTX?"));$this->assign(['list'=>$list]);return $this->fetch();
}/*** 发送指令* com9接收端*/
public function putCom(){if (request()->isPost()) {set_time_limit(0);// 接收指令 原指令$commond = trim(input('post.commond'));// $commond = "AT";	if (!empty($commond)) {// 要发送的指令$commond_send = $commond."\r\n";TLog(">>>> start <<<<");TLog('输入指令:'.$commond);	//定义com接收端口  baud 波特率 data 数据位 stop 停止位  由供应商提供$com='COM9'; $baud = '9600'; $data='8';  $stop = '1'; $output = array();exec('mode '.$com.': baud='.$baud.' data='.$data.' stop='.$stop.' parity=n xon=on',$output);//打开串口  O_RDWR读写模式 O_RDONLY只读$ck = @fopen($com, 'w+');TLog("准备打开串口" . $com);//如果打开串口失败,停止脚本,并输出“打开串口COM3失败”if(!$ck){TLog("打开串口" . $com . "失败");return apiResponse('110',"打开串口" . $com . "失败");}TLog("打开串口" . $com . "成功");TLog("准备向串口".$com."发送指令:【" . $commond."】");//向串口发送数据;$rs = fwrite($ck, $commond_send);if ($rs) {TLog("向串口".$com."发送指令发送成功:【" . $commond."】");// 等待0.5秒usleep(500000);// 接收设备的响应  $response = fread($ck, 128);TLog("准备读取串口".$com."的响应结果");if ($response) {// 过滤掉返回结果中的\r\n$response =  str_replace(array("\r", "\n"), '', $response);TLog("读取串口".$com."的响应结果成功:【".$response."】");}else{TLog("读取串口".$com."的响应结果失败");}}else{TLog("向串口".$com."发送指令发送失败:【" . $commond."】");return apiResponse('110',"向串口".$com."发送指令发送失败:【" . $commond."】");}TLog(">>>> end <<<<");TLog("\r\n");//关闭端口    fclose($ck);return apiResponse('200','success',$response);}else{return apiResponse('110','指令不能为空');}}else{return apiResponse('110','非法请求');}}

前端代码

<html>
<head><title>实时发送并接收COM串口数据</title><script type="text/javascript" src="/static/index/js/jquery-1.11.3.min.js" ></script><script type="text/javascript" src="/static/index/layui/layui.js"></script><link rel="stylesheet" type="text/css" href="/static/index/layui/css/layui.css">
</head>
<body><fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;"><legend>实时发送并接收COM串口数据</legend></fieldset><div class="layui-row" style="width:60%; margin: 0 auto;"><form class="layui-form layui-form-pane" action=""><div class="layui-form-item" ><div class="layui-inline" ><label class="layui-form-label">发送指令</label><div class="layui-input-inline" style="width: 500px;"><input type="text" name="commond"  autocomplete="off" class="layui-input" value="AT"></div></div><div class="layui-inline"><button type="submit" class="layui-btn layui-btn-normal" lay-submit="" lay-filter="demo1">提交指令</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div></div></form></div><div class="layui-row layui-col-space10" style="width:60%; margin: 0 auto;"><div class="layui-col-md4"><div class="layui-form-item"  style=" padding: 10px; background-color: #F2F2F2; " ><div class='layui-card'><div class='layui-card-header' style="font-size: 18px">响应结果</div><div class='layui-card-body' id="result" style="font-size: 16px"></div></div></div> </div><div class="layui-col-md8"><table class="layui-table"><colgroup><col width="20%"><col width="40%"><col width="40%"></colgroup><thead><tr><th>序号</th><th>功能</th><th>指令</th></tr> </thead><tbody>{volist name="list" id="vo"}<tr><td>{$vo.num}</td><td>{$vo.gongneng}</td><td>{$vo.commond}</td></tr>{/volist}</tbody></table></div></div>
</body><script>layui.use(['form','element'], function(){var form = layui.form,$ = layui.jquery,element = layui.element;// 提交form.on('submit(demo1)', function(data){var commond = $("input[name='commond']").val()$.ajax({url:'putCom',type:'POST',dataType:'JSON',data:{commond:commond},success:function (res) {console.log(res)if (res.code == '200') {layer.msg(res.message)$('#result').empty();var html = ''html = '<div>输入指令:'+commond+'</div><div style="color:green">返回内容:'+res.data+'</div>'$('#result').append(html)}else{layer.msg(res.message)}}})return false});
})</script>
</html>

  两篇PHP实现与硬件串口交互的文章,【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据(上)_php串口通信-CSDN博客,【PHP】PHP实现与硬件串口交互,向硬件设备发送指令数据(下)-CSDN博客。

这篇关于【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/783196

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指