mhtt 发表于 2014-11-24 11:03:55

串口发送自定义协议问题

我想让arduino之间串口按照我自己定义的协议进行通讯。
协议格式如下:

内容 包头 长度 数据校验
长度(字节) 4 2 X 2

包头为4个0x01,长度为数据的长度,整个协议内容的长度不超过128个字节。
举个例子,现在包头是0x01010101,长度是0x000B,数据是0x49 20 4C 4F 56 45 20 59 4F 55 21,校验是0x3934。
我想到的方案和遇到的问题如下:
1、用String,分别定义4个char数组,然后放到String中。
char a;
char b;
for(int i=0;i<4;i++)
{
    a = 0x01;
}
b = 0x00;
b = 0x0B;
char c[]="I LOVE YOU!";
char d;
d = 0x39;
d = 0x34;
String e = String(a)+String(b)+String(c)+String(d);
Serial.print(e);

问题:输出:01 01 01 01 3E 05 1B 49 20 4C 4F 56 45 20 59 4F 55 21 39 34 01 01 01 01 3E 05 1B
好奇怪,3E 05 1B


2、定义一个char a。
问题:Serial.print(a);时,输出到0x00就结束了,如上例就输出01 01 01 01就没有了。


除了上面两种方法,还有没有更好的方法完成协议的发送,请各位多多指教!

fenggr 发表于 2014-11-24 12:11:23

串口发送数据其实是发送ascII码,ascII码0-31是控制符,如果你不明白这些控制符的作用那么发送了这些控制符会有什么结果就无法预测了。就像你用char a来保存数据包,而a的值为0x00,0x00是字符终止符,就是说字符到此结束,所以Serial.print(a)就只发送了前面4个0x01。

Super169 发表于 2014-11-24 17:17:43

本帖最后由 Super169 于 2014-11-24 17:42 编辑

除非是給人看的東西, 盡量不要用 Serial.print, 用 Serial.write 會比較好.

String 中 0x00 是終結用的, 所以你不能在 String 中包含 0x00.
因為 a 及 d 均沒有終結的 0x00, 系統會一直列印, 直到碰到 0x00 才停下來.

看到你這樣認真的設計通訊協定, 多給你一點提示吧.

輸出的部份用 String 及 Serial.print 會有問題, 不太好


String e = String(a)+String(b)+String(c)+String(d);
Serial.print(e);

把它們改成這樣就可以了:


Serial.write((uint8_t*) a,4);
Serial.write((uint8_t*) b,2);
Serial.write((uint8_t*) c,11);
Serial.write((uint8_t*) d,2);

將來看 code 也方便, 知道每一部份的長度, 總比 String 好得多.

maxims 发表于 2014-11-24 23:35:56

Super169 发表于 2014-11-24 17:17 static/image/common/back.gif
除非是給人看的東西, 盡量不要用 Serial.print, 用 Serial.write 會比較好.

String 中 0x00 是終結用的 ...

受教了,谢谢~~
页: [1]
查看完整版本: 串口发送自定义协议问题