查看: 36180|回复: 14

修改Arduino串口缓冲区大小

[复制链接]

该用户从未签到

发表于 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就会将最早存入的缓冲区的数据丢弃。

[mw_shl_code=bash,true]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;
  };
}[/mw_shl_code]

评分

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

查看全部评分

该用户从未签到

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

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

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

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

签到天数: 1 天

[LV.1]初来乍到

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

看到源码,确实如您所说

签到天数: 1 天

[LV.1]初来乍到

发表于 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 | 显示全部楼层
如果是软串口呢, 请问是否也有类似的方法?

该用户从未签到

发表于 2016-5-4 23:21 | 显示全部楼层
学习了,给力,谢谢。

该用户从未签到

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

本版积分规则

热门推荐

IRremoteESP8266都是英文的 用法看不懂
IRremoteESP8266都是英文
最近在用IRremoteESP8266库,但是里面用法解释都是全英文的,也没有例子,实在看起来
blinker物联网教程——6、wifi插座
blinker物联网教程——6、
简介[hr] 在日常生活中,我们可能有接触到wifi插座,所谓wifi插座就是给原本的插座加
想自制TB6612电机驱动模块
想自制TB6612电机驱动模块
想知道板子上三个电容的参数
ESP32用不了arduino库里的tone()函数!!!
ESP32用不了arduino库里的
选择用其他开发板就能用,唯独ESP32用不了,好像一直检索不到路径,折腾两天了
【搬运】初学者的PID教程 by Brett Beauregard
【搬运】初学者的PID教程
在网上看到一个写的很详细的PID教程,一步一步地讲解Arduino PID库的原理,非常棒。帖
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表