クライアントにて処理した内容をサーバへ送り(submit)、サーバー上(arduino)でデータを処理するシステムを作成しています。しかし、データが正常にサーバー上へ授受されません。解決策をご教授いただけると幸いです。
なお、webブラウザ上のコンソール画面では下記エラーが発生し、arduinoのシリアルモニタでは5が出力されていない状況です。
〇ブラウザ上コンソール画面
http://192.168.100.222/?name=M10R*:1 GET http://192.168.100.222/?name=M10R* net::ERR_CONNECTION_REFUSED
〇index.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="GENERATOR" content="HomuPage Writer Ver1.20"> <title>西城駅 連動画面</title> <script> function sendmoji(pos){//submitする関数(ここが一番重要かと・・・) pos=encodeURIComponent(pos); console.log(pos); document.FormName.name.value=pos; console.log(document.FormName.name.value); document.FormName.submit(); } function sen(x,y,z,fu,colerflug){ //canvas内に線を描く関数 文字数制限で省略 } function naname_sen(x,y,z,f,fu,colerflug){ //canvas内に斜め線を描く関数 文字数制限で省略 } function sikaku(x,y,z,f){ //canvas内に資格を描く関数 文字数制限で省略 } function moji(text,x,y,size,maxWidth){ //canvas内に文字を描く関数 文字数制限で省略 } function arrive_point(x,y,z,f){ //canvas内に着点(〇)を描く関数 文字数制限で省略 } function signal_kigo(x,y,z,f,colerflug){ //canvas内に信号機を描く関数 文字数制限で省略 function rendo_gamen(sinro){ //連動画面を描画する関数 文字数制限で省略 } function canvas_clear(){ //canvasの描画をリセットする関数 文字数制限で省略 } function dosa_10M(pix){ if(pix.clientX>=400){ if(pix.clientX<=450){ if(pix.clientY>=400){ if(pix.clientY<=450){ if(sinro_setting[0]==1){ confirm( "進路鎖錠中"); return 0; } if(sinro_setting[1]==1){ confirm( "進路鎖錠中"); return 0; } if(M10=='N')var M_name='定位→反位'; if(M10=='R')var M_name='反位→定位'; var result = confirm( "10号を転換します。" + M_name); if(result){ confirm( "転換完了。" ); if(M10=='N'){ var M10flug='R'; sendmoji("M10R*"); } if(M10=='R'){ var M10flug='N'; sendmoji("M10N*"); } M10=M10flug; canvas_clear();//canvasを消去 rendo_gamen(sinro_setting);//再描画 }else{ confirm( "転換はキャンセルされました。" ); } } } } } } function dosa_11M(pix){ if(pix.clientX>=1050){ if(pix.clientX<=1100){ if(pix.clientY>=400){ if(pix.clientY<=450){ if(sinro_setting[2]==1){ confirm( "進路鎖錠中"); return 0; } if(sinro_setting[3]==1){ confirm( "進路鎖錠中"); return 0; } if(M11=='N')var M_name='定位→反位'; if(M11=='R')var M_name='反位→定位'; var result = confirm( "11号を転換します。" + M_name); if(result){ confirm( "転換完了。" ); if(M11=='N')var M11flug='R'; if(M11=='R')var M11flug='N'; M11=M11flug; canvas_clear();//canvasを消去 rendo_gamen(sinro_setting);//再描画 }else{ confirm( "転換はキャンセルされました。" ); } } } } } } var signal_flug=0; function dosa_1RA(pix){ if(pix.clientX>=375){ if(pix.clientX<=425){ if(pix.clientY>=360){ if(pix.clientY<=410){ signal_flug=2; console.log("1R"); console.log(signal_flug); if(sinro_setting[0]==1){ var result = confirm( "1RAを復位します。" ); if(result){ confirm( "復位完了。" ); sinro_setting[0]=0; canvas_clear();//canvasを消去 rendo_gamen(sinro_setting);//再描画 }else{ confirm( "進路復位はキャンセルされました。" ); } } } } } } if(pix.clientX>=800){ if(pix.clientX<=850){ if(pix.clientY>=403){ if(pix.clientY<=453){ signal_flug*=3; console.log("A"); console.log(signal_flug); if(signal_flug==6){ var result = confirm( "1RAを反位設定します。" ); if(result){ confirm( "設定完了。" ); sinro_setting[0]=1; if(M10=='R')var M10flug='N'; if(M10=='N')var M10flug='N'; M10=M10flug; canvas_clear();//canvasを消去 rendo_gamen(sinro_setting);//再描画 }else{ confirm( "進路設定はキャンセルされました。" ); } }else{ signal_flug=0; } } } } } } </script> <style type="text/css"> body{background-color:rgb(0,0,0)} </style> </head> <body> <h2></h2> <canvas id="terminal"width="1900" height="900"></canvas> <br/> <FORM NAME="FormName" ACTION=""> <input type="text" name="name" size="40"> <input type="submit" value="送信"> </form> <script> var M10='N'; var M11='N'; var sinro_setting=[0,0,0,0]; var TR=[0,0,0,0,0,0,0,0]; rendo_gamen(sinro_setting); document.addEventListener('click', dosa); function dosa(pix){ dosa_10M(pix); dosa_11M(pix); dosa_1RA(pix); } TR=[0,0,0,0,0,0,0,0]; rendo_gamen(sinro_setting); </script></body></html>
〇arduino
#include <SPI.h> #include <Ethernet2.h> #include <SD.h> char *FILENAME="index.htm"; byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xBF, 0x98 }; IPAddress ip(192, 168, 100, 222); EthernetServer server(80); int T10=0; int flug=0; int flugdelay=0; char buff[]="0000"; int counter=0; int Mnam=0; void setup() { Serial.begin(9600); while (!Serial) { ; } Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); if (!SD.begin(4)) { Serial.println("ErrorSD!!"); return; } if (!SD.exists(FILENAME)) { Serial.println("ErrorFILE!!"); return; } Serial.println("Ready"); pinMode(31,OUTPUT);//10Mの出力1 pinMode(33,OUTPUT);//10Mの出力2 pinMode(24,OUTPUT); pinMode(22,INPUT);//軌道回路の入力 } void Mhani(int Mname){ //転てつ機を反位転換するプログラム文字数制限で省略 } void Mteii(int Mname){ //転てつ機を定位転換するプログラム文字数制限で省略 } void readHTML( EthernetClient& client){ client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); File file; file = SD.open(FILENAME,FILE_READ); if(file){ while(file.available()){ char buff=file.read(); Serial.print(buff); client.write(buff); } if(T10==0)client.println("<script>TR=[0,0,0,0,0,0,0,0];"); if(T10==1)client.println("<script>TR=[0,0,1,0,0,0,0,0];"); client.println("rendo_gamen(sinro_setting);"); client.println("</script></body></html>"); flugdelay=1; }else{ Serial.println("ErrorFILEREAD!!"); } file.close(); } void loop() { if(digitalRead(22)==HIGH){ digitalWrite(24,HIGH); flug=1; T10=1; }else{ digitalWrite(24,LOW); T10=0; flug=0; } EthernetClient client = server.available(); if (client) { Serial.println("new client"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n' && currentLineIsBlank) readHTML(client); if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } int chackflug=0; while(1){//クライアントの画面が構成された後に動作(無限ループ) if(flugdelay==0)break; chackflug++; if(chackflug<=10)Serial.println("delaynow..."); int flug1=flug; if(digitalRead(22)==HIGH){ digitalWrite(24,HIGH); flug=1; T10=1; }else{ digitalWrite(24,LOW); flug=0; T10=0; } if(flug1!=flug){ if(T10==0)client.println("<script>TR=[0,0,0,0,0,0,0,0];"); if(T10==1)client.println("<script>TR=[0,0,1,0,0,0,0,0];"); client.println("rendo_gamen(sinro_setting);"); client.println("</script></body></html>"); } while(client.available()>0){//クライアントからデータを受け取ったときに動作(ここが一番重要かと・・・) Serial.println("5"); char data=client.read(); buff[counter]=data; Serial.print(buff[counter]); if(data=='*'){ readHTML(client); counter=0; Mnam=buff[0]-'0'; Mnam*=10; Mnam+=buff[1]-'0'; if(buff[2]=='R')Mhani(Mnam); if(buff[2]=='N')Mteii(Mnam); Serial.println(""); break; }else{ counter++; } } delay(10); } } } delay(1); client.stop(); Serial.println("client disconnected"); } }
〇arduino内シリアルモニタ
Serial.write(c); if (c == '\n' && currentLineIsBlank) readHTML(client); の内容はindex.htmの模写のため省略 delaynow...(×10回)
5は出力されません。
以上よろしくお願いいたします。
〇原因追求
①JavaScript内のfunction sendmoji(pos)関数内のconsole.log(document.FormName.name.value)の出力は「M10R*」であり、ここまで処理は正常です。
②JavaScript内のfunction sendmoji(pos)関数内のdocument.FormName.submit()の処理によりhttp://192.168.100.222/?name=M10R*のURLが生成されていますが、この処理によりarduinoへデータが送られているかどうかは不明です。(確認方法がわかりません。)
③arduino内のwhile(client.available()>0)内以外は正常に動いています。(シリアルモニタで出力させ確認済)
④arduino内のwhile(client.available()>0)にて5が出力されていないところを見ると、while(client.available()>0)ではじかれています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/06 01:13
2017/08/06 04:44
2017/08/06 05:13 編集
2017/08/06 05:16