Exploit 发表于 2014-3-19 15:24:57

arduino w5100网络模块双向通信

         我在描述我所做的内容的时候可能出现不准确的地方

   最近查了很多资料研究w5100的网络双向通信,代码研究了很多但是发现问题也不少。
1.大多是上传数据到服务器 HTTP GET AND POST方式上传数据 实现起来很简单 我在apache web server 上写了个发送电子邮件的脚本 接收post数据后发送邮件
2.反向控制 arduino 一直是个问题原因是在网络上很难找到 相关资料!看看arduino ide 的实例中有udp传送协议的实例程序,自己在网络上使用php发送udp包的方法发送数据到arduino
3.效率问题 在将代码一番整合以后 发现效率极低 并严重影响程序的正常运行。自己在网络上一番查找之后确定使用 pt库(Protothreads)开发类并行程序 当然我对arduino的编程语言很不在行!所以我在描述我所做的内容的时候可能出现不准确的地方

硬件环境 ARDUINO UNO R3+ W5100 网络盾板

结合以上几点写了一个程序 请看下面代码

UDP 发送部分 复制php代码请 点击这里查看 http://www.iiexe.com/13336.html



因为arduino 只能在内网进行服务 因其没有拨号能力只能使用路由器进行端口转发或者类似操作!这里我测试时是在内网电脑上架设的apache2 php 服务器 设置的arduino ip 192.168.1.177

具体代码请看 http://www.iiexe.com/13338.html
#include <pt.h>//ProtoThreads必须包含的头文件
#include <SPI.h>         // 加载SPI
#include <Ethernet.h>   //加载网络库
#include <EthernetUdp.h>// 加载UDP 库UDP library from: [email protected] 12/30/2008
/***************************************UDP AND BOOT*****************************************************/
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177); //设置本机IP

unsigned int localPort = 8888;      // 监听端口local port to listen on

// buffers for receiving and sending data
char packetBuffer; //buffer to hold incoming packet,
charReplyBuffer[] = "acknowledged";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

/********************************************************************************************/
static int counter1,counter2,state1=0,state2=0; //counter为定时计数器,state为状态

static int protothread1(struct pt *pt) //线程1,
{
PT_BEGIN(pt);//线程开始
while(1) //每个线程都不会死
{
    PT_WAIT_UNTIL(pt, counter1==2); //如果时间满了1秒,则继续执行,否则记录运行点,退出线程1
    counter1=0; //计数器置零
   /************************************************************************************/
   int packetSize = Udp.parsePacket();
if(packetSize)
{
    Serial.print("Received packet of size ");
    Serial.println(packetSize); //包大小

    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);

    Serial.println(packetBuffer); //输出字符串 可以对输出的字符串进行分析并使arduino 做出相应动作

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
}

   /////////////////////////////////////////////////////////////////////////////////////
}

PT_END(pt); //线程结束
}

static int protothread2(struct pt *pt) //线程2,
{
PT_BEGIN(pt); //线程开始
while(1) {    //每个线程都不会死

    PT_WAIT_UNTIL(pt, counter2==2); //如果时间满了5秒,则继续执行,否则记录运行点,退出线程2
    counter2=0;//计数清零
    EthernetClient client;
/**************************************************************************************/
String data;
data+="";
data+="data="+analogRead(A1); // Use HTML encoding for comma's
data+="&submit=Submit"; // Submitting data

if (client.connect("www.iiexe.com",80)) {
Serial.println("connected");
client.println("POST /arduino/post.php HTTP/1.1");
client.println("Host: www.iiexe.com");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.print("Content-Length: ");
client.println(data.length());
client.println();
client.print(data);
client.println();

//Prints your post request out for debugging
Serial.println("Host: www.iiexe.com");

}

if (client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}

/***************************************************************************************/
}
PT_END(pt);//线程结束
}

static struct pt pt1, pt2;
void setup()
{
/***********************************初始化*********************************************/
   //设置 初始化Ethernet and UDPstart the Ethernet and UDP:
PT_INIT(&pt1);//线程1初始化
PT_INIT(&pt2);//线程2初始化
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);

/*********************************************************************************/
pinMode(12,OUTPUT);//设置引脚D12
pinMode(13,OUTPUT);//设置引脚D13

}

void loop () //这就是进行线程调度的地方
{
    protothread1(&pt1);//执行线程1
    protothread2(&pt2);//执行线程2
    delay(1000);//时间片,每片1秒,可根据具体应用设置大小
    counter1++;
    counter2++;
}

totson 发表于 2014-3-20 11:41:23

谢谢分享 学习了

Exploit 发表于 2014-3-20 13:19:26

共同努力..................

jolinmx 发表于 2014-11-15 11:51:02

服务器端的代码是什么能否贴一下

Atoney 发表于 2015-5-29 20:07:30

收下了:victory:
页: [1]
查看完整版本: arduino w5100网络模块双向通信