【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据

一、前言

目的:借助虚拟串口软件(VSPD)模拟硬件串口发送数据,使用PHP语言实现接收硬件发送的数据。

我这里的需求是连接天平,把天平的称量数据实时的传送到PHP使用。

使用工具:vspd+串口调试工具

使用语言:PHP

二、效果图

三、准备

1、虚拟串口软件

使用到的工具有VSPD和串口调试工具,其中VSPD是模拟硬件串口,串口调试工具是模拟硬件发送数据,两者配合使用,工具已打包,可直接下载使用:vspd+串口调试工具

2、安装PHP扩展

下载并安装dio扩展,下载地址PECL :: Package :: dio 0.2.0 for Windows,注意要与使用的PHP版本保持一致,下载后将php_dio.dll文件拷贝到/Extensions/php/php7.0.9nts/ext/目录下,再打开php.ini,删除掉“extension=dio”前面的分号,如果没有则直接添加即可,最后重启Apache

四、VSPD和串口调试工具使用

1、VSPD

VSPD可通过上面链接下载,下载解压后,直接运行vspd.exe按提示安装即可。

安装成功后在右侧添加端口,注意端口是成对添加或删除的,两个端口可以互相收发数据。端口添加成功后,打开电脑“设备管理器”中的端口,就可以看到新添加的两个端口。

2、串口调试工具

无需安装,直接运行文件夹里的exe文件即可,在左侧设置好参数,串口号、波特率、数据位、停止位等,这些一般由设备供应商提供。最后点击“打开串口”按钮。

3、测试串口是否可以互相收发数据

再打开一次串口调试工具,选择串口COM4(注意必须是再VSPD里添加的串口组对之间才能互相通信,互相发送、接收数据),设置波特率等参数与COM3一致,在右侧下面的发送数据区输入数据,点击发送,则在COM3端口就会收到发送的数据,同样在COM3的发送数据区输入数据,则在COM4的接收数据区也可以接收到数据,两个是互相的。

如果能互相收发数据,表示两个端口是正常的。

五、PHP实时接收COM串口的数据

后端实现逻辑

1、使用php_dio扩展读取串口传送来的数据

2、设置参数:com4、baud、data、stop,参数要与上传串口调试工具上的参数一致

3、开始连接串口,并循环读取数据,以获得实时变化的数据

4、关闭串口

5、下面代码较为简单,要考虑更多会出现错误的情况,比如说com端口连接失败的情况,读取数据为空时的情况等

5、apiResponse()是自己写的一个返回json格式的函数

前端实现逻辑

1、使用定时器,轮询请求结接口,并把返回的数据实时的更新到input上

2、定义全局变量change用来标识新请求回来的数据是否和上次一致,即串口传送的数据是否发生变化

3、定义全局变量flag用来标识数据未发生变化时,请求的次数

4、其实第一步已经实时获取到了串口发送的数据,如果没有特殊的后续操作第2和3步可以不用。因为我这里的需求是接收天平的实时数据,当天平数据稳定时(说明天平上没有再添加重量),所以加了这两步用来触发其他事件,比如说如果连续5次请求数据都没有发送变化,即flag=5时,此时就可以判定天平上的重量没有发生变化,就可以进行后续操作了。

PHP代码

/*
 *前端显示页面 
 */
public function index(){
	return $this->fetch();
}

/**
 * 读取天平数据  前端通过ajax请求以获取实时数据
 */
public function getCom(){
	
	//定义com口 接收端口 COM3发送则COM4位接收,反之亦然,baud 波特率 data 数据位 stop 停止位  由供应商提供
	$com='COM4'; $baud = '9600'; $data='8';  $stop = '1';

	set_time_limit(0);

	exec('mode '.$com.': baud='.$baud.' data='.$data.' stop='.$stop.' parity=n xon=on',$output);
	//打开串口  O_RDWR读写模式 O_RDONLY只读
	$ck = dio_open($com . ':', O_RDWR);

	//如果打开串口失败,停止脚本,并输出“打开串口COM3失败”
	if(!$ck){
			
		return apiResponse('110',"打开串口" . $com . "失败");
	}

	//读取串口数据
	//读取长度
	$len = 80;
	//当数据为空时
	do{
		// 读取串口数据并将读取到的数据赋给变量$shuju
		$shuju = dio_read($ck,$len);
	}
	while($shuju == null);

	// 获取浮点值,并反转  如果传过来的数据为83.100,我们需要的正确的数据是1.38
	// $shuju = floatval(strrev($shuju));

	// 关闭串口
	dio_close($ck);
	//读取发送串口的数据
	return apiResponse('200','success',$shuju);

}

