热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ArduinoMKRwifi1010从wifi读取错误消息

我想创建一个LED灯条,可以从PC上控制Wifi。要获取数据,我使用ArduinoMKRwifi1010。当我从PC向

我想创建一个LED灯条,可以从PC上控制Wifi。要获取数据,我使用Arduino MKR wifi1010。当我从PC向Arduino发送消息时,它只读取了前2个字节/字符。

首先,LED灯条的最后几个LED会以随机的颜色发光,但是我可以通过从计算机发送比所需更多的字节来解决此问题。如果每个LED均为白色,则该指示灯有效。同样,第一个LED可以发红光。其他所有东西都不起作用。

其原因不是LED灯带,因为我可以从Arduino正常控制LED灯带。问题是我的PC和Arduino之间的传输。

这是Arduino的代码。

#include
#include
#include
#include "FastLED.h"
#define NUM_LEDS 300
#define DATA_PIN 5
CRGB leds[NUM_LEDS];
//#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = "WifiSSID"; // your network SSID (name)
char pass[] = "WifiPassword"; // your network password (use for WPA,or use as key for WEP)
int status = WL_IDLE_STATUS; // the Wifi radio's status
int LED_Num = 300;
WiFiServer server(56393);
void setup() {
Serial.begin(9600); // initialize serial communication
FastLED.addLeds(leds,NUM_LEDS);
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareversion();
if (fv Serial.println("Please upgrade the firmware");
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid); // print the network name (SSID);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid,pass);
// wait 10 seconds for connection:
delay(10000);
}
server.begin(); // start the web server on port 80
printWifiStatus(); // you're connected now,so print out the status
}
char str[4];
void loop() {
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,Serial.println("new client"); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
int NoData = 0;
while (client.connected()) { // loop while the client's connected
if (client.available() ) { // if there's bytes to read from the client,NoData = 0;
char c = client.read(); // read a byte,then
currentLine += c; // add it to the end of the currentLine
} else {
NoData++;
if (NoData > 1000) {
char message[currentLine.length()];
currentLine.toCharArray(message,currentLine.length());
if (message[0] == (char)0) {
Serial.println("init");
byte high = highByte(LED_Num);
byte low = lowByte(LED_Num);
byte intBytes[] = {low,high};
client.print(byteArrayToString(intBytes));
break;
} else if (message[0] == (char)1) {
if (sizeof(message) >= NUM_LEDS * 3 + 1) {
Serial.println("set");
char data[sizeof(message) - 1];
RemoveFirstElement(message,data);
for (int i = 0; i leds[i] = CRGB((int)data[i * 3 + 0],(int)data[i * 3 + 1],(int)data[i * 3 + 2]);
}
byte ToReturn[1];
client.print(byteArrayToString(ToReturn));
FastLED.show();
break;
}
} else if (message[0] == (char)2) {
Serial.println("get");
break;
}
}
}
}
// close the connection:
client.stop();
Serial.println("client disonnected");
Serial.println("---------------");
}
}
String byteArrayToString(byte * bytes) {
return String((char *)bytes);
}
void RemoveFirstElement(char* bytes,char* newBytes) {
for (int i = 0; i newBytes[i] = bytes[i + 1];
}
bytes = newBytes;
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
Serial.println(ip);
}

我在C#中创建了一个库,用于从我的计算机控制LED,库的代码为:

public class Device {
public Color[] LEDs = null;
string host = "";
int port;
public Device( string host,int port ) {
this.host = host;
this.port = port;
}
public void init( ) {
byte[] SendData = new byte[1];
SendData[0] = 0;
byte[] GetData = Send( SendData );
LEDs = new Color[BitConverter.ToInt32( GetData,0 )];
}
public void set( ) {
byte[] SendData = new byte[1];
SendData[0] = 1;
SendData = concat( SendData,ColorArrayToByteArray( LEDs ) );
SendData = concat( SendData,new byte[500] );
Send( SendData );
}
public void get( ) {
byte[] SendData = new byte[1];
SendData[0] = 2;
byte[] GetData = Send( SendData );
LEDs = ByteArrayToColorArray( GetData );
}
byte[] Send( byte[] data ) {
TcpClient client = new TcpClient( host,port );
NetworkStream stream = client.GetStream( );
stream.Write( data,data.Length );
if ( data[0] == 0 )
data = new byte[4];
else if ( data[0] == 1 )
data = new byte[1];
else if ( data[0] == 2 )
data = new byte[LEDs.Length * 3];
Int32 bytes = stream.Read( data,data.Length );
return data;
}
byte[] ColorArrayToByteArray( Color[] colors ) {
byte[] bytes = new byte[colors.Length * 3];
for ( int i = 0; i bytes[i * 3 + 0] = (byte) colors[i].R;
bytes[i * 3 + 1] = (byte) colors[i].G;
bytes[i * 3 + 2] = (byte) colors[i].B;
}
return bytes;
}
Color[] ByteArrayToColorArray( byte[] bytes ) {
Color[] colors = new Color[bytes.Length / 3];
for ( int i = 0; i int R = bytes[i + 0];
int G = bytes[i + 0];
int B = bytes[i + 0];
colors[i / 3] = Color.FromArgb( R,G,B );
}
return colors;
}
public static byte[] concat( byte[] x,byte[] y ) {
if ( x == null )
throw new ArgumentNullException( "x" );
if ( y == null )
throw new ArgumentNullException( "y" );
int oldLen = x.Length;
Array.Resize( ref x,x.Length + y.Length );
Array.Copy( y,x,oldLen,y.Length );
return x;
}
}

在此示例中,只有第一个LED闪烁红色:

Device d = new Device( "192.168.178.53",56393 );
d.init( );
for ( int i = 0; i d.LEDs[i] = Color.Red;
}
d.set( );





推荐阅读
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
author-avatar
书友32368660
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有