查看: 175|回复: 2

[未解决] arduino串口数据存储的问题

[复制链接]

该用户从未签到

发表于 2019-8-25 22:58 | 显示全部楼层 |阅读模式
用蓝牙接收数据,但是数据发送方可能非常快。导致arduino这边处理不过来(数据丢失)比如蓝牙发送方我设定每条命令用^开头 用$结尾  如 ^A$  ^B$  ^C$ 然后通过程序去截取命令 A B C (比如蓝牙键盘的按键吧)
但是实际中由于操作的速度非常快,arduino读取的时候有可能变成   ^A$^B 或者 ^B$^ 这样我不得不丢弃一部分数据
我试过定义一个字符串去存储, 一上来先把命令追加到字符串,然后里面再去处理。但是这样貌似处理的过的字符串没法删除
不知道arduino 有没有类似 其它语言 unset 这种方法,删除单个元素之类的

该用户从未签到

发表于 2019-8-26 15:15 | 显示全部楼层
删除单个元素之类的
  • TA的每日心情
    擦汗
    2019-7-29 00:08
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2019-8-26 19:26 | 显示全部楼层
    本帖最后由 t3486784401 于 2019-8-26 19:31 编辑

    如果把接收看成“包”,就会有LZ所言黏包、断包问题;
    实际上 Arduino 的 Serial 类设计是“流”,并没有包的概念。

    每次 Serial.read( ) 都会从缓冲区抽出一个字符,并将之删除。
    所以你自己处理 Serial.read( ) 就行,读到 $ 之后就开始处理,后边的串行数据 Serial 会帮你存着的,等处理完继续找 ^ 字符开始下一个解析。

    当然这么也有前提,如果平均的处理速率低于进来的速度,缓冲区无论如何都会爆掉的
    最后的函数结构大致如下(串口没数据时,理论上会卡在两个 while 之一,但也有待测试):

    1. void loop(void)
    2. {
    3.     while(Serial.read()!='^');

    4.     char cmd= Serial.read();
    5.     //// do sth. ////

    6.     while(Serial.read()!='$');
    7. }
    复制代码



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

    本版积分规则

    热门推荐

    全国机器人等级考试配件购买
    全国机器人等级考试配件购
    本人想自己教小孩机器人等级考试,需要购买机器人等级考试的配件,可是淘宝上的太
    【Arduino】108种传感器系列实验(24)---水位传感器模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】108种传感器系列实验(96)---433M无线发射接收模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】108种传感器系列实验(93)---CSR8350蓝牙音乐模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】108种传感器系列实验(89)--- 4*4位 RGB LED 全彩模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表