前端代码

<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>
	 
	<form class="layui-form layui-form-pane" action="" style="width:60%; margin: 0 auto;">
	  
	  	<div class="layui-form-item" >
		    <div class="layui-block" >
		      	<label class="layui-form-label">COM数据</label>
		      	<div class="layui-input-block" >
		        	<input type="text" name="data"  autocomplete="off" class="layui-input" value="">
		      	</div>
		    </div>
	  	</div>

		<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> 

	</form>

</body>

<script>


layui.use(['form','element'], function(){
  var form = layui.form
  ,$ = layui.jquery
  ,element = layui.element;

 // setTimeout(getCom, 1000);
  $(document).ready(function(){
		c = setInterval(getCom,1500);   //每1.5秒执行一次
  });

  // 记录数据是否发生变化
  var change = '0';
  // 记录未发生变化次数
  var flag = 0;

  function getCom() {

	  $.ajax({
	  	url:'getCom',
	  	type:'GET',
	  	dataType:'JSON',
	  	success:function (res) {
	  		console.log(res)
	  		if (res.code == '200') {

	  			$('#result').empty();
	  			var html = ''

	  			$("input[name='data']").val(res.data)

	  			if (change == res.data) {
	  				// 未发生变化
	  				flag++
	  				html = '<span style="color:green">未发生变化:'+flag+'</span>'
	  			}else{
	  				// 发生了变化
	  				flag = 0  //数据发生变化后重置变化次数
		  			change = res.data
	  				html = '<span style="color:red">发生了变化</span>'
	  			}
	  			$('#result').append(html)
	  		}else{
	  			layer.msg(res.data)
	  		}
	  	}
	  })
  }
})

</script>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为网络设备 通过路由器子接口 Dot1q终结子接口实现跨VLAN通信

