2016-11-18 9 views
0

私はAJAXに少し新しくシリアルポートを使用しています。常に実行中のwhileループのPythonスクリプトからAJAX経由でHTMLにRS232データを送信しますか?

RS232ポートを介してWebサーバーにデータを送信する測定装置があります。 私のウェブサイトは常に最新のデータを表示しなければなりません。

これを達成するために、私はPyserial APIを備えたPythonスクリプトを使用しています。 測定装置は "I"コマンドで初期化し、 "M"コマンドで測定データを要求する必要があります。

私はAJAXを使用して、このpythonスクリプトをexecコマンドを実行する仲介業者のPHPファイルを250ミリ秒ごとに常時オープンしています。そしてそれは仕事を終わらせます。しかし、私は、接続を何度も何度でもやり直し、python-ajaxコミュニケーションの中間者としてphpを使用することは、非常にばかげたやり方です。

私の質問は、AJAXや他の手段でWebページに常時実行されているwhileループのpythonファイルからデータを送信できるかどうかです。

私のPythonスクリプト:rs232.py

import json 
import random 
import time 
import serial 

port = "COM3" 
baudrate = 9600 
ser = serial.Serial(port, baudrate,bytesize=serial.SEVENBITS,parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, timeout=1, xonxoff=True) 

if ser.isOpen(): 
    start=1;  
cmd="I" 
ser.write((cmd +'\r\n').encode()) 
out = '' 
time.sleep(0.08) 
while ser.inWaiting() > 0: 
    out += (ser.read(1)).decode() 

cmd="M" 
ser.write((cmd +'\r\n').encode()) 
out = '' 
time.sleep(0.08) 
while ser.inWaiting() > 0: 
    out += (ser.read(1)).decode() 

if out != '': 
    my_string=out 

ser.close() 

new=[x.strip() for x in my_string.split(',')] 
x1=float(new[-1]) 


D = {'x1':x1, 'start': start} 

print (json.dumps(D)) 

マイPHP真ん中の男:rs232.php

<?php 
$python="C:\........\python.exe"; 
$result=json_decode(exec($python.' rs232.py'), true); 
$x1=$result['x1']; 
$y=array("x1" => $x1); 
echo json_encode($y); 
?> 

そして、私のjavascriptのコード:page.php

$(function() { 
    var repeat= function(){ 
     $.ajax({ 
      type: "GET", 
      url: "config/rs232.php", 
      success: function(data) { 
       var rs232data=JSON.parse(data); 
       document.getElementById("militron").innerHTML=rs232data.x1; 
       } 
     }); 
    } 

    setInterval(function(){repeat()}, 250); 
}); 
+0

あなたはflask' 'のようなライブラリを使用してPythonのサーバーをホストすることができます。次に、1つのPythonスクリプトに2つのスレッドがあり、最初は 'pyserial'と通信し、2つ目はサーバーを実行します。もう一つの選択肢は、pythonスクリプトを常にファイルに書き込ませ、PHPでこのファイルを読むことです。あなたのウェブページは静的ですか? HTTPリクエストを使用している場合は、サーバーに 'GET'リクエストを送信し続ける必要があります。 – martianwars

+0

PythonをインストールしたRaspberry Pi 3で動作しているサーバー。このウェブサイトは動的で、PHPを使用してさまざまな入力フォームを呼び出し、数学計算やPOSTデータをSQLデータベースに呼び出します。 私はフラスコに慣れていませんが、時々それについて聞くことを除いて、私は本当に今のところそれを避けたいと思います。ラズベリーに余分な負担をかけないこともプラスです。 私はあなたの2番目の提案が好きです。あなたは私に例をリンクしてもいいし、多分単純なものにしておくためにwhileループで乱数を生成するPythonスクリプトで作ることもできます。 – minibraun

+0

答えを書いた、これはあなたが望んだのでしょうか? – martianwars

答えて

0

私のコメントの2番目の提案に続いて、ここであなたのサーバーでできることがあります。少し遅れてもテキストファイルに書き込むことができます。あなたのPHPスクリプトで今すぐ

import time 

number = 0 
while(True): 
    # Keeping some delay here, replace this with pyserial code 
    time.sleep(1) 
    number = number + 1 
    f = open("serial_data.txt", 'w') 
    f.write(str(number)) 
    f.close() 

<?php 
    $data = file_get_contents('serial_data.txt'); 
    echo $data; 
?> 
+0

さらに複雑なデータの場合は、JSONオブジェクトを作成してください – martianwars

+1

ありがとうございました!これはまさに私が望んでいたものです。 魅力のように働く:D – minibraun

+0

それは素晴らしいです!お力になれて、嬉しいです。あなたがより多くの問題にぶつかったら私に教えてください – martianwars

関連する問題