极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 56050|回复: 57

enc28j60 控制多个 led IO 的代码,模块本身带控制的html页面

[复制链接]
发表于 2015-4-10 10:31:56 | 显示全部楼层 |阅读模式
本帖最后由 布列松 于 2015-5-3 22:29 编辑

原标题:请问这段串口代码,我想输出两组不同的数据,怎样改呢

enc28j60 控制多个 led IO 的代码,模块本身带控制的html页面,非常感谢,tsaiwn,的热心帮忙,代码我去掉了 rs485的串口控制输出,html页面加上了中文的显示。对了,后来发现经常死机的原因可能是主板的质量不好引起的,这种山寨主板,我居然在这段时间烧了两块(夏天来了?),都是串口烧了,主芯片确还正常。





  1. #include <EtherCard.h>

  2. static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
  3. static byte myip[] = {192,168,1,180};
  4. byte Ethernet::buffer[700];

  5. const int ledPin1 = 3;
  6. const int ledPin2 = 4;
  7. const int ledPin3 = 5;
  8. const int ledPin4 = 6;
  9. const int ledPin5 = 7;
  10. const int ledPin6 = 8;
  11. const int ledPin7 = 9;

  12. boolean ledStatus1;
  13. boolean ledStatus2;
  14. boolean ledStatus3;
  15. boolean ledStatus4;

  16. char* on = "ON_";
  17. char* off = "OFF";

  18. char* statusLabel1;
  19. char* buttonLabel1;

  20. char* statusLabel2;
  21. char* buttonLabel2;

  22. char* statusLabel3;
  23. char* buttonLabel3;

  24. char* statusLabel4;
  25. char* buttonLabel4;

  26. void setup () {
  27.   
  28.   Serial.begin(9600);
  29.   Serial.println("WebLed Demo");

  30.   if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
  31.     Serial.println( "Failed to access Ethernet controller");
  32. else
  33.    Serial.println("Ethernet controller initialized");

  34.   if (!ether.staticSetup(myip))
  35.     Serial.println("Failed to set IP address");

  36.   Serial.println();

  37.   pinMode(ledPin1, OUTPUT);
  38.   digitalWrite(ledPin1, LOW);
  39.   
  40.   pinMode(ledPin2, OUTPUT);
  41.   digitalWrite(ledPin2, LOW);
  42.   
  43.   pinMode(ledPin3, OUTPUT);
  44.   digitalWrite(ledPin3, LOW);
  45.   
  46.   pinMode(ledPin4, OUTPUT);
  47.   digitalWrite(ledPin4, LOW);
  48.   
  49.   ledStatus1 = false;
  50.   ledStatus2 = false;
  51.   ledStatus3 = false;
  52.   ledStatus4 = false;
  53. }

  54. void loop() {
  55.   
  56.   word len = ether.packetReceive();
  57.   word pos = ether.packetLoop(len);
  58.   
  59.   doLed1(pos);
  60.   doLed2(pos);
  61.   doLed3(pos);
  62.   doLed4(pos);
  63.   
  64.     BufferFiller bfill = ether.tcpOffset();
  65.     bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
  66.       "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
  67.       "<html><head><title>WebLed_Demo_中文</title><meta http-equiv="refresh" content="5" charset="utf-8">"
  68.   "</head>"
  69.       "<body><h1>"
  70.       "LED_01 Status: $S "
  71.       "<a href="/?status1=$S"><input type="button" value="$S"></a>"
  72.       "<br><br>"

  73.       "LED_02 Status: $S "
  74.       "<a href="/?status2=$S"><input type="button" value="$S"></a>"
  75.       "<br><br>"

  76.       "LED_03 Status: $S "
  77.       "<a href="/?status3=$S"><input type="button" value="$S"></a>"
  78.       "<br><br>"

  79.       "LED_04 Status: $S "
  80.       "<a href="/?status4=$S"><input type="button" value="$S"></a>"
  81.       "<br><br>"
  82.       
  83.       "Test_V1.0_2015_04_24_中文"

  84.       "<h1></body></html>\r\n\r\n"
  85.       
  86.    ), statusLabel1, buttonLabel1, buttonLabel1,
  87.       statusLabel2, buttonLabel2, buttonLabel2,
  88.       statusLabel3, buttonLabel3, buttonLabel3,
  89.       statusLabel4, buttonLabel4, buttonLabel4
  90.       );
  91.     ether.httpServerReply(bfill.position());
  92. }

  93. void doLed1( word pos) {
  94.    if(pos) {
  95.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status1=ON") != 0) {
  96.       ledStatus1 = true;
  97.     }

  98.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status1=OFF") != 0) {
  99.       ledStatus1 = false;
  100.     }

  101.     if(ledStatus1) {
  102.       digitalWrite(ledPin1, HIGH);
  103.       statusLabel1 = on;
  104.       buttonLabel1 = off;
  105.     } else {
  106.       digitalWrite(ledPin1, LOW);
  107.       statusLabel1 = off;
  108.       buttonLabel1 = on;
  109.     }// if(..else..
  110.    }// if(pos
  111. } // doLed(
  112. ///////////////////////////
  113. void doLed2(word pos ) {
  114.    if(pos) {
  115.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status2=ON") != 0) {
  116.       ledStatus2 = true;
  117.     }

  118.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status2=OFF") != 0) {
  119.       ledStatus2 = false;
  120.     }

  121.     if(ledStatus2) {
  122.       digitalWrite(ledPin2, HIGH);
  123.       statusLabel2 = on;
  124.       buttonLabel2 = off;
  125.     } else {
  126.       digitalWrite(ledPin2, LOW);
  127.       statusLabel2 = off;
  128.       buttonLabel2 = on;
  129.     }
  130.    }// if(pos
  131. } // doLed2(
  132. void doLed3(word pos ) {
  133.    if(pos) {
  134.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status3=ON") != 0) {
  135.       ledStatus3 = true;
  136.     }

  137.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status3=OFF") != 0) {
  138.       ledStatus3 = false;
  139.     }

  140.     if(ledStatus3) {
  141.       digitalWrite(ledPin3, HIGH);
  142.       statusLabel3 = on;
  143.       buttonLabel3 = off;
  144.     } else {
  145.       digitalWrite(ledPin3, LOW);
  146.       statusLabel3 = off;
  147.       buttonLabel3 = on;
  148.     }
  149.    } // if(pos
  150. } // doLed3(
  151. void doLed4(word pos ) {
  152.    if(pos) {
  153.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
  154.       ledStatus4 = true;
  155.     }

  156.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
  157.       ledStatus4 = false;
  158.     }

  159.     if(ledStatus4) {
  160.       digitalWrite(ledPin4, HIGH);
  161.       statusLabel4 = on;
  162.       buttonLabel4 = off;
  163.     } else {
  164.       digitalWrite(ledPin4, LOW);
  165.       statusLabel4 = off;
  166.       buttonLabel4 = on;
  167.     }
  168.    }// if(pos
  169. }// doLed4(
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-4-10 13:05:33 | 显示全部楼层
如果只是固定的两组数据,就再声明一个数组
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-10 13:18:52 | 显示全部楼层
wolf-lee 发表于 2015-4-10 13:05
如果只是固定的两组数据,就再声明一个数组

