使用MySQL Connector / Arduino

时间:2019-06-09 18:34:29

标签: mysql arduino

我正在建立一个自动称重系统以进行质量控制。为此,我正在使用MySQL Connector/Arduino库。

一切就绪,我只剩下以下步骤:

  1. 咨询一个数据库,该数据库是我要评估的批次号(该批次号存储在VARCHAR数据表的qcInsecta_get中)。

  2. 将上面获得的值包含在INSERT中,并将称重传感器返回给我的重量值。

我已经处理了库作者提供的basic_insertbasic_select的示例。在datable中插入值我没有任何问题(之前我已经用探测值完成过)。但是,当我执行SELECT时,如果数据库字段是数字(例如INT),则检索到的值始终是数字值。但是,如果数据库字段是VARCHAR,则返回0。

我不是C代码方面的专家,但我在示例中看到了它:

head_count = atol(row->values[0]);

然后atol将字符串转换为其数值。我试图使用其他形式或转换器来进行SELECT并从数据库中获取值,但是对我来说这是不可能的。我该如何解决这个问题?

使用NODEMCU V3板进行SELECT的代码为:

#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

char ssid[] = ""; // SSID NAME
char pass[] = ""; // SSID PASSWORD

IPAddress server_addr(xxx, xxx, x, xxx);
char user[] = "";
char password[] = "";
char query[] = "SELECT batchnumber FROM registro.qcInsecta_get ORDER BY id DESC LIMIT 1";
WiFiClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  delay(500);
  Serial.begin(115200);
  WiFi.begin(ssid, pass);
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(100);
    Serial.println(F("Connected"));    
  }
  else {
      Serial.println();
      conn.close();  
      if (conn.connect(server_addr, 3306, user, password)) {
      delay(500);
      } 
      else {
        Serial.println("...");
      }
  }
}

void loop() {
  delay(1000);
  row_values *row = NULL;
  long head_count = 0;

  Serial.println("1) Demonstrating using a cursor dynamically allocated.");
  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Execute the query
  cur_mem->execute(query);
  // Fetch the columns (required) but we don't use them.
  column_names *columns = cur_mem->get_columns(); 

  // Read the row (we are only expecting the one)
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      head_count = atol(row->values[0]);
    }
  } while (row != NULL);
  // Deleting the cursor also frees up memory used
  delete cur_mem;

  // Show the result
  Serial.print("  Batch number = ");
  Serial.println(head_count);

  delay(500);
} 

关于数据库:

| qcInsecta | CREATE TABLE `qcInsecta` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `batchnumber` varchar(30) NOT NULL,
  `weight` float NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `batchnumber` (`batchnumber`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 |

MariaDB [registro]> SELECT * FROM qcInsecta;
+----+-------------+--------+---------------------+
| id | batchnumber | weight | created_at          |
+----+-------------+--------+---------------------+
|  5 | COL-01-05   |     35 | 2019-06-06 17:04:38 |
| 16 | COL-01-01   |     22 | 2019-06-06 18:57:02 |
| 17 | COL-01-01   |     22 | 2019-06-06 18:57:02 |
| 18 | COL-01-01   |     25 | 2019-06-06 21:52:02 |

1 个答案:

答案 0 :(得分:0)

使用head_count = atol(row->values[0]);,您正在将输出的每个字符转换为数字的长值。因此,您应该仅对NUMERIC字段执行此操作。对于字符串字段,您只需要row->values,它是C字符串的数组。

基于this row->values包含一个数组,其大小为SELECT列结果。例如,如果您选择一列(例如您当前的选择查询),则row->values的大小为1,结果将在row->values[0]中。

如果您需要分隔每一列,请尝试为每一列进行选择,或者可以按照complex_select.ino示例并在列而不是行上进行迭代,然后分离每一列类型并将其转换为所需的值。

#include <ESP8266WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

char ssid[] = ""; // SSID NAME
char pass[] = ""; // SSID PASSWORD

IPAddress server_addr(xxx, xxx, x, xxx);
char user[] = "";
char password[] = "";
char query[] = "SELECT batchnumber FROM registro.qcInsecta_get ORDER BY id DESC LIMIT 1";
WiFiClient client;
MySQL_Connection conn((Client *)&client);

void setup()
{
    delay(500);
    Serial.begin(115200);
    WiFi.begin(ssid, pass);
    if (conn.connect(server_addr, 3306, user, password))
    {
        delay(100);
        Serial.println(F("Connected"));
    }
    else
    {
        Serial.println();
        conn.close();
        if (conn.connect(server_addr, 3306, user, password))
        {
            delay(500);
        }
        else
        {
            Serial.println("...");
        }
    }
}

void loop()
{
    delay(1000);

    long head_count = 0;

    Serial.println("1) Demonstrating using a cursor dynamically allocated.");
    // Initiate the query class instance
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
    // Execute the query
    cur_mem->execute(query);
    // Fetch the columns (required) but we don't use them.
    Serial.println("Fetching with Columns");
    column_names *columns = cur_mem->get_columns();

    for (int f = 0; f < columns->num_fields; f++)
    {
        Serial.print(columns->fields[f]->name);
        if (f < columns->num_fields - 1)
        {
            Serial.print(',');
        }
    }
    Serial.println("Done");

    // Read the rows and print them
    Serial.println("Fetching with Rows");
    row_values *row = NULL;
    do
    {
        row = cur_mem->get_next_row();
        if (row != NULL)
        {
            //e.g convert to a float value
            // float batchnumber = 0;
            //   batchnumber = atol(row->values[0]);
            //   Serial.print("float value: ");
            //   Serial.println(batchnumber,2);
            String batchnumber_str = "";
            for (int f = 0; f < columns->num_fields; f++)
            {
                //just print the String value
                // Serial.print(row->values[f]);
                // convert value to String
                batchnumber_str = String(row->values[f]);
                Serial.print("batchnumber_str: ");
                Serial.println(batchnumber_str);
                if (f < columns->num_fields - 1)
                {
                    Serial.print(',');
                }
            }
            Serial.println();
        }
    } while (row != NULL);
    Serial.println("Done");
    // Deleting the cursor also frees up memory used
    delete cur_mem;

    // Show the result
    Serial.print("  Batch number = ");
    Serial.println(head_count);

    delay(500);
}