Arduino seri tampon taşmasını nasıl işlemektedir? En yeni gelen mi yoksa en eski olanı mı atıyor? Arabellek kaç bayt tutabilir?
Arduino seri tampon taşmasını nasıl işlemektedir? En yeni gelen mi yoksa en eski olanı mı atıyor? Arabellek kaç bayt tutabilir?
Yanıtlar:
Donanım seri bağlantı noktaları için, HardwareSerial.cpp’te , arabellek boyutunun belirli AVR’de bulunan RAM miktarına bağlı olarak değiştiğini görebilirsiniz :
#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif
SoftwareSerial.h içindeki bir yazılım seri portu için alıcı tampon büyüklüğü _SS_MAX_RX_BUFF
64 bayt olarak tanımlanır. Her iki durumda da, doluyken alınan verileri kuyruğa girmeyi denemeyi durdurur, böylece sıradan verileri nasıl aldığınıza bağlı olarak eski ve yeni verilere bir karışım elde edebilirsiniz.
İdeal olarak, tampon dolumunu önlemek için tamponun her zaman hızlı bir şekilde boşaltılmasını sağlamak en iyisi olacaktır. Sorununuz ana döngüyü engelleyen diğer kodlarla ilgiliyse, zamanlayıcılara ve basit bir durum makinesine bakabilirsiniz.
HardwareSerial kaynağından, gelen bir baytın yüzük arabelleğini dolu bulduğunda, atıldığını görebilirsiniz:
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;
}
}
Arduino'ya veri ilettiğimde ve Arduino tarafında aktif bir "çekiciye" sahip olmadığımda, tamponun sığabileceğinden daha fazla veri geldiğinde, atılacağı izlenimini edindim. Bunu onaylayabilir misin?
Evet atılacak. Kendinizinkini uygulamadığınız sürece yazılım ya da donanım akış kontrolü yoktur.
Bununla birlikte, 64 baytlık bir tamponla ve (örneğin) 9600 baud'dan veri alarak, her 1.04 ms'de bir bayt alırsınız ve bu nedenle tamponu doldurmak 66.6 ms sürer. 16 MHz'lik bir işlemcide, arabellek doldurmayacak kadar sık sık kontrol edebilmelisiniz. Yapmanız gereken tek şey, şu anda işlemek istemiyorsanız, verileri HardwareSerial arabelleğinden kendinize taşımak.
Sen görebilirsiniz #if (RAMEND < 1000)
olanlar daha az RAM 16 bayt tampon alacak, RAM 1000+ byte ile işlemciler 64 baytlık tampon olsun o çek.
Yazdığınız veriler aynı boyutta bir arabellekte (16 veya 64 bayt) yerleştirilir. Arabellek, "bloklar" kodunu doldurursa gönderilmesi durumunda, bir sonraki baytı seri porttan göndermek için bir ara verilmesini bekler.
Kesmeler asla olmayacak bu kapatılırsa, böylece do not bir kesme hizmet yordamı içine Seri baskılar yapmak.
1/960 = 0.001042 s
- bu her 1.04 ms'de bir bayttır.