Здравствуйте!
Пытаюсь получить из char[512] String, но на выходе пустая строка.
Суть задачи - получить по http строку, вывести её в QR на дисплей.
Использую Arduino Uno.
#include "TFT.h"
#include "SPI.h"
#include <EtherCard.h>
#include "qrcode.h"
#include <EEPROM.h>
#include "assets.h"
#define DATA_FLAG 0xAA // Маркер, указывающий наличие сохраненных данных в EEPROM
#define cs 7 // пин для подключения CS
#define dc 6 // пин для подключения A0
#define rst 5 // пин для подключения reset
struct NetConfig {
byte myip[4];
byte mymac[6];
};
// Функция сохранения настроек в EEPROM
void saveSettings(const NetConfig &cfg) {
EEPROM.write(0x0, DATA_FLAG); // Записываем маркер, указывающий наличие данных
EEPROM.put(0x1, cfg); // Сохраняем данные в EEPROM, начиная с адреса 0x1
}
// Функция загрузки дефолтных настроек
void loadDefaults(NetConfig &cfg) {
// ethernet interface mac address, must be unique on the LAN
byte defaultMac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
byte defaultIp[] = { 192, 168, 7, 2 };
// Устанавливаем дефолтные значения
memcpy(cfg.myip, defaultIp, 4);
memcpy(cfg.mymac, defaultMac, 6);
// Сохраняем дефолтные значения в EEPROM
saveSettings(cfg);
}
// Функция загрузки настроек из EEPROM
void loadSettings(NetConfig &cfg) {
if (EEPROM.read(0x0) == DATA_FLAG) { // Проверяем наличие маркера
EEPROM.get(0x1, cfg); // Если маркер есть, загружаем настройки из EEPROM
} else {
loadDefaults(cfg); // Если маркера нет, загружаем дефолтные настройки
}
}
NetConfig cfg;
int16_t w, h;
static uint32_t timer;
static uint32_t httpTimer;
#define BUFFERSIZE 1200
byte Ethernet::buffer[BUFFERSIZE];
BufferFiller bfill;
TFT screen = TFT(cs, dc, rst);
static word sendOk() {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: application/json\r\n"
"Pragma: no-cache\r\n"
"\r\n"
"{\"message\":\"OK\"}"));
return bfill.position();
}
static word sendErr() {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 503 Service Unavailable\r\n"
"Content-Type: application/json\r\n"
"Pragma: no-cache\r\n"
"\r\n"
"{\"message\":\"device is busy\"}"));
return bfill.position();
}
String dataString;
boolean isWelcomeScreen = false;
static void showCode(String &amount) {
generateQRCode(amount);
}
static void welcome() {
isWelcomeScreen = true;
// цвет экрана дисплея ( r , g , b )
screen.background(0, 0, 0);
screen.drawBitmap(32, 0, ia_ic, 128, 128, 0xFFFFFF);
}
void generateQRCode(String &amount) {
isWelcomeScreen = false;
// Создаем QR-код
QRCode qrcode;
uint32_t str_len = amount.length() + 1;
char am[str_len];
amount.toCharArray(am, str_len);
char *data = am;
const uint8_t ecc = 0; //самый низкий уровень исправления ошибок
const uint8_t version = 5;
uint8_t qrcodeData[qrcode_getBufferSize(version)];
qrcode_initText(&qrcode,
qrcodeData,
version, ecc,
data);
// Calculate the scale factor
int scale = min(w / qrcode.size, h / qrcode.size);
// Calculate horizontal shift
int shiftX = (w - qrcode.size * scale) / 2;
// Calculate horizontal shift
int shiftY = (h - qrcode.size * scale) / 2;
screen.background(255, 255, 255);
screen.stroke(0, 0, 0);
screen.fill(0, 0, 0);
for (uint8_t y = 0; y < qrcode.size; y++) {
for (uint8_t x = 0; x < qrcode.size; x++) {
bool mod = qrcode_getModule(&qrcode, x, y);
if (mod) {
screen.fillRect(15 + shiftX + x * scale, shiftY + y * scale, scale, scale, 0x0000);
}
}
}
}
void setup() {
Serial.begin(57600);
Serial.println(F("\nStart..."));
delay(1000);
screen.begin();
w = screen.width();
h = screen.height();
screen.background(0, 0, 0);
screen.setTextSize(1);
screen.stroke(255, 255, 255);
screen.text("Loading...", 45, 64);
delay(1000);
// Загружаем настройки из EEPROM или устанавливаем дефолтные
loadSettings(cfg);
Serial.println(F("\nSettings loaded!"));
// Change 'SS' to your Slave Select pin, if you arn't using the default pin
if (ether.begin(sizeof Ethernet::buffer, cfg.mymac, SS) == 0) {
Serial.println(F("Failed to access Ethernet controller"));
screen.background(0, 0, 0);
screen.text("ERROR: Failed to access Ethernet controller", 45, 64);
delay(5000);
} else {
Serial.println(F("\nEthernet controller OK!"));
}
if (!ether.dhcpSetup()) {
Serial.println(F("DHCP failed"));
screen.background(0, 0, 0);
screen.text("ERROR: DHCP failed", 45, 64);
delay(5000);
} else {
Serial.println(F("\nDHCP OK!"));
}
Serial.println(F("\nNetwork settings apply..."));
ether.staticSetup(cfg.myip);
ether.hisport = 8484;
Serial.print(F("Serial port speed: "));
Serial.println(F("57600"));
Serial.println(F("Ethernet config: "));
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
Serial.println(F("Started!"));
welcome();
}
void loop() {
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if (pos) {
char *data = (char *)Ethernet::buffer + pos;
char body[512];
char *command;
int idx = 0;
bool headersEnds = false;
while ((command = strtok_r(data, "\n", &data)) != NULL) {
if ((strlen(command) == 1) && (command[0] == 0x0D)) {
headersEnds = true;
idx++;
continue;
}
if (headersEnds) {
strcat(body, command);
strcat(body, "\n");
}
idx++;
}
Serial.println(body);
dataString = String(body);
dataString.trim();
Serial.println(dataString);
if (millis() < httpTimer) {
ether.httpServerReply(sendErr()); // send web page data
dataString = "";
} else {
timer = millis() + 1000;
ether.httpServerReply(sendOk()); // send web page data
}
httpTimer = millis() + 3000;
//memset((char *)Ethernet::buffer, 0, sizeof((char *)Ethernet::buffer));
//data = NULL;
}
if (dataString.startsWith("https://") && millis() > timer) {
timer = millis() + 300000;
showCode(dataString);
dataString = "";
} else if (!isWelcomeScreen && millis() > timer) {
welcome();
dataString = "";
}
if (Serial.available() > 0) {
String stringVariable = Serial.readString();
if (stringVariable.startsWith("set_default")) {
loadDefaults(cfg);
Serial.println(F("settings reset"));
} else if (stringVariable.startsWith("set_ip")) {
Serial.println(F("Setings reset"));
stringVariable.replace("set_ip", "");
stringVariable.trim();
if (stringVariable != "") {
Serial.print(F("Set IP: "));
Serial.println(stringVariable);
char charBuf[50];
stringVariable.toCharArray(charBuf, 50);
ether.parseIp(ether.myip, charBuf);
memcpy(cfg.myip, ether.myip, 4);
saveSettings(cfg);
}
}
}
}