拾瑞 发表于 2013-7-20 13:32:34

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

本帖最后由 迷你强 于 2013-8-14 21:05 编辑

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

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

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

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

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

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


void loop() {

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

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

void serialEvent()
{
while (Serial.available()) {   

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

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

    }
}
}

qptimus 发表于 2013-7-20 17:04:29

事件驱动,效率大大地提高了

wangnengjie 发表于 2013-7-20 21:02:03

event函数貌似很好。回头查手册看去。
不知道是不是所有串口事件都触发串口event?还是仅仅接收到了才触发?

qiuq86 发表于 2013-8-14 16:20:59

原来串口是这么个用法,土鳖了。。。。谢高手指点

chqiyi 发表于 2013-8-14 20:54:47

这个很精彩,学习了一定要顶

tigerdawn 发表于 2013-9-14 21:24:18

非常精彩,原来的用法都是土鳖!

hick 发表于 2013-9-14 22:35:18

不错, 反正我是不知道还可以这么用

hick 发表于 2013-9-14 22:39:04

对了, 读取一行感觉不用那么麻烦, 用 readBytesUntil 比较好。 还可以利用 C 语言字符串的 \0 作为结束符读取字符串。

      char line = "";
      Serial.readBytesUntil('\0', line, 500);

maxims 发表于 2013-10-30 22:37:22

请问:
我的PC端发出来的是hex格式的数据,我的数据是“7F 00 # 10 80 01 # 2F # 2F # 00 # 7F”这么一个格式,#号代表的位数不一定,我应该怎么写代码,才能把这些#代表的东西取出来呢?
看了很多资料,都没有一个头绪。

LinuxFans 发表于 2015-5-30 14:08:25

楼主有心了,这个在 Arduino IDE 的 Examples 能找到

zhangjianjun 发表于 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

有点难理解,慢慢来吧,感谢楼主分享。
页: [1]
查看完整版本: 如何编写自己的串口通讯协议(高手请自觉忽略)