Rainbow包含一个END28J60的网络模块,可以非常方便和网络设备进行通信。开发包实现了一个TCP/IP协议栈,并进行了c++封装,无论是UDP、TCP还是WebServer的编程,都非常简单,这使得开发人员可以不用关心网络实现的细节,而是关注功能的实现。
要进行网络通信,首先需要初始化网络:指定MAC地址和ip,可以采用静态设定或者DHCP的方式,两种方式都非常简单,以静态设定为例,我们在进行网络通信之前,调用Ethernet.begin(mac, ip)即可,其中mac是需要设定的mac地址,ip是网络模块的ip地址,参考定义为:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 15);
在Rainbow中进行UDP通信非常简单,只需要以下几个步骤即可:
1、定义EthernetUDP对象:EthernetUDP UDP;
2、开始UDP通信,设置本机监听UDP包的地址,假如在6001端口进行监听:UDP.begin(6001);
3、设置对方的ip地址和端口:UDP.beginPacket(destIp, destPort);
4、向UDP包中写入要发送的数据,如:UDP.println("Hello,world!");
5、通过网络模块将UDP数据包发送出去:UDP.endPacket();
在软件包的“Projects\UDP-Send”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。这个程序主要展示如何通过UDP向对方发送字符串,看看main.cpp的代码:
#include "WProgram.h"
#include "Ethernet.h"
#include "EthernetUDP.h"
//网络模块的MAC地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//网络模块的IP地址
IPAddress ip(192, 168, 1, 15);
//定义对方ip和端口
IPAddress destIp(192, 168, 1, 171);
uint16_t destPort(6000);
//定义UDP对象
EthernetUDP UDP;
void setup()
{
//初始化Rainbow
boardInit();
//初始化默认串口
Serial.begin();
Serial.println("UDP-Send start...");
//对网络进行初始化
Ethernet.begin(mac, ip);
//开始一个UDP,虽然是发送,但是还是要设置监听端口,因为UDP是双工通信
UDP.begin(6001);
}
void loop()
{
//开始准备UDP包
UDP.beginPacket(destIp, destPort);
//准备要发送的数据
UDP.println("Hello,world!");
//将UDP包发送出去
UDP.endPacket();
delay(5000);
}
int main()
{
setup();
while(1) loop();
}
这段代码我们设置Rainbow的ip地址为192.168.1.15,UDP接收端的ip地址为192.168.1.171,可以根据实际情况进行修改。
上面的程序编译无误后,将程序烧写到Rainbow中,然后在电脑上运行串口调试工具并和Rainbow连接成功,启动UDP监听,可以在串口调试工具中看到输出的日志,同时,每隔5秒,将在从网络上接收到Rainbow发来的UDP数据: