在 Arduino 的 udp 通信期间无意中添加到数据包中的奇怪字符
Unintentional strange characters added to packets during udp communication in Arduino
计算器!
Arduino udp通信时,数据包中添加了异常的奇怪字符。
你好。堆栈溢出。我在使用 Udp 和 Arduino 时遇到了无法解决的问题。我查阅了很多资料来解决这个问题。我还测试了各种情况。但是我解决不了。
问题从数据包的第24个字节开始出现。超过 23 个字符的字符被转换为奇怪的字符,并且不输出后面的句子。 udp通信的包传输是否限制为24字节?如果是这样,我很高兴,但我想知道如何解决它。请帮助我。
测试环境如下。两个 Arduino 通过 LAN 电缆连接。另外,以下源代码已经上传到Arduino。串口监控如下
TX 串行监视器
。
.
17:46:31.521 -> 正在发送 UDP 消息
17:46:32.516 -> 正在发送 UDP 消息
17:46:33.514 -> 正在发送 UDP 消息
17:46:34.519 -> 正在发送 UDP 消息
17:46:35.515 -> 正在发送 UDP 消息
17:46:36.510 -> 正在发送 UDP 消息
RX 串行监视器
17:38:51.664 -> 010010010101001010101001K;⸮ <--------问题
17:38:52.662 -> 收到大小为 31 的数据包
17:38:52.662 -> 来自 192.168.1.251,端口 5678
17:38:52.662 -> 内容:
17:38:52.662 -> 01001001010100101010100j⸮ <------ 问题
17:38:53.663 -> 收到大小为 31 的数据包
17:38:53.663 -> 来自 192.168.1.251,端口 5678
17:38:53.663 -> 内容:
17:38:53.663 -> 010010010101001010101001;6 <------------问题
17:38:56.770 -> 收到大小为 31 的数据包
------------源代码------------
///////////TX
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#define MSG_INTERVAL 1000
// network parameters
byte mac[] = {
0x90, 0xA2, 0xDA, 0x0E, 0x05, 0x04}; // ethernet interface MAC address
IPAddress localIp(192, 168, 1, 251); // local ip address
IPAddress destIp(192, 168, 1, 15); // destination ip address
unsigned int port = 5678; // destination port
// EthernetUDP to send and receive messages.
EthernetUDP Udp;
// message string
char message[] = "0100100101010010101010010101010";
// timing
//unsigned long previousLedMillis;
//unsigned long ledInterval;
unsigned long previousSendMillis;
unsigned long sendInterval;
// setup the arduino and shields
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start ethernet and udp
Ethernet.begin(mac,localIp); // static ip version
// open UDP port
Udp.begin(port);
// show the local ip address (useful for dhcp)
Serial.print("Local IP: ");
Serial.println(Ethernet.localIP());
// initialize send interval
sendInterval = MSG_INTERVAL;
}
// do tasks
void loop() {
// check if udp string has to be sent
if(millis() - previousSendMillis >= sendInterval) {
sendMessage();
}
}
// send udp string
void sendMessage() {
Serial.println("Sending UDP message");
// store current millis
previousSendMillis = millis();
// send udp message
Udp.beginPacket(destIp, port);
Udp.write(message);
Udp.endPacket();
}
/////RX
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 15);
IPAddress remIp(92, 168, 1, 176);
unsigned int localPort = 5678; // local port to listen on
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
void setup()
{
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);
pinMode(5, OUTPUT);
Serial.begin(115200);
Serial.print("Local IP: ");
Serial.println(Ethernet.localIP());
}
void loop()
{
int packetSize = Udp.parsePacket();
if(packetSize)
{
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i =0; i < 4; i++)
{
Serial.print(remote[i], DEC);
if (i < 3)
{
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
//Udp.read(packetBuffer,1024);
Serial.println("Contents:");
Serial.println(packetBuffer);
//for (int i=0;i<packetSize;i++){
// Serial.print(packetBuffer[i]);
//}
//Serial.print('\n');
}
}
是的,你没看错,长度 24 有问题!!
如果您阅读 EthernetUDP.h 文件,您将看到:
#define UDP_TX_PACKET_MAX_SIZE 24
所以如果你想使用更多的字符,不要使用这个常量,选择你个人的大小。
改变
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
至
char packetBuffer[50];
或使用另一个定义:
#define UDP_MAX_BUFFER 50 //for example
char packetBuffer[UDP_MAX_BUFFER];
计算器!
Arduino udp通信时,数据包中添加了异常的奇怪字符。
你好。堆栈溢出。我在使用 Udp 和 Arduino 时遇到了无法解决的问题。我查阅了很多资料来解决这个问题。我还测试了各种情况。但是我解决不了。
问题从数据包的第24个字节开始出现。超过 23 个字符的字符被转换为奇怪的字符,并且不输出后面的句子。 udp通信的包传输是否限制为24字节?如果是这样,我很高兴,但我想知道如何解决它。请帮助我。
测试环境如下。两个 Arduino 通过 LAN 电缆连接。另外,以下源代码已经上传到Arduino。串口监控如下
TX 串行监视器
。 . 17:46:31.521 -> 正在发送 UDP 消息
17:46:32.516 -> 正在发送 UDP 消息
17:46:33.514 -> 正在发送 UDP 消息
17:46:34.519 -> 正在发送 UDP 消息
17:46:35.515 -> 正在发送 UDP 消息
17:46:36.510 -> 正在发送 UDP 消息
RX 串行监视器
17:38:51.664 -> 010010010101001010101001K;⸮ <--------问题
17:38:52.662 -> 收到大小为 31 的数据包
17:38:52.662 -> 来自 192.168.1.251,端口 5678
17:38:52.662 -> 内容:
17:38:52.662 -> 01001001010100101010100j⸮ <------ 问题
17:38:53.663 -> 收到大小为 31 的数据包
17:38:53.663 -> 来自 192.168.1.251,端口 5678
17:38:53.663 -> 内容:
17:38:53.663 -> 010010010101001010101001;6 <------------问题
17:38:56.770 -> 收到大小为 31 的数据包
------------源代码------------
///////////TX
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#define MSG_INTERVAL 1000
// network parameters
byte mac[] = {
0x90, 0xA2, 0xDA, 0x0E, 0x05, 0x04}; // ethernet interface MAC address
IPAddress localIp(192, 168, 1, 251); // local ip address
IPAddress destIp(192, 168, 1, 15); // destination ip address
unsigned int port = 5678; // destination port
// EthernetUDP to send and receive messages.
EthernetUDP Udp;
// message string
char message[] = "0100100101010010101010010101010";
// timing
//unsigned long previousLedMillis;
//unsigned long ledInterval;
unsigned long previousSendMillis;
unsigned long sendInterval;
// setup the arduino and shields
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start ethernet and udp
Ethernet.begin(mac,localIp); // static ip version
// open UDP port
Udp.begin(port);
// show the local ip address (useful for dhcp)
Serial.print("Local IP: ");
Serial.println(Ethernet.localIP());
// initialize send interval
sendInterval = MSG_INTERVAL;
}
// do tasks
void loop() {
// check if udp string has to be sent
if(millis() - previousSendMillis >= sendInterval) {
sendMessage();
}
}
// send udp string
void sendMessage() {
Serial.println("Sending UDP message");
// store current millis
previousSendMillis = millis();
// send udp message
Udp.beginPacket(destIp, port);
Udp.write(message);
Udp.endPacket();
}
/////RX
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 15);
IPAddress remIp(92, 168, 1, 176);
unsigned int localPort = 5678; // local port to listen on
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
void setup()
{
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);
pinMode(5, OUTPUT);
Serial.begin(115200);
Serial.print("Local IP: ");
Serial.println(Ethernet.localIP());
}
void loop()
{
int packetSize = Udp.parsePacket();
if(packetSize)
{
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i =0; i < 4; i++)
{
Serial.print(remote[i], DEC);
if (i < 3)
{
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
//Udp.read(packetBuffer,1024);
Serial.println("Contents:");
Serial.println(packetBuffer);
//for (int i=0;i<packetSize;i++){
// Serial.print(packetBuffer[i]);
//}
//Serial.print('\n');
}
}
是的,你没看错,长度 24 有问题!!
如果您阅读 EthernetUDP.h 文件,您将看到:
#define UDP_TX_PACKET_MAX_SIZE 24
所以如果你想使用更多的字符,不要使用这个常量,选择你个人的大小。
改变
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
至
char packetBuffer[50];
或使用另一个定义:
#define UDP_MAX_BUFFER 50 //for example
char packetBuffer[UDP_MAX_BUFFER];