精华内容
下载资源
问答
  • Arduino串口缓冲区默认为64字节,如果你单次传输的数据较多可以将arduino-1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp中的  #define SERIAL_BUFFER_SIZE 64  修改为 #define SERIAL_BUFFER_...

    Arduino串口缓冲区默认为64字节,如果你单次传输的数据较多可以将arduino-1.0.5-r2\hardware\arduino\cores\arduino\HardwareSerial.cpp中的

      #define SERIAL_BUFFER_SIZE 64

      修改为 #define SERIAL_BUFFER_SIZE 128

    这样就有128字节的缓冲区了。

     

    但是这样会使RAM的可使用大小减小64字节,也就是说我们扩大的那部分缓冲区是从RAM那里借来的。(引用自

     


    上述的路径适用于1.0.5版本,但是在1.5.5和1.6.1版本中则在arduino-1.5.5\hardware\arduino\avr\cores\arduino\HardwareSerial.h 或 

    arduino-1.6.1\hardware\arduino\avr\cores\arduino\HardwareSerial.h 中了。可以在文件中直接搜索数字“64”来查找:

     修改上图中的数字“64”为“128”或者更大即可。(BTW,后面的注释是我自己加的,不是文件自有的)

    转载于:https://www.cnblogs.com/yinsua/p/4352863.html

    展开全文
  • 本帖节选自《Arduino程序设计基础》第二版5.1.6串口缓冲区 在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数据放入到串口缓冲区中。 但是,当我们使用其他...

    本帖节选自《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空间都分配作串口缓冲区。如果项目开发中,有增加串口缓冲区大小的必要,需根据项目情况酌情修改缓冲区大小。

     

    本贴来自:http://www.arduino.cn/thread-7885-1-1.html

    转载于:https://www.cnblogs.com/jikexianfeng/p/6250564.html

    展开全文
  • 由于SoftwareSerial.h默认只接收64字节串行缓冲区,Arduino会将之后接收到的数据丢弃,不满足业务需求。 以下三种方法是笔者参考网上各种资料总结出来,对于WEMOS D1 R2,笔者只有方法一可行,其他两个方法仅供参考...

    由于SoftwareSerial.h默认只接收64字节串行缓冲区,Arduino会将之后接收到的数据丢弃,不满足业务需求。
    以下三种方法是笔者参考网上各种资料总结出来,对于WEMOS D1 R2,笔者只有方法一可行,其他两个方法仅供参考。

    方法一:修改缓冲区宏名(可行)

    此方法针对WEMOS D1 R2可行,因为集成esp8266模块,该模块自带SoftwareSerial,修改SoftwareSerial.h即可!

      //SoftwareSerial(int receivePin, int transmitPin, bool inverse_logic = false, unsigned int buffSize = 64);
      SoftwareSerial(int receivePin, int transmitPin, bool inverse_logic = false, unsigned int buffSize = 2048);

    目录(仅供参考):C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.0\libraries\SoftwareSerial

    方法二:修改SoftwareSerial.h

    此方法是Arduino论坛评论看到的,理论上加到程序头即可,也可以在SoftwareSerial.h中修改。

    //#define _SS_MAX_RX_BUFF 64 // RX buffer size
    #define _SS_MAX_RX_BUFF 2048 // RX buffer size

    目录(仅供参考):C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src

    方法三:修改缓冲区宏名

    此方法是Arduino官方给出的方法,理论上加到程序头即可,也可以在HardwareSerial.h中修改。请注意如果你使用SoftwareSerial.h此方法一定不行

    #define SERIAL_RX_BUFFER_SIZE 2048 //修改串口发送缓冲区大小为2048
    #define SERIAL_TX_BUFFER_SIZE 2048 //修改串口接收缓冲区大小为2048
    展开全文
  • 最近在使用linux串口发送数据和接收数据的时候,发现一次发送或接收,超过512个字节会失败。Linux串口默认的缓冲区大小是多少?怎么修改缓冲区的大小?
  • 现在有个问题,在应用程序中打开串口的时候,进行串口配置,当配置到缓冲区大小的时候,使用了SetupComm来进行设置,但是设置失败,返回错误代码是 50,查了下,说的是指令不支持的意思。请问一下这个在底层驱动是在...
  • 串口缓冲区管理分析

    千次阅读 2017-10-19 18:16:22
    串口使用时一般包含两个缓冲区,即发送缓冲区和接收缓冲区。发送数据时,先将数据存在发送缓冲区,然后通过串口发送;接收数据时,先将接收的数据存在接收缓冲区,然后再进行读取。   合理恰当的使用缓冲区,...

    转载连接: http://blog.csdn.net/baiyibin0530/article/details/46008951


    一、 概述:

    串口使用时一般包含两个缓冲区,即发送缓冲区和接收缓冲区。发送数据时,先将数据存在发送缓冲区,然后通过串口发送;接收数据时,先将接收的数据存在接收缓冲区,然后再进行读取。

     

    合理恰当的使用缓冲区,不仅可以使不同设备间正常通信,而且还有助于节约内存,提高效率。

     

    二、缓冲区分配管理:

    方法一:

    通过内存池实现

     

    1、数据结构:

     

    struct _CHN_POOL_MGR

    {

        u8 buffer[BUF_SZ];

        u32 free_bitmap;

    };

     

    参数含义:struct _CHN_POOL_MGR:内存池的数据类型

     

    buffer:缓冲区,大小为BUF_SZ  192

     

    free_bitmap:标志位。

     

    注意:缓冲区又分为若干块,每块大小BLK_SZ

     

     

     

    free_bitmap标志缓冲区块中的空闲块和被使用块,1表示空闲,0表示被使用

     

     

     

    注:阴影部分表示存放着数据

     

    free_bitmap初始化为(1 << (sizeof(chn_pool_mgr.buffer) / BLK_SZ)) -1即(1 << (2^10/2^6)) -1,即二进制数11111...11111b,共16个1,缓冲区块全部空闲

     

    alloc_a_slot()函数分配缓冲区块:检测free_bitmap值,将空闲的缓冲区块标号较小的块分配,返回分配的缓冲区块的标号

     

    free_bitmap值

    分配的缓冲区块标号

    alloc_a_slot()返回值

    1111...111111

    0

    0

    1111...111100

    2

    2

    1111...110010

    1

    1

    1111...000100

    2

    2

    //不是太明白????

     

     

    struct _CHN_SLOT

    {

        s16 tx; 

        s16 rx;

        /*the current count of this channel */

        s16 data_cnt; 

        s16 data_max;

    };

     

    参数含义:struct _CHN_SLOT:记录缓冲区读写状态的结构体

     

    tx:记录缓冲区块标号和数据的写入位置(具体存放如图所示)

    rx:记录缓冲区块标号和数据的读取位置(具体存放如图所示)

     

    data_cnt:记录缓冲区中未读取的数据量

    data_max:向缓冲区中写入数据时,缓冲区中允许存在的最大数据量

     

     

    tx,rx数据含义:

     

     

     

     

     

    2,实例分析

     

    1)向缓冲区中写数据:

     

    向缓冲区中写数据,每次写90个字节,写两次。

     

    初始状态:

    假设struct _CHN_SLOT结构体中各参数均为初始状态:tx = rx = INVALID_PTR,即(INVALID_BLK_NO << BLK_NO_SHIFT),data_cnt为0,data_max为UART_MAX_LEN

     

    内存池的状态如下:

     

     

    写数据:

     

    alloc_a_slot()分配缓冲区块:

     

    检测free_bitmap,分配缓冲区块标号为2的块;

    tx记录缓冲区块标号及写入数据位置(0x80);

    缓冲区块最后一个字节置为INVALID_BLK_NO;

     

    变为如下状态:

     

     

    写入90个数据:

    由于90 > BLK_SZ-1(一个块存放数据的最大字节数),所以再次调用alloc_a_slot()分配缓冲区块

     

    检测free_bitmap,分配缓冲区块标号为4的块;

    tx记录缓冲区块标号及写入数据位置(0x100);

    缓冲区块最后一个字节置为INVALID_BLK_NO;

    此外,还要使标号为2的块的最后一个字节记录下一块的标号(4),最后将剩余的数据写入,tx记录数据位置(0x11B)

     

     

    写入完成后,各参数状态如下:

     

     

    第二次写入数据:

     

    与上面类似,根据tx记录的缓冲区块标号及数据位置继续向后写。

     

     

    最终变为如下状态:

     

     

     

     

     

    3)从缓冲区中读数据

    从缓冲区中读数据,每次读40个,读完为止。

     

    假设此时缓冲区状态,及各参数如下:

     

     

     

     

    data_cnt为180

     

     

    此时开始读取数据,rx记录缓冲区标号及数据位置,成功读取40个数据后变为:

     

     

    继续读数据,标号为2的缓冲区块内的数据读完,由该块内最后一个字节得知下一缓冲区块的标号,rx记录,此时,各参数状态如下:

     

     

     

     

    继续读取,data_cnt变为0,读取结束。

     

     

    小结:

    由以上分析可知,使用内存池的方法,通过检测free_bitmap可使缓冲区被多个任务共同使用,节约空间。

     

     

     

    方法二:

    利用循环队列实现

     

    1、数据类型:

    struct _CHN_SLOT

    {

    int tx, rx;

    u8 buf[BUFFER_LEN];

    };

     

    参数含义:

    tx:记录缓冲区写入位置

    rx:记录缓冲区读取位置

    buf:缓冲区

     

     

    2、方法实现:

     

    每存入一个字节,tx后移一位,每取走一个字节,rx后移一位

     

     

     

    当tx移至缓冲区结尾时,若缓冲区头部已读取,则tx会继续在头部存放数据,如下:

     

     

    当(rx + 1) % BUFFER_LEN == tx时,缓冲区存满

     

     

     

    三、两种方法的比较:

    比较内容

    方法一

    方法二(循环队列式)

    使用缓冲区的任务数

    允许多任务

    只能单任务

    空间利用率

    缓冲区的使用顺序

    优先使用低地址处的缓冲区块

    由低地址到高地址循环使用

    不能存放数据的字节数

    缓冲区块数

    1B

    编程复杂度

    略微复杂

    简单

     

    注:方法一不能存放数据的字节数用于记录下一缓冲区块的位置;循环队列式,不能存放数据的字节数用于循环使用缓冲区

     

     

    方法一最大的好处在于可同时被多个任务共同使用,互不影响,有助于节约内存;而且每次分配空间时,会优先使用低地址处的空闲块,数据集中,有利于减少内存池的占用;某一任务释放的空间可被另一任务使用,提高了利用率,但编程略微复杂。

     

    循环队列式编程简单,容易理解,特别适合单任务的使用,但缓冲区的利用率不是很高,且无法多任务使用。


    展开全文
  • Wince6.0 串口缓冲区同时接收到数据的问题,当串口缓冲区正在接收一串数据时,又有一串数据需要接收,这样就有一串有用的数据出现错误,请问各路大神这个问题怎么解决?急
  • Labview中解析串口缓冲区数据程序

    千次阅读 2015-07-03 14:06:44
    labview中接收串口缓冲区数据后循环转换成float型数据的程序框图
  • 设置输入缓冲区大小为:1024字节,输出缓冲区大小为2048字节。 我的理解是: 输入缓冲区的目的:不能实时接收其他设备传来的数据,先放那,有空了再去拿(如果其他设备发送过来的数据大于1024字节就会丢数据了)。...
  • MFC清空串口缓冲区

    千次阅读 2012-12-07 15:52:10
    Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile, // 返回的...
  • [Linux C]自己写的串口缓冲区

    千次阅读 2015-07-24 01:11:51
    闲来没事自己写了一个串口缓冲区玩,利用数组实现,运行在Linux环境底下,gcc编译和自测试通过。 #include #include /* 缓冲区大小 */ #define SERIAL_BUFFER_SIZE 250 /* 错误代码:取负值是为了与正常数值区别...
  • 转自:...
  • STM32进阶之串口环形缓冲区实现

    万次阅读 多人点赞 2018-06-04 10:03:13
    如需转载请说明出处:STM32进阶之串口环形缓冲区实现 队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),...
  • 就这行简单代码:  write(UartFd,DataBuf,100);  执行时间有时候长,有时候短,直接影响了后续代码的执行,why?... 带着这个问题,我们来谈谈通信缓冲区,顾名思义,缓冲区是用来调和CPU运行速度和通...
  • 第一次接触串口,写点东西加深自己对串口的印象: 通过参考一些网上的实例,我明白了串口怎么简单的进行通信交流,但是我所需要的还是图片等大文件在串口中的传输,串口传输是通过二进制位进行单位传输的,所以传输...
  • 串口环形缓冲区学习

    千次阅读 2019-05-27 12:08:34
    感谢环形缓冲区作用编程步骤代码&分析实验现象源代码 说明&感谢 互联网是个开放的世界, 感谢无数开源和分享者, 本次学习主要参考了杰杰的分享, 经了解杰杰现在大学尚未毕业, 而本人工作8年了, 闻道有先后...
  • 我再控件设置缓冲区为65535也不行,我测试的时候检测到第一次从缓冲区是读取了4096个字节,但是程序就卡死了,点其他任何控件都无法执行,对于这么多的数据怎么去处理,求大神指导
  • 51单片机串口程序(带缓冲区

    热门讨论 2010-12-21 11:23:45
    利用51单片机的串口,编写了串口程序,并且编写了缓冲区处理程序。程序设计了60字节的缓冲区,自己也可以修改缓冲区大小
  • micropython串口接收缓冲区的问题

    千次阅读 2020-03-08 02:16:56
    但根据下边的解释,这是缓冲区大小的设置。抱着试试的心态,我开始各种研究这个buf(不是buff 哈哈): 经过各种暴力实验,得出结论,在UART初始化的时候如果不给这个参数,直接会被默认为64byte的大小,就像下边...
  • 51单片机串口通信 环形缓冲区队列(FIFO)

    万次阅读 多人点赞 2017-01-08 20:37:30
    51单片机串口通信 环形缓冲区队列最近在做毕业设计刚好涉及到51单片机,简单的研究一下发现51单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理SBUF的值或者串口中断长时间未退出很容易照成数据...
  • #define SERIAL_RX_BUFFER_SIZE 2048 //修改串口发送缓冲区大小为2048 但是由于arduino的编译器是先导入其他头文件,再编译用户区代码的,所以会提示已经被重定义。 那么我们就只能根据提示,去修改C:\Program ...
  • STM32串口数据接收 --环形缓冲区

    千次阅读 2021-02-01 11:35:57
    STM32串口数据接收 --环形缓冲区 环形缓冲区简介   在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。   在通信程序中,...
  • 参考STC官方例程,使用自编的库函数进行串口配置。并设计了环形队列作为串口缓冲区,可以方便的移植到其他的处理器上使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,082
精华内容 5,232
关键字:

串口缓冲区大小