我在尝试将一个元素添加到Arduino应用程序发送的响应流中以回复AJAX请求时遇到了一个主要问题。我有一条消息成功通过,但当我添加一个额外的组件时,消息不会被读取。通过使用Wireshark监控以太网流量,我确定附加元素没有完全终止。
我使用的代码是:
prcomp
在Wireshark中,成功传输的元素使用HTTP协议显示,每个包的结构为一个元素,每个包按预期终止于“\ r \ n”。:
如果启用可疑代码,则HTML标头为:
带有相关文字的邮件部分是:
如您所见,结束“>”并且终止“\ r \ n”未被传输。我已经通过剪切和粘贴成功的元素然后进行适当的编辑来生成插入的元素,并且还尝试了void SendTags(EthernetClient cl) {
String value; // stores value read from analog onputs
int count; // index for 'for' loops
int str_length;
char msg_chrs[0];
Serial.println("Debug 395 - sending title and tags");
cl.write("<?xml version = \"1.0\" ?>\r\n");
Str = "<app_data>\r\n";
str_length = Str.length()+1;
Str.toCharArray(msg_chrs, str_length);
cl.write(msg_chrs);
Str = "<tags>\r\n";
str_length = Str.length()+1;
Str.toCharArray(msg_chrs, str_length);
cl.write(msg_chrs);
for (count = 0; count < di_count; count++) {
value = di_sig_tag[count];
Str = "<DI_TAG>" + value + "</DI_TAG>\r\n";
str_length = Str.length()+1;
Str.toCharArray(msg_chrs, str_length);
cl.write(msg_chrs);
}
//(similar code sections omitted for simplicity)
Str = "</tags>\r\n";
str_length = Str.length()+1;
Str.toCharArray(msg_chrs, str_length);
cl.write(msg_chrs);
// Str = "<title>\r\n";
// str_length = Str.length()+1;
// Str.toCharArray(msg_chrs, str_length);
// cl.write(msg_chrs);
// Str = "<pr_name>" + pr_name + "</pr_name>\r\n";
// str_length = Str.length()+1;
// Str.toCharArray(msg_chrs, str_length);
// cl.write(msg_chrs);
// Str = "</title>\r\n";
// str_length = Str.length()+1;
// Str.toCharArray(msg_chrs, str_length);
// cl.write(msg_chrs);
Str = "</app_data>\r\n";
str_length = Str.length()+1;
Str.toCharArray(msg_chrs, str_length);
cl.write(msg_chrs);
Serial.println("Debug 462 - End of SendTags()");
}
和String
个变量的多个排列,但都没有成功。但是从Wireshark跟踪中,问题出在Arduino代码和以太网链路之间。
非常感谢任何想法或意见。
答案 0 :(得分:-1)
为了记录,(以及可能感兴趣的任何人),我采用的工作解决方案是:
void SendTags(EthernetClient cl)
{
String value; // stores value read from analog onputs
int count; // index for 'for' loops
int str_length;
char msg_chrs[0];
Serial.println("Debug 395 - sending title and tags");
cl.write("<?xml version = \"1.0\" ?>\r\n");
cl.write("<app_data>\r\n");
cl.write("<tags>\r\n");
for (count = 0; count < di_count; count++)
{
value = di_sig_tag[count];
Str = "<DI_TAG>" + value + "</DI_TAG>\r\n";
ethWrite(Str, cl);
}
for (count = 0; count < do_var_count; count++)
{
value = do_sig_tag[count];
Str = "<DO_TAG>" + value + "</DO_TAG>\r\n";
ethWrite(Str, cl);
}
for (count = 0; count < ai_count; count++)
{
value = ai_sig_tag[count];
Str = "<AI_TAG>" + value + "</AI_TAG>\r\n";
ethWrite(Str, cl);
}
for (count = 0; count < ao_count; count++)
{
value = ao_sig_tag[count];
Str = "<AO_TAG>" + value + "</AO_TAG>\r\n";
ethWrite(Str, cl);
}
cl.write("</tags>\r\n");
cl.write("<title>\r\n");
Str = ("<PR_NAME>" + pr_name + "</PR_NAME>\r\n");
ethWrite(Str, cl);
cl.write("</title>\r\n");
cl.write("</app_data>\r\n");
Serial.println("Debug 462 - End of SendTags()");
}
void ethWrite(String st, EthernetClient cl)
{
int st_length = st.length()+1;
char msg_chrs[st_length];
Str.toCharArray(msg_chrs, st_length);
cl.write(msg_chrs);
}
到目前为止,这正在做我想要的,似乎是合理有效的编码。感谢@ gre-gor的评论 - 让我走上正轨。我的理由是我在javascript(允许扩展数组)和c ++(不支持扩展数组)中同时工作。