So-net無料ブログ作成
検索選択

「オープンソースハードウェアセミナー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

この記事のトラックバックURL:
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。