极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 68231|回复: 13

如何编写自己的串口通讯协议(高手请自觉忽略)

[复制链接]
发表于 2013-7-20 13:32:34 | 显示全部楼层 |阅读模式
本帖最后由 迷你强 于 2013-8-14 21:05 编辑

最近又混成高级会员了,自感离这个“高级”实在太远,但既然是“高级”了,总要奉献一点,于是写了下文:

我们平时在用到ARDUINO与电脑进行通讯时,不管你用什么方式,说到底都是利用了串口,论坛里充满的就是这些“Serial.Read;Serial.Print;其实用这种方式进行简单通讯时,仍然是不可靠的,此时自己编写一些通讯协议或者按照一些特定通讯协议进行通讯,是我们无论如何都要掌握的!

注:别以为“通讯协议”好象很复杂的样子,说穿了就是一些数据规则,你自己定的规则就是你的通讯协议!

下面以一个例程来做说明:

  1. int incomingByte = 0;          // 接收到的 data byte
  2. String inputString = "";         // 用来储存接收到的内容
  3. boolean newLineReceived = false; // 前一次数据结束标志

  4. void setup() {
  5.   Serial.begin(9600); //设定通讯端口及速率
  6. }


  7. void loop() {

  8.     if (newLineReceived) {
  9.      Serial.print(inputString);  // 这里只是简单的将它打出来了,你可以根据自己的要求来用你接收到的数据......
  10.      inputString = "";   // clear the string
  11.      newLineReceived = false;
  12.      ........//其他你的程序
  13.    
  14.     }
  15. }

  16. //serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊!

  17. void serialEvent()
  18. {
  19.   while (Serial.available()) {   
  20.   
  21.     incomingByte = Serial.read();              //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
  22.     inputString += (char) incomingByte;     // 全双工串口可以不用在下面加延时,半双工则要加的//

  23.      // 下面就是所谓的通讯协议了,如果接收到了换行符号,本例是定义了这次串口通讯数据接收结束//
  24.      // 其他的你还可以加一些规则,比如数据包起始位,规定一个数据包就是以FF为开头的,如果不是就不接收//
  25.      // 也可以加上数据校验位,同样在这里做一个校验判断,如果不符合,则将数据包丢掉,再通过一个标志位写个值,//
  26.      //在主程序里面让发送方重发(主程序里面都写一条IF就行了)//
  27.    
  28.      if (incomingByte == '\n') {
  29.      newLineReceived = true;

  30.     }
  31.   }
  32. }

复制代码
回复

使用道具 举报

发表于 2013-7-20 17:04:29 | 显示全部楼层
事件驱动,效率大大地提高了
回复 支持 反对

使用道具 举报

发表于 2013-7-20 21:02:03 | 显示全部楼层
event函数貌似很好。回头查手册看去。
不知道是不是所有串口事件都触发串口event?还是仅仅接收到了才触发?
回复 支持 反对

使用道具 举报

发表于 2013-8-14 16:20:59 | 显示全部楼层
原来串口是这么个用法,土鳖了。。。。谢高手指点
回复 支持 反对

使用道具 举报

发表于 2013-8-14 20:54:47 | 显示全部楼层
这个很精彩,学习了一定要顶
回复 支持 反对

使用道具 举报

发表于 2013-9-14 21:24:18 | 显示全部楼层
非常精彩,原来的用法都是土鳖!
回复 支持 反对

使用道具 举报

发表于 2013-9-14 22:35:18 | 显示全部楼层
不错, 反正我是不知道还可以这么用
回复 支持 反对

使用道具 举报

发表于 2013-9-14 22:39:04 | 显示全部楼层
对了, 读取一行感觉不用那么麻烦, 用 readBytesUntil 比较好。 还可以利用 C 语言字符串的 \0 作为结束符读取字符串。

        char line[500] = "";
        Serial.readBytesUntil('\0', line, 500);
回复 支持 反对

使用道具 举报

发表于 2013-10-30 22:37:22 | 显示全部楼层
请问:
我的PC端发出来的是hex格式的数据,我的数据是“7F 00 # 10 80 01 # 2F # 2F # 00 # 7F”这么一个格式,#号代表的位数不一定,我应该怎么写代码,才能把这些#代表的东西取出来呢?
看了很多资料,都没有一个头绪。
回复 支持 反对

使用道具 举报

发表于 2015-5-30 14:08:25 | 显示全部楼层
楼主有心了,这个在 Arduino IDE 的 Examples 能找到
回复 支持 反对

使用道具 举报

发表于 2015-12-27 16:58:55 | 显示全部楼层
麻烦请教高人,我在做RS485通讯,就是主站(ARDUINO)发一串16进制的数据发给从站(比如14个),如果发的数据从站认为是对的(仪表的协议),从站就给主站返回一串16进制的数(比如18个),也就是我从仪表上读数据,怎么写呢?麻烦指导一下  QQ943097644
回复 支持 反对

使用道具 举报

发表于 2016-4-2 15:42:06 | 显示全部楼层
求一段含通信协议的串口通信显示程序,大神,有例子,让我看看,谢谢了
回复 支持 反对

使用道具 举报

发表于 2020-1-5 10:40:39 | 显示全部楼层
有点难理解,慢慢来吧,感谢楼主分享。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 04:34 , Processed in 0.060497 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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