一、前言
目的:借助虛擬串口軟件(VSPD)模擬硬件串口發(fā)送數(shù)據(jù),使用PHP語言實(shí)現(xiàn)接收硬件發(fā)送的數(shù)據(jù)。
我這里的需求是連接天平,把天平的稱量數(shù)據(jù)實(shí)時的傳送到PHP使用。
使用工具:vspd+串口調(diào)試工具
使用語言:PHP
二、效果圖
三、準(zhǔn)備
1、虛擬串口軟件
使用到的工具有VSPD和串口調(diào)試工具,其中VSPD是模擬硬件串口,串口調(diào)試工具是模擬硬件發(fā)送數(shù)據(jù),兩者配合使用,工具已打包,可直接下載使用:vspd+串口調(diào)試工具
2、安裝PHP擴(kuò)展
下載并安裝dio擴(kuò)展,下載地址PECL :: Package :: dio 0.2.0 for Windows,注意要與使用的PHP版本保持一致,下載后將php_dio.dll文件拷貝到/Extensions/php/php7.0.9nts/ext/目錄下,再打開php.ini,刪除掉“extension=dio”前面的分號,如果沒有則直接添加即可,最后重啟Apache
四、VSPD和串口調(diào)試工具使用
1、VSPD
VSPD可通過上面鏈接下載,下載解壓后,直接運(yùn)行vspd.exe按提示安裝即可。
安裝成功后在右側(cè)添加端口,注意端口是成對添加或刪除的,兩個端口可以互相收發(fā)數(shù)據(jù)。端口添加成功后,打開電腦“設(shè)備管理器”中的端口,就可以看到新添加的兩個端口。
2、串口調(diào)試工具
無需安裝,直接運(yùn)行文件夾里的exe文件即可,在左側(cè)設(shè)置好參數(shù),串口號、波特率、數(shù)據(jù)位、停止位等,這些一般由設(shè)備供應(yīng)商提供。最后點(diǎn)擊“打開串口”按鈕。
3、測試串口是否可以互相收發(fā)數(shù)據(jù)
再打開一次串口調(diào)試工具,選擇串口COM4(注意必須是再VSPD里添加的串口組對之間才能互相通信,互相發(fā)送、接收數(shù)據(jù)),設(shè)置波特率等參數(shù)與COM3一致,在右側(cè)下面的發(fā)送數(shù)據(jù)區(qū)輸入數(shù)據(jù),點(diǎn)擊發(fā)送,則在COM3端口就會收到發(fā)送的數(shù)據(jù),同樣在COM3的發(fā)送數(shù)據(jù)區(qū)輸入數(shù)據(jù),則在COM4的接收數(shù)據(jù)區(qū)也可以接收到數(shù)據(jù),兩個是互相的。
如果能互相收發(fā)數(shù)據(jù),表示兩個端口是正常的。
五、PHP實(shí)時接收COM串口的數(shù)據(jù)
后端實(shí)現(xiàn)邏輯
1、使用php_dio擴(kuò)展讀取串口傳送來的數(shù)據(jù)
2、設(shè)置參數(shù):com4、baud、data、stop,參數(shù)要與上傳串口調(diào)試工具上的參數(shù)一致
3、開始連接串口,并循環(huán)讀取數(shù)據(jù),以獲得實(shí)時變化的數(shù)據(jù)
4、關(guān)閉串口
5、下面代碼較為簡單,要考慮更多會出現(xiàn)錯誤的情況,比如說com端口連接失敗的情況,讀取數(shù)據(jù)為空時的情況等
5、apiResponse()是自己寫的一個返回json格式的函數(shù)
前端實(shí)現(xiàn)邏輯
1、使用定時器,輪詢請求結(jié)接口,并把返回的數(shù)據(jù)實(shí)時的更新到input上
2、定義全局變量change用來標(biāo)識新請求回來的數(shù)據(jù)是否和上次一致,即串口傳送的數(shù)據(jù)是否發(fā)生變化
3、定義全局變量flag用來標(biāo)識數(shù)據(jù)未發(fā)生變化時,請求的次數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-783507.html
4、其實(shí)第一步已經(jīng)實(shí)時獲取到了串口發(fā)送的數(shù)據(jù),如果沒有特殊的后續(xù)操作第2和3步可以不用。因?yàn)槲疫@里的需求是接收天平的實(shí)時數(shù)據(jù),當(dāng)天平數(shù)據(jù)穩(wěn)定時(說明天平上沒有再添加重量),所以加了這兩步用來觸發(fā)其他事件,比如說如果連續(xù)5次請求數(shù)據(jù)都沒有發(fā)送變化,即flag=5時,此時就可以判定天平上的重量沒有發(fā)生變化,就可以進(jìn)行后續(xù)操作了。文章來源地址http://www.zghlxwxcb.cn/news/detail-783507.html
PHP代碼
/*
*前端顯示頁面
*/
public function index(){
return $this->fetch();
}
/**
* 讀取天平數(shù)據(jù) 前端通過ajax請求以獲取實(shí)時數(shù)據(jù)
*/
public function getCom(){
//定義com口 接收端口 COM3發(fā)送則COM4位接收,反之亦然,baud 波特率 data 數(shù)據(jù)位 stop 停止位 由供應(yīng)商提供
$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 . "失敗");
}
//讀取串口數(shù)據(jù)
//讀取長度
$len = 80;
//當(dāng)數(shù)據(jù)為空時
do{
// 讀取串口數(shù)據(jù)并將讀取到的數(shù)據(jù)賦給變量$shuju
$shuju = dio_read($ck,$len);
}
while($shuju == null);
// 獲取浮點(diǎn)值,并反轉(zhuǎn) 如果傳過來的數(shù)據(jù)為83.100,我們需要的正確的數(shù)據(jù)是1.38
// $shuju = floatval(strrev($shuju));
// 關(guān)閉串口
dio_close($ck);
//讀取發(fā)送串口的數(shù)據(jù)
return apiResponse('200','success',$shuju);
}
前端代碼
<html>
<head>
<title>實(shí)施接收COM串口數(shù)據(jù)</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>實(shí)施接收COM串口數(shù)據(jù)</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數(shù)據(jù)</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">與上一次是否發(fā)送變化</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秒執(zhí)行一次
});
// 記錄數(shù)據(jù)是否發(fā)生變化
var change = '0';
// 記錄未發(fā)生變化次數(shù)
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) {
// 未發(fā)生變化
flag++
html = '<span style="color:green">未發(fā)生變化:'+flag+'</span>'
}else{
// 發(fā)生了變化
flag = 0 //數(shù)據(jù)發(fā)生變化后重置變化次數(shù)
change = res.data
html = '<span style="color:red">發(fā)生了變化</span>'
}
$('#result').append(html)
}else{
layer.msg(res.data)
}
}
})
}
})
</script>
</html>
到了這里,關(guān)于【PHP】PHP實(shí)現(xiàn)與硬件串口交互,接收硬件發(fā)送的實(shí)時數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!