如何编写自己的串口通讯协议(高手请自觉忽略)
本帖最后由 迷你强 于 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;
}
}
}
事件驱动,效率大大地提高了 event函数貌似很好。回头查手册看去。
不知道是不是所有串口事件都触发串口event?还是仅仅接收到了才触发? 原来串口是这么个用法,土鳖了。。。。谢高手指点 这个很精彩,学习了一定要顶 非常精彩,原来的用法都是土鳖! 不错, 反正我是不知道还可以这么用 对了, 读取一行感觉不用那么麻烦, 用 readBytesUntil 比较好。 还可以利用 C 语言字符串的 \0 作为结束符读取字符串。
char line = "";
Serial.readBytesUntil('\0', line, 500); 请问:
我的PC端发出来的是hex格式的数据,我的数据是“7F 00 # 10 80 01 # 2F # 2F # 00 # 7F”这么一个格式,#号代表的位数不一定,我应该怎么写代码,才能把这些#代表的东西取出来呢?
看了很多资料,都没有一个头绪。 楼主有心了,这个在 Arduino IDE 的 Examples 能找到 麻烦请教高人,我在做RS485通讯,就是主站(ARDUINO)发一串16进制的数据发给从站(比如14个),如果发的数据从站认为是对的(仪表的协议),从站就给主站返回一串16进制的数(比如18个),也就是我从仪表上读数据,怎么写呢?麻烦指导一下QQ943097644 求一段含通信协议的串口通信显示程序,大神,有例子,让我看看:'(,谢谢了 有点难理解,慢慢来吧,感谢楼主分享。
页:
[1]