Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 7 months ago.
Ethernet connection between two mbeds
hi guys
I'm trying to connect two mbeds with ethernet. I have never done something with ethernet before, so it's all new for me. Can someone help me? I took the main code from https://developer.mbed.org/handbook/Socket
Thanks!
My Code:
Mbed A /media/uploads/Jimmy700/s_main_b.cpp
MbedB /media/uploads/Jimmy700/mbed_b.txt
1 Answer
7 years, 7 months ago.
Hello Jimmy,
I would recommend to get started with something more simple (mbed + PC). However, it's up to you.
If I understand correctly you would like to connect two mbed's directly to each other over an Ethernet cable (without involving an ethernet switch). In that case you should use a crossover cable and one mbed shall be programmed as client and the other one as server. Your code for Mbed A (to be programmed as client) seems OK. I have corrected just the comments regarding the IP adress asignement:
Mbed A (TCP client)
// Mbed A #include "mbed.h" #include "EthernetInterface.h" #include "uLCD_4DGL.h" DigitalOut l1(LED1); DigitalOut l2(LED2); DigitalOut l3(LED3); DigitalOut l4(LED4); uLCD_4DGL uLCD (p9,p10,p8); // serial tx, serial rx, reset pin; const int ECHO_SERVER_PORT = 7; const char* ECHO_SERVER_ADDRESS = "192.168.1.1"; // Adress of the other Mbed (Mbed B) int main () { EthernetInterface eth; const char* ip = "192.168.1.2"; // MBED A = 2; MBED B = 1 const char* mask = "255.255.255.0"; const char* gateway = "192.168.1.10"; eth.init(ip, mask, gateway); //I'dont use DHCP bacuse i use two mbeds eth.connect(); uLCD.printf("Client IP Address is %s\n", eth.getIPAddress()); // Connect to Server TCPSocketConnection socket; while (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT) < 0) { uLCD.printf("Unable to connect to (%s) \non port (%d)\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT); wait(1); } uLCD.printf("Connected to Server at %s\n",ECHO_SERVER_ADDRESS); // Send message to server char hello[] = "Hello World"; uLCD.printf("Sending message to Server : '%s' \n",hello); socket.send_all(hello, sizeof(hello) - 1); // Receive message from server char buf[256]; int n = socket.receive(buf, 256); buf[n] = '\0'; uLCD.printf("Received message from server: '%s'\n", buf); // Clean up socket.close(); eth.disconnect(); while(true) {} }
I would suggest to modify your code for Mbed B (to be programmed as server) as follows:
Mbed B (TCP server)
#include "mbed.h" #include "EthernetInterface.h" #include "uLCD_4DGL.h" #define ECHO_SERVER_PORT 7 DigitalOut l1(LED1); DigitalOut l2(LED2); DigitalOut l3(LED3); DigitalOut l4(LED4); uLCD_4DGL uLCD (p9,p10,p8); // serial tx, serial rx, reset pin; int main (void) { const char* ip = "192.168.1.1"; // MBED A = 2; MBED B = 1 const char* mask = "255.255.255.0"; const char* gateway = "192.168.1.10"; EthernetInterface eth; eth.init(ip, mask, gateway); //I'dont use DHCP bacuse i use two mbeds eth.connect(); uLCD.printf("\nServer IP Address is %s\n", eth.getIPAddress()); TCPSocketServer server; server.bind(ECHO_SERVER_PORT); server.listen(); while (true) { uLCD.printf("\nWait for new connection...\n"); TCPSocketConnection client; server.accept(client); client.set_blocking(false, 1500); // Timeout after (1.5)s uLCD.printf("Connection from: %s\n", client.get_address()); char buffer[256]; while (true) { int n = client.receive(buffer, sizeof(buffer)); if (n <= 0) break; // print received message to terminal buffer[n] = '\0'; uLCD.printf("Received message from Client :'%s'\n",buffer); // reverse the message char temp; for(int f = 0, l = n-1; f<l; f++,l--){ temp = buffer[f]; buffer[f] = buffer[l]; buffer[l] = temp; } // print reversed message to terminal uLCD.printf("Sending message to Client: '%s'\n",buffer); // Echo received message back to client client.send_all(buffer, n); if (n <= 0) break; } client.close(); } }
NOTE: Please notice that I haven't checked the pin assignment for the uLCD.