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 static/image/common/back.gif
如果只是固定的两组数据,就再声明一个数组
unsigned char hexdata 这部分是一样的,只是里面的代码不一样而已,怎么办呢 不太清楚你的意图
可以使用二维数组
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) );
tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };
不好意思,这些什么意思,不是很明白 tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };
对了,一定是 8个的 tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };
这样不行的 tsaiwn 发表于 2015-4-10 23:06 static/image/common/back.gif
unsigned char hexdata[ ] = {0x40,0x07,0x00 };
我修改了一下,虽然可以上传成功,但是我要的一定要全部是 hexdata 16位数据 布列松 发表于 2015-4-10 23:44 static/image/common/back.gif
这样不行的
奇怪
你爱写几个就几个
你写八百个计算机也不会说不行 !
我只是告诉你
可以不必去数
用 sizeof( arraay_name ) 叫计算机自己帮你数即可
布列松 发表于 2015-4-10 23:33 static/image/common/back.gif
对了,一定是 8个的
要八个你就自己写八个就是了
奇怪
你爱写几个就几个
你写八百个计算机也不会说不行 !
我只是告诉你
可以不必去数
用 sizeof( arraay_name ) 叫计算机自己帮你数即可
布列松 发表于 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: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());
}
}
布列松 发表于 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) );
实现起来也是有效 !!
第二段无效是別的原因 !
布列松 发表于 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