2017-02-22 5 views
0

Ich habe Arduino + Ethenet Schild. Ich möchte die IP dynamisch ändern, abhängig davon, dass es am Eingangsport kommen wird.Wie konvertiert man String in Byte []?

Das Hauptproblem ist - Eingabezeichenfolge hat einen String-Typ und Ethernet.begin Methode akzeptiert ein Byte-Array. Im Allgemeinen kann ich nicht verstehen, wie man diese Schnur richtig konvertiert. Versucht, ein Fahrrad (Krücke) durch Bewegen der Zeichenfolge in der Char-Array und dann in der Byte-Array zu machen. Es hat nicht geklappt. Wie konvertiere String in Byte []?

#include <SPI.h> 
#include <Ethernet.h> 
String readString; 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address 
byte myserver[] = { 208, 104, 2, 86 }; // zoomkat web page server IP address 
EthernetClient client; 

void initEthernetConfig(byte ip[]) 
{ 

    Ethernet.begin(mac, ip); 
    Serial.begin(9600); 
    Serial.println("Better client test 12/01/11"); // so I can keep track of what is loaded 
    Serial.println("Send an e in serial monitor to test"); // what to do to test 
} 

void setup(){ 
    byte ip[] = { 10, 28, 33, 4 }; 
// initEthernetConfig(ip); 
} 

void loop(){ 
    // check for serial input 

    while (Serial.available()) { 
    char c = Serial.read(); //gets one byte from serial buffer 
    readString += c; //makes the String readString 
    delay(2); //slow looping to allow buffer to fill with next character 
    } 

    if (readString.length() >0) { 
    byte inArray[4]; 
    char * tokens; 
    int i = 0;  
    tokens = strtok(readString, "."); 
    while (tokens != NULL) { 
     inArray[i] = atoi(tokens); 
     tokens = strtok(NULL, "."); 
     i++; 
    } 
    initEthernetConfig(inArray); 
    } 

} 
+0

was ist der Punkt von 'inArray' es wird nicht verwendet? Wie wäre es mit Casting auf ein Byte 'inArray [i ++] = (Byte) atoi (Token);' –

Antwort

1

Dies ist eine mögliche Lösung, es analysiert, Deponien und setzt ein IPv4:

#include <SPI.h> 
#include <Ethernet.h> 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address 
byte myserver[] = { 208, 104, 2, 86 }; // zoomkat web page server IP address 
EthernetClient client; 

/** 
* help functions declaration 
*/ 

void get_ip(byte ip[4]); 
void dump_ip(byte ip[4]); 
void initEthernetConfig(byte ip[]); 

/** 
* setup && loop 
*/ 

void setup(){ 
    Serial.begin(9600); 
} 

void loop() 
{ 
    byte ip[4]; 

    get_ip(ip); 
    dump_ip(ip); 

    initEthernetConfig(ip); 
} 

/** 
* help function implementation 
*/ 

void get_ip(byte ip[4]) 
{ 
    for (byte i = 0; i < 4; ++i) { 
    while (Serial.available() <= 0) { }; 
    ip[i] = (byte) Serial.parseInt(); 
    if (i < 3) { Serial.read(); } // throw away dot 
    } 
}; 

void dump_ip(byte ip[4]) { 
    for (byte i = 0; i < 4; ++i) { 
    Serial.print(ip[i]); 
    if (i < 3) { 
     Serial.print('.'); 
    } else { 
     Serial.println(); 
    } 
    } 
}; 

void initEthernetConfig(byte ip[]) 
{ 
    Ethernet.begin(mac, ip); 
    Serial.println("Better client test 12/01/11"); // so I can keep track of what is loaded 
    Serial.println("Send an e in serial monitor to test"); // what to do to test 
}; 

Offensichtlich außerhalb dieser Test-Anwendung sollten Sie sicherstellen, dass der Serial Eingang bereit ist, eine IPv4 an erster Stelle zu senden, sonst der Spaß ction wird wahrscheinlich 0.0.0.0 zurückgeben. Eine Idee wäre, Ihr Kommunikationsprotokoll mit string-basierten Befehlen anzureichern, z.B. ip: würde den Beginn eines IPv4 Eingangs signalisieren.

+0

Ausgezeichnete Antwort. Danke, Mann!!!! – user1088259

1

Try this:

while (tokens != NULL) { 
    inArray[i++] = atoi(tokens) & 0xFF; 
    tokens = strtok(NULL, "."); 
} 

, die nur das letzte Byte der ganzen Zahl erhalten wird, aber das ist alles was Sie 0-255 im Fall von Werten wollen.

Aber warum dann wieder nicht nur in als Bytes lesen ...

void loop(){ 
    byte inArray[4]; 
    int i = 0; 
    // check for serial input 

    while (Serial.available()) { 
    inArray[i++] = (byte) Serial.read(); //gets one byte from serial buffer 
    delay(2); //slow looping to allow buffer to fill with next character 
    } 
    initEthernetConfig(inArray); 
} 
Verwandte Themen