如何从URL到Arduino(webserver)读取字符串而不仅仅是字符?

时间:2013-01-23 10:57:58

标签: arduino

以下是示例代码:

在此代码中,它检测美元符号,然后识别字符,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读取一个字符串。我应该用这段代码改变什么?

1 个答案:

答案 0 :(得分: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);

可用的会员功能。但是,指针字符串的所有示例仅显示UDP,而不是TCP的情况。我怀疑这可能与UDP的无状态有关。

如果不知道客户端缓冲区中的内容及其读取长度的实用性可能是预防性原因,我没有看到它在TCP上使用的任何示例。可能很容易尝试的地方。

实际上,client.available()会返回收到的大小,因此应该可以:

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

注意两者都创建一个字符串。不要与String类混淆。