极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15554|回复: 9

关于串口缓冲区几个问题

[复制链接]
发表于 2016-9-7 16:06:38 | 显示全部楼层 |阅读模式
关于缓冲区第一个问题
串口缓冲区默认大小64B,但是如下图片说最大缓冲128B,不是说缓冲区大小可以自定义,只要不超过RAM大小就行。这两个哪个是对的?

第二个问题:
HardwareSerial.cpp里只有SERIAL_BUFFER_SIZE,没有区分RX和TX,怎么理解呢?如果是SERIAL_BUFFER_SIZE 64,是RX TX分别64吗?
第三个问题:
串口缓冲区大小定义和网络扩展板缓冲区大小定义都是占用RAM空间,假设两个缓冲区同时溢出,报错是否相同?如果定义一个故障灯代码来表示报错的话,理论上哪个报错优先?
假设网络上传来的数据都要进入串口缓冲区和网络缓冲区,从内存操作方面考虑,最先优先进入哪个缓冲区?
#define SERIAL_BUFFER_SIZE 64字段
网络扩展板中见程序中有定义缓冲区大小
byte Ethernet::buffer[700];   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-9-9 10:33:15 | 显示全部楼层
本帖最后由 Super169 于 2016-9-13 12:06 编辑

你想太多了, 在 arudino 的 serial 輸出是沒有媛沖的.

不好意思, 這是錯誤的.  把原文改暗, 以免再誤導他人.

源碼中的說明是針對 incoming serial data:

// Define constants and variables for buffering incoming serial data.  We're
// using a ring buffer (I think), in which head is the index of the location
// to which to write the next incoming character and tail is the index of the
// location from which to read.

但原來 對輸入 輸出 都有設定的, 是我自己沒看清楚, 攪錯了, 還誤導你了.

  1. #if defined(USBCON)
  2.   ring_buffer rx_buffer = { { 0 }, 0, 0};
  3.   ring_buffer tx_buffer = { { 0 }, 0, 0};
  4. #endif
  5. #if defined(UBRRH) || defined(UBRR0H)
  6.   ring_buffer rx_buffer  =  { { 0 }, 0, 0 };
  7.   ring_buffer tx_buffer  =  { { 0 }, 0, 0 };
  8. #endif
  9. #if defined(UBRR1H)
  10.   ring_buffer rx_buffer1  =  { { 0 }, 0, 0 };
  11.   ring_buffer tx_buffer1  =  { { 0 }, 0, 0 };
  12. #endif
  13. #if defined(UBRR2H)
  14.   ring_buffer rx_buffer2  =  { { 0 }, 0, 0 };
  15.   ring_buffer tx_buffer2  =  { { 0 }, 0, 0 };
  16. #endif
  17. #if defined(UBRR3H)
  18.   ring_buffer rx_buffer3  =  { { 0 }, 0, 0 };
  19.   ring_buffer tx_buffer3  =  { { 0 }, 0, 0 };
  20. #endif
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-9 20:09:47 | 显示全部楼层
Super169 发表于 2016-9-9 10:33
你想太多了, 在 arudino 的 serial 輸出是沒有媛沖的.

SERIAL_BUFFER_SIZE
这是什么?
回复 支持 反对

使用道具 举报

发表于 2016-9-10 01:46:55 | 显示全部楼层
本帖最后由 Super169 于 2016-9-13 11:40 编辑
suoma 发表于 2016-9-9 20:09
SERIAL_BUFFER_SIZE
这是什么?


這次想得太少了。。。。。
既然輸出沒有緩衝, 那這個媛衝還可以有什麼用? 

SERIAL_BUFFER_SIZE 就是設定這個媛衝的大小。


唉... 自己攪錯了.  不好意思.  把原文改暗, 以免再誤導他人.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-10 20:33:26 | 显示全部楼层
Super169 发表于 2016-9-10 01:46
這次想得太少了。。。。。
既然輸出沒有緩衝, 那這個媛衝還可以有什麼用? 

arudino 的 serial 輸出是沒有媛沖的
SERIAL_BUFFER_SIZE 就是設定這個媛衝的大小
没有缓冲还要设定缓冲区大小?还是设定其他缓冲区大小?
回复 支持 反对

使用道具 举报

发表于 2016-9-13 11:24:46 | 显示全部楼层
本帖最后由 Super169 于 2016-9-13 11:59 编辑
suoma 发表于 2016-9-10 20:33
arudino 的 serial 輸出是沒有媛沖的
SERIAL_BUFFER_SIZE 就是設定這個媛衝的大小
没有缓冲还要设定 ...


是我自己攪錯了, 輸出 輸入都有的.

在舊版本, 只有 SERIAL_BUFFER_SIZE, 是設定 ring_buffer 內的 buffer 大小,  而 rx 及 tx 都有設定 ring_buffer.  所以是相同大小的.
而 Serial.available 是指在輸入的緩衝中, 儲存了的數據多少.

至於報錯....buffer overflow 好像不會自動報錯的.  
回复 支持 反对

使用道具 举报

发表于 2016-9-13 11:38:18 | 显示全部楼层
本帖最后由 Super169 于 2016-9-13 11:54 编辑

新版本 (好像是 1.5.X 開始) 已把兩者分開:

  1. #if !defined(SERIAL_TX_BUFFER_SIZE)
  2. #if ((RAMEND - RAMSTART) < 1023)
  3. #define SERIAL_TX_BUFFER_SIZE 16
  4. #else
  5. #define SERIAL_TX_BUFFER_SIZE 64
  6. #endif
  7. #endif
  8. #if !defined(SERIAL_RX_BUFFER_SIZE)
  9. #if ((RAMEND - RAMSTART) < 1023)
  10. #define SERIAL_RX_BUFFER_SIZE 16
  11. #else
  12. #define SERIAL_RX_BUFFER_SIZE 64
  13. #endif
  14. #endif
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-13 19:45:59 | 显示全部楼层
Super169 发表于 2016-9-13 11:38
新版本 (好像是 1.5.X 開始) 已把兩者分開:

#define SERIAL_TX_BUFFER_SIZE 16
#define SERIAL_TX_BUFFER_SIZE 64
我在1.0看到记得是这样
回复 支持 反对

使用道具 举报

发表于 2016-9-13 19:54:15 | 显示全部楼层
suoma 发表于 2016-9-13 19:45
#define SERIAL_TX_BUFFER_SIZE 16
#define SERIAL_TX_BUFFER_SIZE 64
我在1.0看到记得是这样

應該不是, 在 1.0.6 還是造樣的沒有分開 RX 及 TX 的:

  1. // Define constants and variables for buffering incoming serial data.  We're
  2. // using a ring buffer (I think), in which head is the index of the location
  3. // to which to write the next incoming character and tail is the index of the
  4. // location from which to read.
  5. #if (RAMEND < 1000)
  6.   #define SERIAL_BUFFER_SIZE 16
  7. #else
  8.   #define SERIAL_BUFFER_SIZE 64
  9. #endif
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-13 20:54:14 | 显示全部楼层
Super169 发表于 2016-9-13 19:54
應該不是, 在 1.0.6 還是造樣的沒有分開 RX 及 TX 的:

嗯,对的。这两天串口数据的SD卡数据存储搞得头有点大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-4 00:01 , Processed in 0.053244 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表