|
|
我在描述我所做的内容的时候可能出现不准确的地方
最近查了很多资料研究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][email protected][/email] 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[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
- char ReplyBuffer[] = "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 UDP start 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++;
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|