(二层交换机直接跳过三层交换价接入路由器时才使用该配置。推荐使用三层交换机建立VLANIF配置更简洁明了。如果VLAN较少可直接配置&#xff1b;路由器接口&#xff0c;一个物理接口一个VLAN) S1配置 vlan batch 2 to 3interface GigabitEthernet0/0/1port link-type trunkpor…

ChatGPT为教育发展带来便利与机遇,但也有伦理风险

2022年11月&#xff0c;美国人工智能研究实验室Open AI推出全新聊天机器人模型ChatGPT。凭借出色的生成语言文本能力&#xff0c;ChatGPT在上线后短短5天内便获得100百万用户&#xff0c;2个月的时间&#xff0c;月用户突破1亿&#xff0c;成为史上增长最快的“现象级”应用。作…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念&#xff1a;具有语义的人脸区域&#xff0c;如嘴、鼻子、眼睛。 二、研究目标 1.验证假设&#xff0c;并…

MySQL 按日期流水号 条码 分布式流水号

有这样一个场景&#xff0c;有多台终端&#xff0c;要获取唯一的流水号&#xff0c;流水号格式是 日期0001形式&#xff0c;使用MySQL的存储过程全局锁实现这个需求。 以下是代码示例。 注&#xff1a;所有的终端连接到MySQL服务器获取流水号&#xff0c;如果获取到的是 “-1”…

【Python】编程练习的解密与实战(三)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1fa90;1. 初识Python &a…

.NET 反射的介绍和简单应用

什么是反射&#xff1f; 反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型&#xff0c;这些信息在设计时是未知的&#xff0c;这种能力类似于后期绑定。反射还支持的更高级的行为&#xff0c;能在运行时动态创建新类型&#xff0…

kylin4.0.3升级问题

话接前文&#xff1a; kylin升级(3.0.1-&#xff1e;kylin-4.0.3)-CSDN博客文章浏览阅读941次&#xff0c;点赞29次&#xff0c;收藏12次。原本的cube太多了&#xff0c;换其他OLAP数据库太麻烦。相比之下&#xff0c;升级是一个很好的选择&#xff08;官网有说明内存降低和构…

2024.1.12每日一题

LeetCode 2085.统计出现过一次的公共字符串 2085. 统计出现过一次的公共字符串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个字符串数组 words1 和 words2 &#xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1&#xff1a; 输…

《手把手教你》系列练习篇之3-python+ selenium自动化测试(详细教程)

1. 简介 前面介绍了&#xff0c;XPath, id , class , link text, partial link text, tag name, name 七大元素定位方法&#xff0c;本文介绍webdriver支持的最后一个方法&#xff1a;by_css。css和XPath类似&#xff0c;也需要掌握一些语法&#xff0c;才能写出正确的&#x…

微信小程序开发学习笔记《8》tabBar

微信小程序开发学习笔记《8》tabBar 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。tabBar官方文档 tabBar这一节还是相当重要的。 一、什么是tabBar tabBar是移动端应用常见的页面效果&#xff0c;用于实现多页面的快速切换。小…

halcon 标定板像素当量的标定

背景&#xff1a;当镜头不是远心镜头时&#xff0c;FA镜头没法知道一个像素的尺寸。 1、标定板信息 标定板7*7&#xff0c;圆的直径是1.25mm&#xff0c;两个圆的距离是2.5mm&#xff0c;求出每排两两圆心距的像素距离&#xff0c;然后平均值。两点的真实距离为D&#xff0c;…

图像识别与计算机视觉有什么区别?

图像识别和计算机视觉在很多方面存在差异&#xff0c;这些差异主要体现在以下几个方面&#xff1a; 1. 研究范围 图像识别是计算机视觉领域的一个子集。计算机视觉不仅包括图像识别&#xff0c;还涵盖了更广泛的内容&#xff0c;如场景理解、目标跟踪、分割、识别和解释等。简而…

Golang的API项目快速开始

开启一个简单的API服务。 golang的教程网上一大堆&#xff0c;官网也有非常详细的教程&#xff0c;这里不在赘述这些基础语法教程&#xff0c;我们意在快速进入项目开发阶段。 golang好用语法教程传送门&#xff1a; m.runoob.com/go/ 编写第一个API 前提&#xff1a;按照上一…

Python列表(list)

目录 列表列表的创建与删除访问列表元素index() 方法 列表的遍历添加&#xff0c;修改和删除列表元素添加修改删除 对列表统计和计算count() 方法如需确定列表中有**多少元素**&#xff0c;请使用 len() 方法&#xff1a;检查项目是否存在**复制列表****合并两个列表****list()…

李沐之经典卷积神经网络

目录 1. LeNet 2. 代码实现 1. LeNet 输入是32*32图片&#xff0c;放到一个5*5的卷积层里面&#xff0c;卷积层的输出通道数是6&#xff0c;高宽都是28&#xff08;32-5128&#xff09;。再经过2*2的池化层&#xff0c;把28*28变成14*14&#xff08;28-22&#xff09;/214&am…

数据在内存中的存储(C语言)

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; ​ 所属专栏&#xff1a;C语言学习 ​ 贝蒂的主页&#xff1a;Betty‘s blog 引言 ​ 我们早就学完基本的数据类型&#xff0c;那这些数据类型…

window中安装Apache http server(httpd-2.4.58-win64-VS17)

windows中安装Apache http server(httpd-2.4.58-win64-VS17) 1、下载windows版本的的httpd, https://httpd.apache.org/docs/current/platform/windows.html#down 这里选择的是Apache Lounge编译的版本 https://www.apachelounge.com/download/ 2、解压到指定目录&#xff0c;这…

【5】商密测评密码辅助工具

0X01 前言 最近在学了下商密测评&#xff0c;研究了下技术层面的测评&#xff0c;感觉找工具不方便&#xff0c;就顺手自己造了个辅助工具&#xff0c;都是自己遇到需要用的。 0x02 工具功能介绍 不爱打字&#xff0c;直接上图。后续根据技术测评层面需要继续完善和增加功能。…

Hive基础知识(九):Hive对数据库表的增删改查操作

1. 创建表 1&#xff09;建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name #EXTERNAL&#xff1a;外部的 [(col_name data_type [COMMENT col_comment],...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment],...)]#PARTITIO…

Session与Cookie

目录 一、Session会话技术 概念 常用方法 生命周期 有效期 场景 二、Cookie技术 一、Session会话技术 概念 浏览器和服务器之间为了实现某个功能&#xff0c;产生了多次请求和响应&#xff0c;从第一次请求开始到最后一次请求结束&#xff0c;这期间所有的请求和响应加…