精华内容
下载资源
问答
  • 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

    展开全文
  • 串口缓冲区管理分析

    千次阅读 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

    编程复杂度

    略微复杂

    简单

     

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

     

     

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

     

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


    展开全文
  • 由于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
    展开全文
  • Arduino的串口结束符及串口缓冲区

    千次阅读 多人点赞 2019-01-06 16:35:42
    深入理解缓冲区和Serial.available():2.深入理解串口结束符3.验证结论: 1.深入理解缓冲区和Serial.available(): 运行下面的代码,我发现如果不在串口输入任何数字,就会一直显示“no”,输入一个数字,就一直显示...
  • c++清空串口缓冲区

    千次阅读 2019-01-24 13:00:23
    缓冲区控制 Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile,...
  • 清空串口缓冲区

    万次阅读 2012-05-20 16:07:49
    缓冲区控制 Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile,...
  • STM32进阶之串口环形缓冲区实现

    万次阅读 多人点赞 2018-06-04 10:03:13
    如需转载请说明出处:STM32进阶之串口环形缓冲区实现 队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),...
  • Labview中解析串口缓冲区数据程序

    千次阅读 2015-07-03 14:06:44
    labview中接收串口缓冲区数据后循环转换成float型数据的程序框图
  • MFC清空串口缓冲区

    千次阅读 2012-12-07 15:52:10
    Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile, // 返回的...
  • Wince6.0 串口缓冲区同时接收到数据的问题,当串口缓冲区正在接收一串数据时,又有一串数据需要接收,这样就有一串有用的数据出现错误,请问各路大神这个问题怎么解决?急
  • STM32串口环形缓冲区

    千次阅读 2016-10-18 02:23:26
    1.2:如果串口仅仅是实现一个控制台,打印一些debug数据,使用printf函数(串口发送数据忙等待),如果是需要用串口进行外设设备的控制,比如串口GPRS模块,需使用串口中断进行控制,因为受限于串口
  • 就这行简单代码:  write(UartFd,DataBuf,100);  执行时间有时候长,有时候短,直接影响了后续代码的执行,why?... 带着这个问题,我们来谈谈通信缓冲区,顾名思义,缓冲区是用来调和CPU运行速度和通...
  • 串口环形缓冲区学习

    千次阅读 2019-05-27 12:08:34
    文章目录说明&感谢环形缓冲区作用编程步骤代码&分析实验现象源代码 说明&感谢 互联网是个开放的世界, 感谢...串口数据接收, 如果数据量过, 很可能来不及处理这些数据, 因此需要把接收的数据存放到...
  • [Linux C]自己写的串口缓冲区

    千次阅读 2015-07-24 01:11:51
    闲来没事自己写了一个串口缓冲区玩,利用数组实现,运行在Linux环境底下,gcc编译和自测试通过。 #include #include /* 缓冲区大小 */ #define SERIAL_BUFFER_SIZE 250 /* 错误代码:取负值是为了与正常数值区别...
  • 串口是常用的通信手段,在大量收发的应用中,或者任务的应用中,非阻塞串口代码的重要性就非常重要了。现在有和硬件隔离的如下的函数: USART_GetChar,USART_PutChar,USART_GetCharsInRxBuf,USART_IsTxEmpty...
  • labview高亮单步显示时串口缓冲区能够正常接收
  • stm32F4 串口DMA+环形缓冲区的实现

    万次阅读 2016-09-26 22:43:56
    下面是串口DMA+环形缓冲区的实现,数据收发是异步的,不需要死等。 关于环形缓冲区参考: http://blog.csdn.net/jieffantfyan/article/details/53572103 实现原理 程序是在串口中断收发方式的基础上设计的,应用...
  • 电脑串口延迟/缓冲设置方法

    千次阅读 2019-10-14 19:40:20
    注意:这里的因为有一个接收缓冲区和一个发送缓冲区,所以这个时间延迟应该除以二(虽然这样并不严谨),大概可以得到正确的时间延迟。 可以看出关闭fifo或者是将延迟(缓冲区)调整到最低,可以很明显的降低这个...
  • micropython串口接收缓冲区的问题

    千次阅读 2020-03-08 02:16:56
    本来刚接触python,最近因为疫情无聊把买...这个版本的固件是比普通固件了个线程功能(虽然据说thread的API开发还不完全) 说明以上原因是我只是偶然遇到并且只在上述环境下发现并测试研究的。闲言少续,说正题...
  • 51单片机串口通信 环形缓冲区队列(FIFO)

    万次阅读 多人点赞 2017-01-08 20:37:30
    51单片机串口通信 环形缓冲区队列最近在做毕业设计刚好涉及到51单片机,简单的研究一下发现51单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理SBUF的值或者串口中断长时间未退出很容易照成数据...
  • ,可我让发送设备1s内发送10次,这边接收10次,每次的10字节都是正确的,感觉输入缓冲区还是很,根本就不是1个字节!) 问题: 是我对SetupComm(hcom,1,1);理解错误了么? 还是SetupComm(hcom,1,1);根本就没用...
  • STM32串口数据接收 --环形缓冲区

    千次阅读 2021-02-01 11:35:57
    STM32串口数据接收 --环形缓冲区 环形缓冲区简介   在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。   在通信程序中,...
  • 我在做一个串口。要把罗盘仪的数据读出来,为了保证数据全部读出来,我的MSComm控件的输入缓冲区设置的越大越好吗,默认是1024,最大是多少。
  • tcsetattr(int fd, int optional_actions, const struct termios *termios_p) //设置串口termios结构 sets the parameters associated with the terminal (unless support is required from the underlying ...
  • 串口实用的循环缓冲区

    千次阅读 2013-03-21 21:49:45
    小记。 项目临时需要单片机进行节点控制,主要用来控制模块的开关,以串口进行通讯。 单片机几多久没玩了,选用的是C8051F920,传说中增强...主要在通讯协议这部分花的时间较串口接收采用循环缓冲区的方式,以FI
  • STM8S 带缓冲区 串口中断 使用心得

    千次阅读 2018-05-10 09:34:48
    /*-------------------------串口初始化函数------------------------*/ /*********************************************************** * 函数名称:void UART2_Init(void) * * 功能描述:UART2初始化函数 * * ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,569
精华内容 10,627
关键字:

串口缓冲区设置多大