关于串口缓冲区几个问题
关于缓冲区第一个问题串口缓冲区默认大小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; 本帖最后由 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.
但原來 對輸入 輸出 都有設定的, 是我自己沒看清楚, 攪錯了, 還誤導你了.
#if defined(USBCON)
ring_buffer rx_buffer = { { 0 }, 0, 0};
ring_buffer tx_buffer = { { 0 }, 0, 0};
#endif
#if defined(UBRRH) || defined(UBRR0H)
ring_buffer rx_buffer={ { 0 }, 0, 0 };
ring_buffer tx_buffer={ { 0 }, 0, 0 };
#endif
#if defined(UBRR1H)
ring_buffer rx_buffer1={ { 0 }, 0, 0 };
ring_buffer tx_buffer1={ { 0 }, 0, 0 };
#endif
#if defined(UBRR2H)
ring_buffer rx_buffer2={ { 0 }, 0, 0 };
ring_buffer tx_buffer2={ { 0 }, 0, 0 };
#endif
#if defined(UBRR3H)
ring_buffer rx_buffer3={ { 0 }, 0, 0 };
ring_buffer tx_buffer3={ { 0 }, 0, 0 };
#endif Super169 发表于 2016-9-9 10:33
你想太多了, 在 arudino 的 serial 輸出是沒有媛沖的.
SERIAL_BUFFER_SIZE
这是什么? 本帖最后由 Super169 于 2016-9-13 11:40 编辑
suoma 发表于 2016-9-9 20:09
SERIAL_BUFFER_SIZE
这是什么?
這次想得太少了。。。。。
既然輸出沒有緩衝, 那這個媛衝還可以有什麼用?
SERIAL_BUFFER_SIZE 就是設定這個媛衝的大小。
唉... 自己攪錯了.不好意思.把原文改暗, 以免再誤導他人. Super169 发表于 2016-9-10 01:46
這次想得太少了。。。。。
既然輸出沒有緩衝, 那這個媛衝還可以有什麼用?
arudino 的 serial 輸出是沒有媛沖的
SERIAL_BUFFER_SIZE 就是設定這個媛衝的大小
没有缓冲还要设定缓冲区大小?还是设定其他缓冲区大小? 本帖最后由 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 好像不會自動報錯的. 本帖最后由 Super169 于 2016-9-13 11:54 编辑
新版本 (好像是 1.5.X 開始) 已把兩者分開:
#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_TX_BUFFER_SIZE 16
#else
#define SERIAL_TX_BUFFER_SIZE 64
#endif
#endif
#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif Super169 发表于 2016-9-13 11:38
新版本 (好像是 1.5.X 開始) 已把兩者分開:
#define SERIAL_TX_BUFFER_SIZE 16
#define SERIAL_TX_BUFFER_SIZE 64
我在1.0看到记得是这样 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 的:
// 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.
#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif Super169 发表于 2016-9-13 19:54
應該不是, 在 1.0.6 還是造樣的沒有分開 RX 及 TX 的:
嗯,对的。这两天串口数据的SD卡数据存储搞得头有点大
页:
[1]