查看: 21585|回复: 14

修改Arduino串口缓冲区大小

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2014-12-5 12:13 | 显示全部楼层 |阅读模式
    本帖节选自《Arduino程序设计基础》第二版

    5.1.6串口缓冲区

           在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数据放入到串口缓冲区中。
           但是,当我们使用其他串口设备或者传输的数据量逐步增加后,你可能会发现写入的数据会有一些丢失,这是因为Arduino默认设定了串口缓冲区为64字节,当其中数据超过64字节后,Arduino会将之后接收到的数据丢弃
          
           我们可以通过宏定义的方式来增大串口读写缓冲区的空间,Arduino核心库中串口发送缓冲区宏名为SERIAL_TX_BUFFER_SIZE,串口接收缓冲区宏名为SERIAL_RX_BUFFER_SIZE。可以在hardwareSerial.h中修改。


           缓冲区实际上就是在Arduino的RAM上开辟临时存储空间,因此缓冲区的设定大小不能超过arduino本身的RAM大小;又因为我们还要在RAM上,进行其他数据的存储,所以并不能将所有RAM空间都分配作串口缓冲区。如果项目开发中,有增加串口缓冲区大小的必要,需根据项目情况酌情修改缓冲区大小。



    如果以上内容对你有帮助,你可以通过打赏支持作者

    该用户从未签到

    发表于 2016-1-12 20:42 | 显示全部楼层
    http://arduino.stackexchange.com ... ial-buffer-overflow

    http://binglongx.com/2011/10/26/ ... port-communication/

    我在这两篇文章中找到,当串口缓冲区满了后,后面到达的数据是会被丢弃的。

    请奈何大哥再确认一下串口缓冲区方面的内容。

    该用户从未签到

    发表于 2016-1-13 15:08 | 显示全部楼层
    hardware\arduino\avr\cores\arduino\HardwareSerial_private.h(IDE1.6.6版本)中对于串口缓存的代码,其中注释we're about to overflow the buffer  and so we don't write the character or advance the head.

    说明串口缓存64B溢出后,后面的数据是丢弃的。而不是
    当其中数据超过64字节后,Arduino就会将最早存入的缓冲区的数据丢弃。

    kittenblock中小学创客名师推荐的图形化编程软件

    void HardwareSerial::_rx_complete_irq(void)
    {
      if (bit_is_clear(*_ucsra, UPE0)) {
        // No Parity error, read byte and store it in the buffer if there is
        // room
        unsigned char c = *_udr;
        rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;
    
        // if we should be storing the received character into the location
        // just before the tail (meaning that the head would advance to the
        // current location of the tail), we're about to overflow the buffer
        // and so we don't write the character or advance the head.
        if (i != _rx_buffer_tail) {
          _rx_buffer[_rx_buffer_head] = c;
          _rx_buffer_head = i;
        }
      } else {
        // Parity error, read byte but discard it
        *_udr;
      };
    }

    评分

    参与人数 1贡献 +1 收起 理由
    coloz + 1 感谢指正

    查看全部评分

  • TA的每日心情
    擦汗
    2018-9-19 20:22
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2016-1-13 15:23 | 显示全部楼层
    pumpkingiggle 发表于 2016-1-13 15:08
    hardware\arduino\avr\cores\arduino\HardwareSerial_private.h(IDE1.6.6版本)中对于串口缓存的代码,其中 ...

    看到源码,确实如您所说
    如果你觉得以上内容帮到了你,你可以打赏支持作者
  • TA的每日心情
    擦汗
    2018-9-19 20:22
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2016-1-13 16:12 | 显示全部楼层
    pumpkingiggle 发表于 2016-1-13 15:08
    hardware\arduino\avr\cores\arduino\HardwareSerial_private.h(IDE1.6.6版本)中对于串口缓存的代码,其中 ...

    http://www.arduino.cn/thread-12618-1-1.html
    如果你觉得以上内容帮到了你,你可以打赏支持作者

    该用户从未签到

    发表于 2016-1-28 13:05 | 显示全部楼层
    请教奈何大哥,我用的1.0.6,HardwareSerial.cpp里只有SERIAL_BUFFER_SIZE,没有区分RX和TX,怎么理解呢?
    如果是SERIAL_BUFFER_SIZE 64,是RX TX分别64吗?
    向您这样在主程序头声明,是不是就没必要改HardwareSerial.cpp啦?

    该用户从未签到

    发表于 2016-1-29 18:15 | 显示全部楼层
    如果是软串口呢, 请问是否也有类似的方法?
  • TA的每日心情
    开心
    2016-5-17 14:55
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2016-5-4 23:21 | 显示全部楼层
    学习了,给力,谢谢。
  • TA的每日心情
    开心
    2018-6-16 16:25
  • 签到天数: 777 天

    [LV.10]以坛为家III

    发表于 2016-9-7 15:47 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    GRBL sender 自己制作的控制软件
    GRBL sender 自己制作的控
    网上找了许多GRBL控制软件都不理想,于是决定自己动手做一个,这是第一版,功能有限,
    有关程序编译出错问题
    有关程序编译出错问题
    ActionGroup_[AG_NUM_][CHAR_NUM]二维数组传入void handleActionGroup(const char
    基于arduino的ZS-40蓝牙模块传输超声波距离,app显示
    基于arduino的ZS-40蓝牙模
    基于arduino的ZS-40蓝牙模块传输超声波距离,app显示
    上传出错
    上传出错
    自从我做红外遥控小车之后就上传出错了,换了一根线也不行,单片机没有插任何东西
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表