我目前正在做一个更大的 LEDCube 项目,其中的一个组成部分是让它通过 UDP 进行通信,这样它的颜色就可以即时设置。为此,我制作了以下命令的 UDP 数据包布局:
模式:# 重置 数据:十六进制
我面临的问题是数据命令在它真正应该什么都不画的时候画出乱码。传递 00 00 00 结果是彩色立方体,而不是黑色。
UDP解码的代码片段如下。
void processUDPPacket(){
int packetSize = Udp.parsePacket();
if (packetSize) {
if(DEBUG){
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remoteIp = Udp.remoteIP();
Serial.print(remoteIp);
Serial.print(", port ");
Serial.println(Udp.remotePort());
}
// read the packet into packetBufffer
int len = Udp.read(packetBuffer, 255);
if (len > 0) {
packetBuffer[len] = 0;
}
if(DEBUG){
Serial.println("Contents:");
Serial.println(packetBuffer);
for(int i = 0; i< 255; i++){
Serial.print((int)packetBuffer[i],HEX);
}
Serial.println();
}
char *command = strtok(packetBuffer,":"); //pointer to array containing command word
char *payload = strtok(NULL,":"); //pointer to array containing payload
if(strcmp(command,"mode")==0){
mode = atoi(payload); //char array to int
modeSelect();
}
if(mode == MODE_UDP){
//command is reset, reset
if(strcmp(command,"reset")==0){
reset();
}
else if(strcmp(command,"data")==0){
for(int i = 0; i< NUM_LEDs; i++){
int r = payload[3*i + 0];
int g = payload[3*i + 1];
int b = payload[3*i + 2];
rCurr[i] = map(r, 0,255, 0, MAX_BRIGHTNESS);
gCurr[i] = map(g, 0,255, 0, MAX_BRIGHTNESS);
bCurr[i] = map(b, 0,255, 0, MAX_BRIGHTNESS);
if(DEBUG){
Serial.print(r);
Serial.print(",");
Serial.print(g);
Serial.print(",");
Serial.println(b);
}
}
}
}
// 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();
}
}
Writeback 工作正常,但那只是字符串。