1

コード例は次のとおりです。

このコードでは、ドル記号を検出し、1、2、3 などの文字を識別します。これが入力された場合、http://x.x.x.x/$1つまり、ブロック条件 1 を選択します。

等。

このコードを変更して、文字列を読み取って変数に格納できるようにする必要があります。

たぶんhttp://x.x.x.x/$25、45 ドルか 100 ドルか、など。

void connection()
{
    EthernetClient client=server.available();

    if (client)
    {
        boolean currentLineIsBlank=true;

        while (client.connected()) {
            if (client.available()) {
                char c = client.read();

                if (incoming && c==' ')
                {
                    incoming=0;
                }
                if (c=='$')
                {
                    incoming=1;
                }
                //Checks for the URL string $1 or $2 and so on.
                if (incoming==1)
                {
                    if(c=='1')
                    {
                        //Insert something
                    }
                    if(c=='2')
                    {

                    }
                    if(c=='3')
                    {
                        redAll();
                    }
                }
                if(c=='\n')
                {
                    currentLineIsBlank=true;
                }
                else if(c!='\r')
                {
                    currentLineIsBlank=false;
                }
            }
        }
        delay(1);
        client.stop();
    }
}

私は何をすべきか?Arduinoが文字列を読み取るため。このコードで何を変更する必要がありますか?

4

1 に答える 1

1

AdafruitのSDWebBrowseの例は、私が見つけたものの中で最も典型的なものです。その中で、後で処理するために文字を文字列に組み込みます。

  ...
  if (client.available()) {
      char c = client.read();

      // If it isn't a new line, add the character to the buffer
      if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          // Are we too big for the buffer? Start tossing out data
          if (index >= BUFSIZ)
              index = BUFSIZ -1;

          // Continue to read more data!
          continue;
      }

      // Got a \n or \r new line, which means the string is done.
      clientline[index] = 0;

      // Print it out for debugging.
      Serial.println(clientline);
  ...

私はイーサネットライブラリ自体を読んでいますが、両方あります

virtual int read();

virtual int read(uint8_t *buf, size_t size);

利用可能なメンバー関数。ただし、ポインタ文字列のすべての例は、TCPではなくUDPの場合のみを示しています。これはUDPのステートレス性に関係しているのではないかと思います。

クライアントバッファに何があり、それを読み取るための長さがわからないという実用性が予防的な理由である場合、TCPで使用されている例は見当たりません。試してみるのに十分簡単かもしれないところ。

実際にclient.available()は、受信したサイズが返されるため、次のことが可能になるはずです。

...
int _available = client.available();
if (_available> 0) {
  client.read(clientline, _available);
...

どちらも文字列を作成することに注意してください。Stringクラスと混同しないでください。

于 2013-01-23T14:21:49.093 に答える