unsigned char hexdata[8] 这部分是一样的,只是里面的代码不一样而已,怎么办呢
回复 支持 反对

使用道具 举报

发表于 2015-4-10 22:15:43 | 显示全部楼层
不太清楚你的意图
可以使用二维数组
回复 支持 反对

使用道具 举报

发表于 2015-4-10 23:06:37 | 显示全部楼层



unsigned char hexdata[ ] = {  0x40,0x07,0x00 };


unsigned char gg[ ] = { 65, 66, 67 }; // 'A', 'B', 'C'

unsigned char yy[ ] = { 97, 0x31, 0x33, 0x35, 0, 0, 0x0D}; // 'a', '1', '3', '5', ..

//...

Serial.write(hexdata, sizeof(hexdata) );

Serial.write(gg, 3 );

Serial.write(yy, sizeof(yy) );


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-10 23:32:52 | 显示全部楼层
tsaiwn 发表于 2015-4-10 23:06
unsigned char hexdata[ ] = {  0x40,0x07,0x00 };

不好意思,这些什么意思,不是很明白
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-10 23:33:55 | 显示全部楼层
tsaiwn 发表于 2015-4-10 23:06
unsigned char hexdata[ ] = {  0x40,0x07,0x00 };

对了,一定是 8个的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-10 23:44:01 | 显示全部楼层
tsaiwn 发表于 2015-4-10 23:06
unsigned char hexdata[ ] = {  0x40,0x07,0x00 };

