Làm thế nào để Arduino xử lý tràn bộ đệm nối tiếp? Liệu nó có vứt bỏ dữ liệu mới nhất hoặc cũ nhất? Bộ đệm có thể chứa bao nhiêu byte?
Làm thế nào để Arduino xử lý tràn bộ đệm nối tiếp? Liệu nó có vứt bỏ dữ liệu mới nhất hoặc cũ nhất? Bộ đệm có thể chứa bao nhiêu byte?
Câu trả lời:
Đối với các cổng nối tiếp phần cứng, bạn có thể thấy trong Phần cứngSerial.cpp rằng kích thước bộ đệm thay đổi tùy thuộc vào dung lượng RAM có sẵn trên AVR cụ thể:
#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif
Đối với cổng nối tiếp phần mềm trong SoftwareSerial.h kích thước bộ đệm bộ thu _SS_MAX_RX_BUFF
được xác định là 64 byte. Trong cả hai trường hợp, nó dừng cố gắng chèn dữ liệu đã nhận vào hàng đợi khi nó đầy, do đó bạn có thể nhận được kết hợp với dữ liệu cũ và mới tùy thuộc vào cách bạn truy xuất dữ liệu từ hàng đợi.
Lý tưởng nhất là tốt nhất để đảm bảo bộ đệm luôn được dọn sạch một cách kịp thời để tránh làm đầy bộ đệm. Có thể xem bộ tính giờ và thực hiện một máy trạng thái đơn giản nếu vấn đề của bạn liên quan đến mã khác chặn vòng lặp chính.
Bạn có thể thấy từ nguồn của Phần cứngSerial rằng nếu một byte đến tìm thấy bộ đệm vòng đầy thì nó sẽ bị loại bỏ:
inline void store_char(unsigned char c, ring_buffer *buffer)
{
int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;
// if we should be storing the received character into the location
// just before the tail (meaning that the head would advance to the
// current location of the tail), we're about to overflow the buffer
// and so we don't write the character or advance the head.
if (i != buffer->tail) {
buffer->buffer[buffer->head] = c;
buffer->head = i;
}
}
Tôi có ấn tượng rằng nếu tôi truyền dữ liệu tới Arduino và không có "trình kéo" dữ liệu đang hoạt động ở phía Arduino thì nếu có nhiều dữ liệu đến hơn có thể nằm gọn trong bộ đệm, nó sẽ bị loại bỏ. Bạn có thể xác nhận điều đó?
Có nó sẽ bị loại bỏ. Không có kiểm soát luồng phần mềm hoặc phần cứng, trừ khi bạn tự thực hiện.
Tuy nhiên, với bộ đệm 64 byte và nhận dữ liệu ở (giả sử) 9600 baud, bạn nhận được một byte mỗi 1,04 ms, và do đó, phải mất 66,6 ms để lấp đầy bộ đệm. Trên bộ xử lý 16 MHz, bạn sẽ có thể kiểm tra bộ đệm đủ thường xuyên để nó không lấp đầy. Tất cả những gì bạn thực sự phải làm là chuyển dữ liệu từ bộ đệm Phần cứng sang của riêng bạn, nếu bạn không muốn xử lý nó ngay bây giờ.
Bạn có thể thấy từ #if (RAMEND < 1000)
kiểm tra rằng bộ xử lý có hơn 1000 byte RAM có bộ đệm 64 byte hay không, những bộ xử lý sẽ ít RAM hơn có bộ đệm 16 byte.
Dữ liệu bạn viết được đặt trong bộ đệm có cùng kích thước (16 hoặc 64 byte). Trong trường hợp gửi nếu bộ đệm lấp đầy mã "khối" đang chờ một ngắt để gửi byte tiếp theo ra khỏi cổng nối tiếp.
Nếu các ngắt bị tắt thì điều này sẽ không bao giờ xảy ra, do đó bạn không thực hiện in nối tiếp bên trong Định tuyến dịch vụ ngắt.
1/960 = 0.001042 s
- đó là một byte mỗi 1,04 ms.