Danke für die Antwort.
Da bekomme ich folgendes Ergebnis:
48
lg
Danke für die Antwort.
Da bekomme ich folgendes Ergebnis:
48
lg
Das wäre ein 'H'. Aber Du solltest alle Zeichen als Hex ausgeben.
Gruß Tommy
Danke für die Antwort.
Ich habe da folgendes versucht:
while(readchar)
{
Serial.print(readchar,HEX);
}
Wie kann ich da aber das nächste Zeichen aufrufen.
Ich habe auch noch folgendes versucht:
String inhalt = "";
for (byte i = 0; i < sizeof(readchar); i++)
inhalt += String(readchar[i], HEX);
Serial.print(inhalt);
Bekomme da aber leider folgende Meldung:
D:\zisterne.ino: In function 'void durchlauf()':
zisterne:295:40: error: invalid types 'char[byte {aka unsigned char}]' for array subscript
inhalt += String(readchar[i], HEX);
^
Danke für einen Tipp.
lg
haiflosse:
Ich habe da folgendes versucht:while(readchar)
{
Serial.print(readchar,HEX);
}
while(client.available()){
char readchar = client.read();
Serial.print(readchar,HEX);
// String line = client.readString();
geht nicht?
Danke für die Antwort.
Da bekomme ich nur 48 als Ergebnis.
lg
Dann machst Du was falsch.
Zeige doch mal den ganzen Teil.
Gruß Tommy
if (WiFi.status() == WL_CONNECTED) {
if (!client.connect(host, 80)) {
Serial.println("connection failed");
return;
}
//Werte von DAtenbank holen - beginn
url = "/settings.php?board="+String(id);
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
// start waiting for the response
unsigned long lasttime = millis();
while (!client.available() && millis() - lasttime < 1000) {delay(1);} // wait max 1s for data
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
char readchar = client.read();
Serial.print(readchar,HEX);
}
}
lg
Da musst Du mehr als ein Zeichen bekommen.
Mal nebenher gefragt: Warum tust Du Dir das Parsen des HTML an?
Du könntest doch vom PHP auch einfach eine Textzeile mit '\n' am Ende mit den Inhalten als text/plain senden und diese mit strtok zerlegen.
Damit könntest Du Standardroutinen für serielle Eingaben anwenden.
Gruß Tommy
Danke für die Antwort.
Ich habe den php String wie folgt geändert:
echo ";".$row['pfad'].";".$row['hoehe'].";".$row['faktor'].";".$row['zeit'].";".$row['host'].";".$row['standort'].";".$row['hoehe_sensor'].";".$row['max'].";".$row['messgeraet'].";\n";
Was muss ich noch beim Code in Arduino ändern?
Danke
Schau Dir mal strtok an.
Routinen zum Einlesen bis '\n' gibt es hier im Forum genügend.
Suche mal nach readBytesUntil.
Gruß Tommy
Danke für die Antwort.
Ich habe da folgendes probiert:
while(client.available()){
char readchar = client.read();
int x = Serial.readBytesUntil("\n",readchar,sizeof(readchar));//It require two things, variable name to read into, number of bytes to read.
Serial.println(x);//display number of character received in readData variable.
Serial.println(readchar);
}
Leider bekomme ich aber folgende Meldung:
call of overloaded 'readBytesUntil(const char [2], char&, unsigned int)' is ambiguous
int x = Serial.readBytesUntil("\n",readchar,sizeof(readchar));//It require two things, variable name to read into, number of bytes to read.
^
Hoffe es kann mir jemand weiterhelfen.
Vielen Dank
char readchar
ist ja auch nur ein einzelnes Zeichen. Du willst aber mehrere einlesen:
char readchar[128];
Und außerdem: liest Du nun von der seriellen Schnittstelle 'Serial' oder von 'client'?
Danke für die Antwort.
Wenn ich eine php Datei einlesen möchte, müsste es client sein - oder?
Danke
Ja, von client.
Das ist der Nachteil, wenn man nach so vielen Postings immer noch lernresistent ist.
Gruß Tommy
Danke für die Antworten.
Ich habe nun folgendes versucht:
char readchar[128] = client.read();
error: array must be initialized with a brace-enclosed initializer
char readchar[128] = client.read();
^
Hoffe es kann mir jemad weiterhelfen.
Danke
haiflosse:
Hoffe es kann mir jemad weiterhelfen.
Viele "jemands" könnten sicherlich!
Mir fällt es zunehmen schwerer, nach über 150 Beiträgen deinerseits, dir den Urknall anhand der Beispiele der iDE nochmals nahe zu legen.
Zunächst, solltest du dir selbst helfen.
Lies dich ein!
Gefühlt hoffst du, das sich der Standart an dein geschreibsel anpasst.
Ziehlfürender erscheint mir, das du dich mit den Grundlagen beschäftigst, bevor du das große Rad drehst!
Deine Unkenntnis über Arrays vom Type char steht dir momentan im Weg!
Gruß Fips
Danke für die Antwort.
Derfips:
Deine Unkenntnis über Arrays vom Type char steht dir momentan im Weg!
Leider suche ich laufend nach Lösungen und Beispiele.
Leider konnte ich aber kein passendes Beispiel oder Erklärung zu meinem Problem finden.
Deshalb bitte ich das mir hier jemand einen Tipp oder Link zu einer Erklärung schicken kann.
Vielen Dank
Ich sehe da drei Themen
a) Du willst einen HTTP Body / die payload vom Server am Uno (?) nach Trennzeichen zerteilen
b) Du willst deinen webserver debuggen, warum da manchmal zusätzliche Zeichen kommen
c) Du willst die Server Antwort am Uno als Hex darstellen
Frage 1: ist das alles? Wenn nein, was noch?
Frage 2: wonach suchst du aktuell im Netz wo du nichts findest?
Frage 3: Welche Aufgabe möchtest du als erstes lösen?
Danke für die Antwort und Angebot für die Hilfe.
Zu a) stimmt. Zur Zeit parse ich eine HTML Seite bin aber auf die Idee gerbracht worden direkt einen Text einzulesen wenn ich \n am Ende einfüge.
Dazu soll ich readBytesUntil verwenden.
Leider habe ich dazu aber keine Lösung bzw. Beispiel gefunden readBytesUntil mit einem Client zu verwenden.
Zu b)
Stimmt.
Zu c)
Die Darstellung als hex dient dazu um alle Zeichen darzustellen.
Die Feage ist nur ob ich dies noch benötige wenn ich nur den Text einlese.
Bei der Darstellung der hex Werte habe ich geschafft nur den ersten Wert in hex umzuwandeln.
Siehe #26
Beim Abrufen nur des Textes habe ich es nicht geschafft mit readBytesUntil den Text vom Client einzulesen.
Siehe #34.
Hoffe ich habe alle Fragen beantwortet und bitte um weitere Hilfe.
Vielen Dank und LG
dieser webclient sollte halbwegs robust sein. Mit den zwei Debug-Variablen kannst du die Ausgabe bzw. die HEX-Darstellung aktivieren.
/*
Web client receiver with optional debugger
by noiasca
2020-10-18
*/
#include <SPI.h>
#include <Ethernet.h>
constexpr char server[] = "www.arduino.cc"; // server name address to read from (DNS)
constexpr char page[] = "latest.txt"; // page to read
constexpr uint32_t postingInterval = 30 * 1000UL; // in milliseconds
constexpr bool debugWebData = true; // print received data to serial monitor, set to false for better speed measurement
constexpr bool debugHex = false; // print received data to serial monitor, set to false for better speed measurement
constexpr uint16_t timeout = 7 * 1000UL; // don't wait longer as these ms for incoming request, and don't process longer than this time
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 177); // only fallback. Sketch will try DNS first
IPAddress myDns(192, 168, 0, 1);
EthernetClient client;
uint32_t beginTS, endTS; // Timestamps to measure the speed
void setup() {
Serial.begin(115200);
Serial.println(F("Webclient Debugger"));
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// start the Ethernet connection:
Serial.println(F("Initialize Ethernet with DHCP:"));
if (Ethernet.begin(mac) == 0) {
Serial.println(F("Failed to configure Ethernet using DHCP"));
// Check for Ethernet hardware present
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println(F("Ethernet shield was not found. Reset to Restart."));
while (true) {
delay(1); // do nothing, no point running without Ethernet hardware
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println(F("Ethernet cable is not connected."));
}
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, ip, myDns);
} else {
Serial.print(F("DHCP assigned IP "));
Serial.println(Ethernet.localIP());
}
// give the Ethernet shield a second to initialize:
delay(1000);
}
void loop() {
timerWebclientSend();
if (client.available()) httpRequestReceive();
}
void timerWebclientSend() // check if its time to send the request
{
static uint32_t lastConnectionTime = -postingInterval;
uint32_t currentMillis = millis();
if (currentMillis - lastConnectionTime > postingInterval)
{
httpRequestSend();
lastConnectionTime = currentMillis;// set timer
}
}
void httpRequestSend()
{
Serial.print(F("try "));
Serial.print(server);
// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
Serial.print(F(" connected IP "));
Serial.println(client.remoteIP());
// Make a HTTP request:
client.print(F("GET /")); // GET /search?q=arduino HTTP/1.1
client.print(page);
client.print(F(" HTTP/1.1\r\n"
"Host: ")); // HTTP/1.1 allows the usage of HTTP header field Host, which must be set for a virtual Host
client.print(server);
client.print(F("\r\n"
"User-Agent: arduino-ethernet\r\n"
"Connection: close\r\n"
"\r\n" // Empty row
"\r\n")); // Final end of request
} else {
// if you didn't get a connection to the server:
Serial.println(F(" connection failed"));
}
beginTS = millis();
}
void printHex(byte actual) // helper function to print out hex values with pre-zero
{
Serial.print(" 0x");
if (actual < 0x10) Serial.print("0");
Serial.print(actual, HEX);
Serial.print(" ");
}
void httpRequestReceive()
{
if (client) {
Serial.println(F("\nclient connected"));
uint16_t i = 0; // index / current read position
const uint16_t buffersize = 100; // size of read buffer (reads a complete line)
const uint16_t smallbuffersize = 30; // a smaller buffer for results
char lineBuffer[buffersize] {'\0'}; // buffer for incomming data
uint16_t httpStatusCode = 0; // https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
char httpReasonPhrase[smallbuffersize]; // Status Code and Reason Phrase
char body[buffersize]; // received payload (only one line)
uint32_t byteCount = 0;
enum class Status {REQUEST, EMPTY_LINE, BODY};// we need 3 states for the state machine
Status status = Status::REQUEST;
while (client.connected()) { // default timeout 1000ms
while (client.available() && millis() - beginTS < timeout) {
byteCount++;
char c = client.read();
if (debugWebData) Serial.print(c); // Debug print received characters to Serial monitor
if (debugHex) // Debug print received characters to Serial monitor in HEX
{
printHex(c);
if (c == '\r' || c == '\n') Serial.println(); // just to make it the lines a little more readable
}
if ( c == '\n' )
{
if (status == Status::REQUEST) // read the first line
{
// Serial.print(F("lineBuffer="));Serial.println(lineBuffer);
// now split the input
char *ptr;
ptr = strtok(lineBuffer, " "); // remember: strtok willdestroy the current lineBuffer
//strlcpy(httpVersion, ptr, smallbuffersize); // first token is HTTP/1.0 or HTTP/1.1 but we don't need this information
ptr = strtok(NULL, " ");
strlcpy(httpReasonPhrase, ptr, smallbuffersize); // httpReasonPhrase used as temp buffer for ASCII responseCode
httpStatusCode = atoi(httpReasonPhrase);
ptr = strtok(NULL, "\n");
strlcpy(httpReasonPhrase, ptr, smallbuffersize);
Serial.print(F("status code=")); Serial.println(httpStatusCode);
Serial.print(F("reason phrase=")); Serial.println(httpReasonPhrase);
status = Status::EMPTY_LINE; // jump to next status, but as the implementation of CONTENT_LENGTH is missing jump to "EMPY_LINE"
}
else if (status > Status::REQUEST && i < 2) // check if we have an empty line (line length = 0 obvious, or 1 (for the '\r')
{
status = Status::BODY;
}
else if (status == Status::BODY)
{
strlcpy(body, lineBuffer, buffersize);
break; // we have received one line payload and break out
}
i = 0;
strcpy(lineBuffer, "");
}
else
{
if (i < buffersize)
{
lineBuffer[i] = c;
i++;
lineBuffer[i] = '\0';
}
// MISSING wenn status 3 und content-length --> abbrechen.
}
}
if (status == Status::BODY) // previous status could end without linefeed, therefore we takeover here also
{
strlcpy(body, lineBuffer, buffersize);
}
Serial.print(F("\nbody=")); Serial.println(body);
if ( httpStatusCode >= 200 && httpStatusCode <= 399) // HTPP Status Codes 2xx (successfull) and 3xx (redirection) could contain requested data
{
Serial.println(F("success"));
// MISSING Parse Body / payload data - see separate example how to parse data
}
}
// calculate and print some statistics
endTS = millis();
client.stop();
Serial.print(F("Received "));
Serial.print(byteCount);
Serial.print(F(" bytes in "));
float seconds = (float)(endTS - beginTS) / 1000.0;
Serial.print(seconds, 4);
float rate = (float)byteCount / seconds / 1024.0;
Serial.print(F("ms, rate = "));
Serial.print(rate);
Serial.print(F(" KB/sec"));
Serial.println();
}
}
Es ist im Wesentlichen das Beispiel webclient aus der IDE ergänzt um die Auswertung der HTTP-Header Fields.