【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博客。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/270722.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IEEE会议征稿通知】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024)

【IEEE会议】第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISCTT 2024&#xff09; 2024 9th International Conference on Information Science, Computer Technology and Transportation 第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISC…

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…

【项目】图书管理系统

目录 前言&#xff1a; 项目要求&#xff1a; 知识储备&#xff1a; 代码实现&#xff1a; Main&#xff1a; Books包&#xff1a; Book&#xff1a; BookList&#xff1a; Operate包&#xff1a; Operate: addOperate: deleteOperate: exitOperate: findOperate:…

java基础-mysql

文章目录 1&#xff1a;mysql基础面试题什么是mysql什么是事务并发事务带来的影响事物的隔离级别索引大表优化什么是池化思想&#xff0c;什么是数据库连接池&#xff0c;为什么要用数据库连接池⾏锁&#xff0c;表锁&#xff1b;乐观锁&#xff0c;悲观锁MySQL主备同步的基本原…

Intellij IDE 中复制多个服务

Intellij IDE 中复制多个服务 添加此选项 选择启动的端口和运行时的环境 之后就可以了。

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样

模拟三方的模拟平台

https://hellosean1025.github.io/yapi/ https://github.com/YMFE/yapi https://github.com/fjc0k/docker-YApi

VSCode安装与使用

1、下载地址&#xff1a;Documentation for Visual Studio Code 在 VS Code 中使用 Python - 知乎 (zhihu.com) 自动补全和智能感知检测、调试和单元测试在Python环境(包括虚拟环境和 conda 环境)之间轻松切换 在 VS Code 中安装插件非常的简单&#xff0c;只需要打开 VS Code…

SpringBoot整合【RocketMQ】

目录 1.POM文件添加依赖及yml配置 2.RocketmqUtil 3.生产者&#xff08;异步发送示例&#xff09; 4.消费者 5.测试 1.POM文件添加依赖及yml配置 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter&l…

安全增强型 Linux

书接上篇 一查看selinux状态 SELinux的状态&#xff1a; enforcing&#xff1a;强制&#xff0c;每个受限的进程都必然受限 permissive&#xff1a;允许&#xff0c;每个受限的进程违规操作不会被禁止&#xff0c;但会被记录于审计日志 disabled&#xff1a;禁用 相关命令…

内含资料下载丨黄东旭:2024 现代应用开发关键趋势——降低成本、简化架构

作为一名工程师和创业者&#xff0c;创办 PingCAP 是我进入创新世界的一次深潜。这段旅程既有令人振奋的发现&#xff0c;也充满令人生畏的不确定性。作为这次探险之旅见证的 TiDB &#xff0c;现在已在全球服务超过 3000 家企业&#xff0c;其中有已经实现了商业成功的大公司&…

【设计模式 01】单例模式

单例模式&#xff0c;是一种创建型设计模式&#xff0c;他的核心思想是保证一个类只有一个实例&#xff08;即&#xff0c;在整个应用程序中&#xff0c;只存在该类的一个实例对象&#xff0c;而不是创建多个相同类型的对象&#xff09;&#xff0c;并提供一个全局访问点来访问…

vite项目修改node_modules

问题详情 在使用某个依赖的时候遇到了bug&#xff0c;提交issue后不想一直等待到作者更新版本&#xff0c;所以寻求临时自己解决 问题解决 在node_modules里找到需要修改的依赖&#xff0c;修改想要修改的代码 修改后记得保存 然后在node_modules里找到.vite文件夹&#x…

阿里云Linux系统MySQL8忘记密码修改密码

相关版本 操作系统&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位MySQL&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (Source distribution) MySQL版本可通过下方命令查询 mysql --version一、修改my.cnf文件 文件位置&#xff1a;etc/my.cnf进入远程连接后可以打…

MQTT控制报文介绍(2)

一、CONNECT – 连接 服务端 客户端到服务端的网络连接建立后&#xff0c;客户端发送给服务端的第一个报文 必须是 CONNECT 报文。在一个网络连接上&#xff0c;客户端只能发送一次 CONNECT 报文。服务端 必须将客户端发送的第二个 CONNECT报文当作协议违规处理并断开客户端的…

项目中spring security与jwt.腾讯面试分享

写这篇文章是为了记录我面试pcg时平时没有留意或者钻研的地方。 面试是根据项目问的问题&#xff1a; 为什么采用jwt存储token&#xff1f; 我的项目是微服务项目&#xff0c;里面部署了资源服务和认证服务&#xff0c;这里选择jwt作为token一方面是可以存储用户的信息&#…

Ultimaker Cura使用(具体材料具体分析!)

参考视频&#xff1a;Cura学习视频 1 软件下载地址 Ultimaker官网- 专业便捷的3D打印品牌 2 软件设置 &#xff08;1&#xff09;中文设置&#xff1a; 偏好设置->language->简体中文->关掉界面&#xff0c;重启 &#xff08;2&#xff09;添加打印机 Custom FF…

二叉树前序遍历函数 代码图解(先序遍历 深度优先遍历)

void PreOrder(BiTree p)//只是遍历 即只是读&#xff0c;不会改变树根 {//这个p的类型是 树的结构体 不是之前的p指针if(p!NULL){printf("%c", p->c);PreOrder(p->lchild);//函数嵌套 打印左子树PreOrder(p->rchild);//函数嵌套 打印右子树} } 同理可证 中…

Mysql运维篇(七) 部署MHA--完结

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、MHA软件构成 Manager工具包主要包括以下几个工具&#xff1a; masterha_manger 启…

手撕指针第一页

1. 理解内存和地址 1.1 内存 内存&#xff0c;顾名思义就是电脑用来存储数据的&#xff0c;当CPU&#xff08;中央处理器&#xff09;在工作时&#xff0c;不仅需要从内存中拿取数据也需要将数据放入内存当中&#xff0c;当把内存引入到现实当中&#xff0c;就像学校里面的宿…