精华内容
下载资源
问答
  • 2021-01-13 00:40:29

    Arduino串口默认只接收64字节到缓冲区,之后接收到的数据直接丢弃,那么在发送/接收不同步的情况下,传输数据过大就会丢数据了!

    并且当数据超过64字节后,是丢弃后面的数据,而不是将最早存入缓冲区的数据丢弃!希望未来能有个开关来控制丢弃方式。

    对于硬件串口,

    可以通过宏定义的方式来增大串口读写缓冲区的空间,Arduino核心库中串口发送缓冲区宏名为SERIAL_TX_BUFFER_SIZE,串口接收缓冲区宏名为SERIAL_RX_BUFFER_SIZE。可以在hardwareSerial.h中修改。

    #define SERIAL_RX_BUFFER_SIZE  512  // 接收缓冲区

    #defind SERIAL_TX_BUFFER_SIZE  512  // 发送缓冲区

    对于软串口,

    也有对应的宏定义方式来修改,也可以在SoftwareSerial中修改。

    #define _SS_MAX_RX_BUFF  512  // 接收缓冲区

    #define _SS_MAX_TX_BUFF 512  // 发送缓冲区

    缓冲区实际上就是在Arduino的RAM上开辟临时存储空间,因此缓冲区的设定大小不能超过arduino本身的RAM大小;又因为我们还要在RAM上,进行其他数据的存储,所以并不能将所有RAM空间都分配作串口缓冲区。如果项目开发中,有增加串口缓冲区大小的必要,需根据项目情况酌情修改缓冲区大小。

    更多相关内容
  • 嵌入式linux修改串口缓冲区大小

    千次阅读 2021-07-13 17:18:04
    include/linux/serial_core.h ... #define UART_XMIT_SIZE PAGE_SIZE ... include/generated/asm-offsets.h ... #define PAGE_SIZE 4096 ...

    一、方法1修改内核

    kernal/include/linux/serial_core.h

    ...
    #define UART_XMIT_SIZE 	PAGE_SIZE
    ...
    

    kernal/include/generated/asm-offsets.h

    ...
    #define PAGE_SIZE	4096
    ...
    

    注意:
    2.6的内核PAGE_SIZE的位置在kernal/include/asm/page.h

    二、方法2应用层修改
    使用:ioctl(fd, TIOCSSERIAL, &serial);

    #define FRAME_SIZE 10
    struct serial_struct serial; 
    ...
    serial.xmit_fifo_size = FIFO_SIZE; // what is "xmit" ?? 
    ioctl(fd, TIOCSSERIAL, &serial); 
    ...
    

    完整参考程序

    
    #include <asm-generic/ioctl.h>
    #include <termios.h>
    #include <linux/serial.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/ioctl.h>
     
    int UartBuffSizeSet(char *dev_path,int size) {  
      int ret;
      int fd =  open(dev_path, O_RDWR | O_NOCTTY | O_NONBLOCK);
      if(fd < 0){
        return -1;
      }
      struct serial_struct serial;
      ret = ioctl(fd, TIOCGSERIAL, &serial);
      if (ret != 0) {
        close(fd);
        return -2;
      }+
      serial.xmit_fifo_size = 1024*1024; //1M
      ret = ioctl(fd, TIOCSSERIAL, &serial);
      if(ret != 0) {
        close(fd);
        return -3;
      }
      close(fd);
      return 0;
    }
    
    展开全文
  • 串口环形缓冲区.zip

    2021-02-01 11:39:45
    在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。   在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和...
  • #include/* 缓冲区大小 */#define SERIAL_BUFFER_SIZE 250/* 错误代码:取负值是为了与正常数值区别开来 */#define CODE_SUCCESS -1#define CODE_NO_OPERATE-2#define CODE_INVALID_ARG -11#define CODE_BUFFER_...

    #include/* 缓冲区大小 */

    #define SERIAL_BUFFER_SIZE 250

    /* 错误代码:取负值是为了与正常数值区别开来 */

    #define CODE_SUCCESS -1

    #define CODE_NO_OPERATE-2

    #define CODE_INVALID_ARG -11

    #define CODE_BUFFER_OVERFLOW-12

    #define _8_BIT_SYSTEM1

    #define _16_BIT_SYSTEM0

    #define _32_BIT_SYSTEM0

    /* 数据类型:视编译器而定,GCC编译器的定义 */

    #if _8_BIT_SYSTEM

    typedef unsigned char u8;

    typedef char s8;

    typedef unsigned int u16;

    typedef int s16;

    #endif

    #if _16_BIT_SYSTEM

    typedef unsigned char u8;

    typedef char s8;

    typedef unsigned int u16;

    typedef int s16;

    typedef unsigned long u32;

    typedef long s32;

    #endif

    /* 串口缓冲区结构体定义 */

    typedef struct SerialBuffer_Str{

    u8 WriteIndex;

    u8 ReadIndex;

    u8 Buffer[SERIAL_BUFFER_SIZE];

    u8 ZeroFlag;

    }SerialBuffer_Str;

    /* 功能函数声明区 */

    s16 SerialBuffer_Init(SerialBuffer_Str *p_SBstr);

    s16 SerialBuffer_Read(SerialBuffer_Str *p_SBstr);

    s16 SerialBuffer_Write(SerialBuffer_Str *p_SBstr,u8 *p_wdata);

    /* 自测试用例声明区 */

    void SerialBuffer_Test(SerialBuffer_Str *p_SBstr);

    /*******************************************

    * 函数名:SerialBuffer_Init

    * 作用:初始化缓冲区结构体

    * 输入参数:缓冲区结构体地址

    * 输出参数:无

    * 返回值:成功则返回 -1

    *******************************************/

    s16 SerialBuffer_Init(SerialBuffer_Str *p_SBstr)

    {

    if(p_SBstr == NULL){

    /* 检查输入参数的有效性 */

    return CODE_INVALID_ARG;

    }

    p_SBstr->WriteIndex=0;

    p_SBstr->ReadIndex=1;

    /* 初始化 读索引值>写索引值(表示缓冲区为空) */

    p_SBstr->ZeroFlag=0;

    /* 标准C库函数,移植时需注意 */

    memset(p_SBstr->Buffer,0,SERIAL_BUFFER_SIZE);

    return CODE_SUCCESS;

    }

    /*******************************************

    * 函数名:SerialBuffer_Read

    * 作用:读取缓冲区中的数据

    * 说明:必须始终保持读索引值不大于写索引值(防止读到无效数据)

    * 输入参数:缓冲区结构体地址

    * 输出参数:无

    * 返回值:从缓冲区中读到的数据,异常返回为负值

    *******************************************/

    s16 SerialBuffer_Read(SerialBuffer_Str *p_SBstr)

    {

    s16 ret;

    if(p_SBstr == NULL){

    /* 检查输入参数的有效性 */

    return CODE_INVALID_ARG;

    }

    if(p_SBstr->ZeroFlag >= 2){

    /* 当写索引值归零了两次或以上,某些未读数据会被覆盖掉 */

    return CODE_BUFFER_OVERFLOW;

    }

    if((p_SBstr->ZeroFlag==1)&&(p_SBstr->WriteIndex >= p_SBstr->ReadIndex)){

    /* 当写索引值归零之后,再次超过了读索引值,某些未读数据会被覆盖掉 */

    return CODE_BUFFER_OVERFLOW;

    }

    if((p_SBstr->ZeroFlag==0) && (p_SBstr->ReadIndex > p_SBstr->WriteIndex)){

    /* 读索引值大于写索引值,表示缓冲区为空,不作任何处理*/

    return CODE_NO_OPERATE;

    }

    ret=p_SBstr->Buffer[p_SBstr->ReadIndex];

    if(p_SBstr->ReadIndex >= (SERIAL_BUFFER_SIZE-1)){

    p_SBstr->ReadIndex=0;

    p_SBstr->ZeroFlag--;

    }

    else{

    p_SBstr->ReadIndex++;

    }

    return ret;

    }

    /*******************************************

    * 函数名:SerialBuffer_Write

    * 作用:写数据到缓冲区中

    * 说明:写时不对缓冲区作任何检查,尽量简短。

    *检查放在读函数中(方便移植到中断处理函数中)

    * 输入参数1:缓冲区结构体地址

    * 输入参数2:数据的地址(某个寄存器地址)

    * 输出参数:无

    * 返回值:成功则返回 -1

    *******************************************/

    s16 SerialBuffer_Write(SerialBuffer_Str *p_SBstr,u8 *p_wdata)

    {

    if(p_SBstr == NULL){

    /* 检查输入参数的有效性 */

    return CODE_INVALID_ARG;

    }

    if(p_SBstr->WriteIndex >= (SERIAL_BUFFER_SIZE-1)){

    p_SBstr->WriteIndex=0;

    p_SBstr->ZeroFlag++;

    }

    else{

    p_SBstr->WriteIndex++;

    }

    p_SBstr->Buffer[p_SBstr->WriteIndex] = *p_wdata;

    return CODE_SUCCESS;

    }

    void main(void)

    {

    SerialBuffer_Str Uart0_Buffer_Str;

    SerialBuffer_Init(&Uart0_Buffer_Str);

    SerialBuffer_Test(&Uart0_Buffer_Str);

    }

    展开全文
  • 在工业嘈杂的生产环境中,可能发生各种意外...c#读写串口缓冲区,发送比较简单。 接收包格式:起始头+标志位+数据位+结束尾,先收到缓冲区里暂存,然后从缓冲区里检查起始位、结束尾。无效串口数据丢弃,有效数据处理。
  • 串口缓冲区 循环队列

    热门讨论 2014-09-12 09:56:18
    从项目中剥离,通信类接收数据时采用循环队列的方式。此工程在STM32F103ZET6上运行。开发环境为Keil for ARM 5.10
  • linux-----------串口设置缓冲器的大小

    千次阅读 2021-05-12 13:35:40
    转自:...

    转自:http://stackoverflow.com/questions/10815811/linux-serial-port-reading-can-i-change-size-of-input-buffer

    You want to use the serial IOCTL TIOCSSERIAL which allows changing both receive buffer depth and send buffer depth (among other things). The maximums depend on your hardware, but if a 16550A is in play, the max buffer depth is 14.

    You can find code that does something similar to what you want to do here

    一下转自:http://e2e.ti.com/support/embedded/linux/f/354/t/164893.aspx

    Hello,

    I need to send a character (acknowledgement) after reception of a telegram

    within no more than 2ms. Before beginning the real application, I wrote a

    small test program, to measure the latency. Very strange: sometimes the

    latency is about 3ms, sometimes about some �s only, but never other values,

    than these 2.

    For testing, I send about 3 times per second the telegram "abcdefghij" from

    another system to my serial interface.

    Perhaps, I need some more information about the fifos: are there tx and rx

    fifos, where and how should I configure them?

    Here is my test-program with some more detailed questions:

    /* I tried 0, 1, 10 and 16, but it does not seem to change anything... */

    #define FIFO_SIZE 1

    /* This is needed, if not, we can get up to 10ms latency. */

    #define TEST_LOW_LATENCY 1

    /* If 1, than it seems, some transmissions get lost... */

    #define TEST_OUTPUT_FLUSH 0

    /* Perhaps only useful with heavy load... */

    #define TEST_SCHED 1

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define _POSIX_SOURCE 1

    #define DEVICE "/dev/ttyS0"

    #define FRAME_SIZE 10 // "abcdefghij"

    int fd;

    void serial_init()

    {

    struct termios options;

    struct serial_struct serial;

    if((fd = open(DEVICE, O_RDWR | O_NOCTTY)) < 0){

    perror(DEVICE);

    exit(-1);

    }

    ioctl(fd, TIOCGSERIAL, &serial);

    #if TEST_LOW_LATENCY

    serial.flags |= ASYNC_LOW_LATENCY;

    #else

    serial.flags &= ~ASYNC_LOW_LATENCY;

    #endif

    serial.xmit_fifo_size = FIFO_SIZE; // what is "xmit" ??

    ioctl(fd, TIOCSSERIAL, &serial);

    tcgetattr(fd, &options);

    cfsetispeed(&options, B19200);

    cfsetospeed(&options, B19200);

    options.c_cflag &= ~(CSIZE | PARODD | CSTOPB | CRTSCTS);

    options.c_cflag |= CLOCAL | CREAD | CS8 | PARENB;

    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    options.c_iflag |= INPCK | ISTRIP;

    options.c_oflag &= ~OPOST;

    options.c_cc[VTIME] = 1;

    options.c_cc[VMIN] = FRAME_SIZE;

    tcsetattr(fd, TCSANOW, &options);

    }

    int check_frame()

    {

    char buf[FRAME_SIZE + 1];

    while(!read(fd, buf, FRAME_SIZE));

    buf[FRAME_SIZE] = '\0';

    puts(buf);

    return buf[FRAME_SIZE - 1] == 'j';

    }

    void serial_ack()

    {

    write(fd, "a", 1);

    #if TEST_OUTPUT_FLUSH

    tcflush(fd, TCOFLUSH);

    #endif

    }

    int main()

    {

    #if TEST_SCHED

    struct sched_param sched;

    sched_getparam(0, &sched);

    sched.sched_priority = 50;

    sched_setscheduler(0, SCHED_RR, &sched);

    #endif

    serial_init();

    while(1)

    if(check_frame())

    serial_ack();

    else

    puts("Error");

    return 0;

    }

    I would be glad about any hint!

    Greetings, Peter

    展开全文
  • 并非源码。封装的Qt5.12.9 Mingw32位 Release版本动态库,其他版本不可用
  • STM32进阶之串口环形缓冲区实现 FIFO,代码精简,易实现。
  • 这种处理方式是没有缓冲区的,当数量太的时候,亦或者当数据接收太快的时候,我们来不及处理已经收到的数据, 那么,当再次收到数据的时候,就会将之前还未处理的数据覆盖掉。那么就会出现丢包的现象了,对我们的...
  • 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 ...
  • 第一次接触串口,写点东西加深自己对串口的印象:通过参考一些网上的实例,我明白了串口怎么简单的进行通信交流,但是我所需要的还是图片等文件在串口中的传输,串口传输是通过二进制位进行单位传输的,所以传输...
  • 串口缓存大小设置

    2021-08-11 11:44:33
    设置 串口 软 fifo int UartBuffSizeSet(char dev_path,int size) { int ret; int fd = open(dev_path, O_RDWR | O_NOCTTY | O_NONBLOCK); if(fd < 0){ return -1; } struct serial_struct serial; ret = ioctl...
  • 由于SoftwareSerial.h默认只接收64字节串行缓冲区,Arduino会将之后接收到的数据丢弃,不满足业务需求。 以下三种方法是笔者参考网上各种资料总结出来,对于WEMOS D1 R2,笔者只有方法一可行,其他两个方法仅供参考...
  • 使用qDebug()输出信息的时候,经常会因为输出内容的大小小于缓冲区而无法显示,此时可以通过把缓冲区的大小置为0解决。 setvbuf(stdout, nullptr, _IONBF, 0); qDebug() << "hello,world" << endl;
  • STM32串口接收,环形缓冲区方式实现串口接收
  • 该例程使用eclipse IDE,演示了UART串口环形缓冲区的C语言实现代码,并将printf函数重映射到UART串口实现调试信息的打印输出。环形缓冲区的实现思路参照该链接:https://www.cnblogs.com/zengzy/p/5139582.html。...
  • STM32串口数据接收 --环形缓冲区

    千次阅读 2021-02-01 11:35:57
    STM32串口数据接收 --环形缓冲区 环形缓冲区简介   在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。   在通信程序中,...
  • 串口中断接收数据,将数据存到FIFO缓冲区(利用单链表)。代码里FIFO的进栈出栈都有写的易懂,希望对有需要的人有所帮助。
  • Arduino 利用串口缓冲区监听的方式读取数据 利用串口缓冲区监听的方式读取数据,实现该功能依赖:serialEvent()此函数。 serialEvent()特点 在程序内声明此函数后,不需要将该函数放入到主循环体内,就可以实现...
  • c++清空串口缓冲区

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

    千次阅读 2017-10-19 18:16:22
    串口使用时一般包含两个缓冲区,即发送缓冲区和接收缓冲区。发送数据时,先将数据存在发送缓冲区,然后通过串口发送;接收数据时,先将接收的数据存在接收缓冲区,然后再进行读取。   合理恰当的使用缓冲区,...
  • nrf51822硬件串口及模拟的3路串口(利用定时器产生波特率,IO口模拟RX,TX),其数据发送利用的是查询发送,数据接收利用io中断。有需要 模拟串口的可以参考
  • 清除串口接收缓冲区在C#

    千次阅读 2021-07-16 14:46:35
    Just want to know how do we clear the receive buffer of my serial port in C#. Seems like the data in the receive buffer just keep accumulating.For example, the flow of incoming data is: [Data A], [Dat...
  • C#串口数据处理--环形缓冲区-FIFO

    千次阅读 2021-08-31 12:52:23
    一、FIFO环形缓冲区初始化 static int MAX_BUFFER_LEN = 1024;//定义缓冲区大小 FIFO receiveBufferManager = new FIFO(MAX_BUFFER_LEN); 二、串口接收事件中添加写入环形缓冲 int num = serialPort1.BytesToRead; /...
  • micropython串口接收缓冲区的问题

    千次阅读 2020-03-08 02:16:56
    本来刚接触python,最近因为疫情无聊把买...这个版本的固件是比普通固件了个线程功能(虽然据说thread的API开发还不完全) 说明以上原因是我只是偶然遇到并且只在上述环境下发现并测试研究的。闲言少续,说正题...
  • 串口屏LUA教程-系统参数设置V1.0.pdf(本文将介绍通过LUA脚本设置4个系统参数的功能)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,393
精华内容 12,157
关键字:

串口缓冲区设置多大

友情链接: Es_Cms.rar