「オープンソースハードウェアセミナーVol1」レポート Arduino Ether ShieldサンプルWEBサーバー 早速改良だ! [ATmarquino Arduino]
chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
とまあ、ことさらタイトルが長くなっているのは、割と早めにレポートを書いているつもりだったのに、依然としてイベント参加レポートにリストされていないのは、
http://www.chip1stop.com/knowledge/Arduino/
タイトルが悪かったからなんだろうか、それともネガティブなイメージを感じてしまうからか、、、。
投稿後はこちらから連絡が必要でした。
まあそれはそれとして、masatoさん情報を元に改良してみました。
直接send関数を呼び出すことは叶わなかったので、Client.cppに小細工を入れました。(やはりC++の勉強が必要だな)
まずClient.cppには以下のメソッドを追加
Client.hには以下のプロトタイプ宣言を追加
それで実際に改造したスケッチが以下です。
もろにC言語ですね。まあ私は組み込みの人間なので全然気にならないのですが。
パケットモニタ(PacMon)のキャプチャ画面を見れば判る様に、前回は1画面で収まらず、えらいスクロールしないとFINまで到達できませんでしたが、今回は1画面で全てのやり取りが完了しています。
まあ静的なページの表示ではなくCGIなのでforループの分だけパケットが増えていますが、これ位は許容範囲でしょう。
すっきりしましたね。
※追記
考えてみれば関数のオーバーライドができるんだから、
Client.hには以下のプロトタイプ宣言を追加
の方がよっぽどC++らしいですね。
前から気になっていたのですが、よくArduinoの事を簡単、簡単と説明されるのですが、一体何に対して”簡単”なのでしょう。統合環境上の開発ならArduino環境よりも便利な物が沢山あるのですが、例えばルネサスのHEWにしても、フリースケールのCodeWarriorにしてもIARのEWにしても、最近の統合環境では一々CRTやベクターテーブルから書かなくても良くなっています(勿論好みでそうしても良い)。 それらと比較してそれでも簡単と言う話でしょうか。しかしArduinoにはデバッカーが無いのでこれら統合開発環境と比較した場合、むしろ、、、しーーーーー。
投稿後はこちらから連絡が必要でした。
まあそれはそれとして、masatoさん情報を元に改良してみました。
直接send関数を呼び出すことは叶わなかったので、Client.cppに小細工を入れました。(やはりC++の勉強が必要だな)
まずClient.cppには以下のメソッドを追加
void Client::bwrite( const uint8_t *buf, int size ) { send(_sock, buf, size ); }
Client.hには以下のプロトタイプ宣言を追加
void bwrite( const uint8_t *buf, int size );
それで実際に改造したスケッチが以下です。
/* * Web Server * * A simple web server that shows the value of the analog input pins. */ #include <Ethernet.h> #include <string.h> #include <stdlib.h> #include <stdio.h> char *buf; const byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; const byte ip[] = { 192, 168, 1, 177 }; const char http_head[] = "HTTP/1.1 200 OK\r\n" \ "Content-Type: text/html\r\n\r\n" \ "<h3>designed by hamayan</h3>\r\n"; Server server(80); void setup() { Ethernet.begin( (uint8_t *)mac, (uint8_t *)ip); server.begin(); buf = (char *)malloc( 80 ); } void loop() { Client client = server.available(); if (client) { // an http request ends with a blank line boolean current_line_is_blank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // if we've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so we can send a reply if (c == '\n' && current_line_is_blank) { // send a standard http response header client.bwrite( (const uint8_t *)http_head, sizeof( http_head ) - 1 ); // output the value of each analog input pin for (int i = 0; i < 6; i++) { sprintf( buf, "analog input %d is %d <br />\r\n", i, analogRead(i) ); client.bwrite( (const uint8_t *)buf , strlen( buf ) ); } break; } if (c == '\n') { // we're starting a new line current_line_is_blank = true; } else if (c != '\r') { // we've gotten a character on the current line current_line_is_blank = false; } } } // give the web browser time to receive the data delay(1); client.stop(); } }
もろにC言語ですね。まあ私は組み込みの人間なので全然気にならないのですが。
パケットモニタ(PacMon)のキャプチャ画面を見れば判る様に、前回は1画面で収まらず、えらいスクロールしないとFINまで到達できませんでしたが、今回は1画面で全てのやり取りが完了しています。
まあ静的なページの表示ではなくCGIなのでforループの分だけパケットが増えていますが、これ位は許容範囲でしょう。
すっきりしましたね。
※追記
考えてみれば関数のオーバーライドができるんだから、
void Client::write( const uint8_t *buf, int size ) { send(_sock, buf, size ); }
Client.hには以下のプロトタイプ宣言を追加
void write( const uint8_t *buf, int size );
の方がよっぽどC++らしいですね。
前から気になっていたのですが、よくArduinoの事を簡単、簡単と説明されるのですが、一体何に対して”簡単”なのでしょう。統合環境上の開発ならArduino環境よりも便利な物が沢山あるのですが、例えばルネサスのHEWにしても、フリースケールのCodeWarriorにしてもIARのEWにしても、最近の統合環境では一々CRTやベクターテーブルから書かなくても良くなっています(勿論好みでそうしても良い)。 それらと比較してそれでも簡単と言う話でしょうか。しかしArduinoにはデバッカーが無いのでこれら統合開発環境と比較した場合、むしろ、、、しーーーーー。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
2009-05-15 21:37
nice!(0)
コメント(0)
トラックバック(1)
コメント 0