SSブログ

「オープンソースハードウェアセミナーVol1」レポート Arduino Ether ShieldサンプルWEBサーバー 早速改良だ! [ATmarquino Arduino]

chip1 Stopからいらした方、Arduino関連カテゴリをお試しください。http://hamayan.blog.so-net.ne.jp/archive/c2300498101-1
ether_shield_007.png
ether_shield_006.png
とまあ、ことさらタイトルが長くなっているのは、割と早めにレポートを書いているつもりだったのに、依然としてイベント参加レポートにリストされていないのは、 http://www.chip1stop.com/knowledge/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にはデバッカーが無いのでこれら統合開発環境と比較した場合、むしろ、、、しーーーーー。

マスタリングTCP/IP 入門編 第4版

マスタリングTCP/IP 入門編 第4版

  • 作者: 竹下 隆史
  • 出版社/メーカー: オーム社
  • 発売日: 2007/02/24
  • メディア: 大型本



詳解TCP/IP〈Vol.1〉プロトコル

詳解TCP/IP〈Vol.1〉プロトコル

  • 作者: W.リチャード スティーヴンス
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本



ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 濱原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本



nice!(0)  コメント(0)  トラックバック(1) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 1

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。