布列松 发表于 2015-4-10 10:31:56

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

本帖最后由 布列松 于 2015-5-3 22:29 编辑

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

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





#include <EtherCard.h>

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

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

boolean ledStatus1;
boolean ledStatus2;
boolean ledStatus3;
boolean ledStatus4;

char* on = "ON_";
char* off = "OFF";

char* statusLabel1;
char* buttonLabel1;

char* statusLabel2;
char* buttonLabel2;

char* statusLabel3;
char* buttonLabel3;

char* statusLabel4;
char* buttonLabel4;

void setup () {

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

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

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

Serial.println();

pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, LOW);

pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, LOW);

pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin3, LOW);

pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin4, LOW);

ledStatus1 = false;
ledStatus2 = false;
ledStatus3 = false;
ledStatus4 = false;
}

void loop() {

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

doLed1(pos);
doLed2(pos);
doLed3(pos);
doLed4(pos);

    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed_Demo_中文</title><meta http-equiv=\"refresh\" content=\"5\" charset=\"utf-8\">"
"</head>"
      "<body><h1>"
      "LED_01 Status: $S "
      "<a href=\"/?status1=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED_02 Status: $S "
      "<a href=\"/?status2=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED_03 Status: $S "
      "<a href=\"/?status3=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

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

      "<h1></body></html>\r\n\r\n"
      
   ), statusLabel1, buttonLabel1, buttonLabel1,
      statusLabel2, buttonLabel2, buttonLabel2,
      statusLabel3, buttonLabel3, buttonLabel3,
      statusLabel4, buttonLabel4, buttonLabel4
      );
    ether.httpServerReply(bfill.position());
}

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

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

    if(ledStatus1) {
      digitalWrite(ledPin1, HIGH);
      statusLabel1 = on;
      buttonLabel1 = off;
    } else {
      digitalWrite(ledPin1, LOW);
      statusLabel1 = off;
      buttonLabel1 = on;
    }// if(..else..
   }// if(pos
} // doLed(
///////////////////////////
void doLed2(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status2=ON") != 0) {
      ledStatus2 = true;
    }

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

    if(ledStatus2) {
      digitalWrite(ledPin2, HIGH);
      statusLabel2 = on;
      buttonLabel2 = off;
    } else {
      digitalWrite(ledPin2, LOW);
      statusLabel2 = off;
      buttonLabel2 = on;
    }
   }// if(pos
} // doLed2(
void doLed3(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status3=ON") != 0) {
      ledStatus3 = true;
    }

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

    if(ledStatus3) {
      digitalWrite(ledPin3, HIGH);
      statusLabel3 = on;
      buttonLabel3 = off;
    } else {
      digitalWrite(ledPin3, LOW);
      statusLabel3 = off;
      buttonLabel3 = on;
    }
   } // if(pos
} // doLed3(
void doLed4(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
      ledStatus4 = true;
    }

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

    if(ledStatus4) {
      digitalWrite(ledPin4, HIGH);
      statusLabel4 = on;
      buttonLabel4 = off;
    } else {
      digitalWrite(ledPin4, LOW);
      statusLabel4 = off;
      buttonLabel4 = on;
    }
   }// if(pos
}// doLed4(

wolf-lee 发表于 2015-4-10 13:05:33

如果只是固定的两组数据,就再声明一个数组

布列松 发表于 2015-4-10 13:18:52

wolf-lee 发表于 2015-4-10 13:05 static/image/common/back.gif
如果只是固定的两组数据,就再声明一个数组

unsigned char hexdata 这部分是一样的,只是里面的代码不一样而已,怎么办呢

butOn 发表于 2015-4-10 22:15:43

不太清楚你的意图
可以使用二维数组

tsaiwn 发表于 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 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };




不好意思,这些什么意思,不是很明白

布列松 发表于 2015-4-10 23:33:55

tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };




对了,一定是 8个的

布列松 发表于 2015-4-10 23:44:01

tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };




这样不行的

布列松 发表于 2015-4-10 23:55:08

tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };




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

tsaiwn 发表于 2015-4-11 00:12:24

布列松 发表于 2015-4-10 23:44 static/image/common/back.gif
这样不行的



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

tsaiwn 发表于 2015-4-11 00:13:22

布列松 发表于 2015-4-10 23:33 static/image/common/back.gif
对了,一定是 8个的

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

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


tsaiwn 发表于 2015-4-11 00:16:44

布列松 发表于 2015-4-10 23:55 static/image/common/back.gif
我修改了一下,虽然可以上传成功,但是我要的一定要全部是 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 static/image/common/back.gif
要 hex 你就自己写 0x??
反正对计算机来说
以下三个完全一样:



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

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

实现起来有效的,

但第二段:

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

是无效的。



#include <EtherCard.h>

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

const int ledPin = 3;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;
unsigned char hexdata = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0xFF};

void setup () {

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

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

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

Serial.println();

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
ledStatus = false;
}

void loop() {

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

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

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.write(yy,sizeof( yy ));
      ledStatus = false;
    }
   
    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }
      
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel);
    ether.httpServerReply(bfill.position());
}
}

tsaiwn 发表于 2015-4-11 02:17:05

布列松 发表于 2015-4-11 01:27 static/image/common/back.gif
这就是我现在的代码,第一段的:

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


第一段改:

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

//...

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


第二段无效是別的原因 !

tsaiwn 发表于 2015-4-11 08:51:22

布列松 发表于 2015-4-11 01:27 static/image/common/back.gif
这就是我现在的代码,第一段的:

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




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

试这:




#include <EtherCard.h>

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

const int ledPin = 3;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;
unsigned char hexdata = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0xFF};

void setup () {

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

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

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

Serial.println();

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
ledStatus = false;
}

void loop() {

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

if(pos) {

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

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

    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }

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




只改了最后的 \r\n\r\n
页: [1] 2 3 4
查看完整版本: enc28j60 控制多个 led IO 的代码,模块本身带控制的html页面