查看: 25427|回复: 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-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 感谢指正

    查看全部评分

    该用户从未签到

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

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

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

    请奈何大哥再确认一下串口缓冲区方面的内容。
  • TA的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [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的每日心情
    奋斗
    2019-7-12 18:42
  • 签到天数: 48 天

    [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 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    esp32作为智能主机使鱼缸内温度保持在28度种植水草
    esp32作为智能主机使鱼缸
    esp32作为智能主机使鱼缸内温度保持在28度种植水草, 设计原则, 一,使用我手上现有
    请大佬帮助如何分别控制两块pca9685上的舵机
    请大佬帮助如何分别控制两
    目前一块驱动板上的舵机可以分别控制分别是0到15号舵机,不清楚在级联的情况下如何分
    【干货分享】mega2560原理图PCB图纸altium designer18
    【干货分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
    [Arduino物联网开发实战4]天猫精灵控制1
    [Arduino物联网开发实战4]
    [md] 上一篇:(https://www.arduino.cn/thread-83175-1-1.html) blinker支持多种智
    【项目】基于Arduino Nano的多功能桌面感应垃圾桶
    【项目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表