这样不行的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-10 23:55:08 | 显示全部楼层
tsaiwn 发表于 2015-4-10 23:06
unsigned char hexdata[ ] = {  0x40,0x07,0x00 };

我修改了一下,虽然可以上传成功,但是我要的一定要全部是 hexdata 16位数据
回复 支持 反对

使用道具 举报

发表于 2015-4-11 00:12:24 | 显示全部楼层
布列松 发表于 2015-4-10 23:44
这样不行的



奇怪
你爱写几个就几个
你写八百个计算机也不会说不行 !
我只是告诉你
可以不必去数
用 sizeof( arraay_name ) 叫计算机自己帮你数即可

回复 支持 反对

使用道具 举报

发表于 2015-4-11 00:13:22 | 显示全部楼层
布列松 发表于 2015-4-10 23:33
对了,一定是 8个的

要八个你就自己写八个就是了

奇怪
你爱写几个就几个
你写八百个计算机也不会说不行 !
我只是告诉你
可以不必去数
用 sizeof( arraay_name ) 叫计算机自己帮你数即可


回复 支持 反对

使用道具 举报

发表于 2015-4-11 00:16:44 | 显示全部楼层
布列松 发表于 2015-4-10 23:55
我修改了一下,虽然可以上传成功,但是我要的一定要全部是 hexdata 16位数据


要 hex 你就自己写 0x??
反正对计算机来说
以下三个完全一样:


unsigned gg[ ] = {'A', 'B', 'C' };

unsigned gg[ ] = {65, 0x42, 'C' };

unsigned gg[ ] = {0x41, 66, 'C' };


回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-11 01:27:55 | 显示全部楼层
本帖最后由 布列松 于 2015-4-11 01:29 编辑
tsaiwn 发表于 2015-4-11 00:16
要 hex 你就自己写 0x??
反正对计算机来说
以下三个完全一样:



这就是我现在的代码,第一段的:

unsigned char hexdata[8] = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};

实现起来有效的,

但第二段:

unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0xFF};

是无效的。



  1. #include <EtherCard.h>

  2. static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
  3. static byte myip[] = {192,168,1,180};
  4. byte Ethernet::buffer[700];

  5. const int ledPin = 3;
  6. boolean ledStatus;

  7. char* on = "ON";
  8. char* off = "OFF";
  9. char* statusLabel;
  10. char* buttonLabel;
  11. unsigned char hexdata[8] = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
  12. unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0xFF};

  13. void setup () {

  14.   Serial.begin(9600);
  15.   Serial.println("WebLed Demo");

  16.   if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
  17.     Serial.println( "Failed to access Ethernet controller");
  18. else
  19.    Serial.println("Ethernet controller initialized");

  20.   if (!ether.staticSetup(myip))
  21.     Serial.println("Failed to set IP address");

  22.   Serial.println();
  23.   
  24.   pinMode(ledPin, OUTPUT);
  25.   digitalWrite(ledPin, LOW);
  26.   ledStatus = false;
  27. }
  28.   
  29. void loop() {

  30.   word len = ether.packetReceive();
  31.   word pos = ether.packetLoop(len);
  32.   
  33.   if(pos) {
  34.    
  35.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
  36.       Serial.write(hexdata, 8);
  37.       ledStatus = true;
  38.     }

  39.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
  40.       Serial.write(yy,  sizeof( yy ));
  41.       ledStatus = false;
  42.     }
  43.    
  44.     if(ledStatus) {
  45.       digitalWrite(ledPin, HIGH);
  46.       statusLabel = on;
  47.       buttonLabel = off;
  48.     } else {
  49.       digitalWrite(ledPin, LOW);
  50.       statusLabel = off;
  51.       buttonLabel = on;
  52.     }
  53.       
  54.     BufferFiller bfill = ether.tcpOffset();
  55.     bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
  56.       "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
  57.       "<html><head><title>WebLed</title></head>"
  58.       "<body>LED Status: $S "
  59.       "<a href="/?status=$S"><input type="button" value="$S"></a>"
  60.       "</body></html>"      
  61.       ), statusLabel, buttonLabel, buttonLabel);
  62.     ether.httpServerReply(bfill.position());
  63.   }
  64. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-4-11 02:17:05 | 显示全部楼层
