极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11933|回复: 3

串口发送自定义协议问题

[复制链接]
发表于 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中。
  1. char a[4];
  2.   char b[2];
  3.   for(int i=0;i<4;i++)
  4.   {
  5.     a[i] = 0x01;
  6.   }
  7.   b[0] = 0x00;
  8.   b[1] = 0x0B;
  9.   char c[]="I LOVE YOU!";
  10.   char d[2];
  11.   d[0] = 0x39;
  12.   d[1] = 0x34;
  13.   String e = String(a)+String(b)+String(c)+String(d);
  14. 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[128]。
问题:Serial.print(a);时,输出到0x00就结束了,如上例就输出01 01 01 01就没有了。


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

使用道具 举报

发表于 2014-11-24 12:11:23 | 显示全部楼层
串口发送数据其实是发送ascII码,ascII码0-31是控制符,如果你不明白这些控制符的作用那么发送了这些控制符会有什么结果就无法预测了。就像你用char a[128]来保存数据包,而a[4]的值为0x00,0x00是字符终止符,就是说字符到此结束,所以Serial.print(a)就只发送了前面4个0x01。
回复 支持 反对

使用道具 举报

发表于 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 會有問題, 不太好


  1. String e = String(a)+String(b)+String(c)+String(d);
  2. Serial.print(e);
复制代码


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

  1.   
  2. Serial.write((uint8_t*) a,4);
  3. Serial.write((uint8_t*) b,2);
  4. Serial.write((uint8_t*) c,11);
  5. Serial.write((uint8_t*) d,2);
复制代码


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

回复 支持 反对

使用道具 举报

发表于 2014-11-24 23:35:56 | 显示全部楼层
Super169 发表于 2014-11-24 17:17
除非是給人看的東西, 盡量不要用 Serial.print, 用 Serial.write 會比較好.

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

受教了,谢谢~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 23:05 , Processed in 0.034694 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表