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

    本版积分规则

    热门推荐

    AT固件无法正常使用
    AT固件无法正常使用
    按照文档烧入AT固件后,串口(9600)输出如下: 发送AT指令没有反应。
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    数字传感器与模拟传感器的使用
    数字传感器与模拟传感器的
    很多新人问,如何写XX传感器的驱动,这里说说简单只需要读取一个数字信号或者模拟信号
    基于Esp8266的点阵时钟
    基于Esp8266的点阵时钟
    芯片是ESP8266 12F 配合点阵单元板(64*32,单色),实现自动对时,天气预报,农历,
    做个遥控玩具
    做个遥控玩具
    现在我想做个手工,想用这个当5V马达+5V灯光+5V音乐的遥控器 可以实现吗?还需要买Ar
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表