布列松 发表于 2015-4-11 01:27
这就是我现在的代码,第一段的:

unsigned char hexdata[8] = {0x01,0x05,0x00,0x10,0xFF,0x00,0x ...


第一段改:

unsigned char hexdata[] = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};

//...

用  Serial.write(hexdata, sizeof(hexdata) );
实现起来也是有效 !!


第二段无效是別的原因 !

回复 支持 反对

使用道具 举报

发表于 2015-4-11 08:51:22 | 显示全部楼层
布列松 发表于 2015-4-11 01:27
这就是我现在的代码,第一段的:

unsigned char hexdata[8] = {0x01,0x05,0x00,0x10,0xFF,0x00,0x ...




问题出在你送出给另一端的 HTTP 回应漏掉了最后的\r\n\r\n

试这:




  1. #include <EtherCard.h>

  2. static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
  3. static byte myip[] = {192,168,1,180};
  4. byte Ethernet::buffer[700];

  5. const int ledPin = 3;
  6. boolean ledStatus;

  7. char* on = "ON";
  8. char* off = "OFF";
  9. char* statusLabel;
  10. char* buttonLabel;
  11. unsigned char hexdata[8] = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
  12. unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0xFF};

  13. void setup () {

  14.   Serial.begin(9600);
  15.   Serial.println("WebLed Demo");

  16.   if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
  17.     Serial.println( "Failed to access Ethernet controller");
  18. else
  19.    Serial.println("Ethernet controller initialized");

  20.   if (!ether.staticSetup(myip))
  21.     Serial.println("Failed to set IP address");

  22.   Serial.println();

  23.   pinMode(ledPin, OUTPUT);
  24.   digitalWrite(ledPin, LOW);
  25.   ledStatus = false;
  26. }

  27. void loop() {

  28.   word len = ether.packetReceive();
  29.   word pos = ether.packetLoop(len);

  30.   if(pos) {

  31.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
  32.       Serial.write(hexdata, 8);
  33.       ledStatus = true;
  34.     }

  35.     if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
  36.       Serial.write(yy,  sizeof( yy ));
  37.       ledStatus = false;
  38.     }

  39.     if(ledStatus) {
  40.       digitalWrite(ledPin, HIGH);
  41.       statusLabel = on;
  42.       buttonLabel = off;
  43.     } else {
  44.       digitalWrite(ledPin, LOW);
  45.       statusLabel = off;
  46.       buttonLabel = on;
  47.     }

  48.     BufferFiller bfill = ether.tcpOffset();
  49.     bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
  50.       "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
  51.       "<html><head><title>WebLed</title></head>"
  52.       "<body>LED Status: $S "
  53.       "<a href="/?status=$S"><input type="button" value="$S"></a>"
  54.       "</body></html>\r\n\r\n"      
  55.       ), statusLabel, buttonLabel, buttonLabel);
  56.     ether.httpServerReply(bfill.position());
  57.   }
  58. }

复制代码



只改了最后的 \r\n\r\n
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 03:30 , Processed in 0.076173 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表