USB'den UART'a köprüler ucuz ve kolayca temin edilebilir, ancak gerçekten kötü zamanlama özelliklerine sahiptir. Newark, üzerine metal kod yazabileceğiniz bir STM32F ARM işlemciye sahip bir "Gömülü Pi" kartı satıyor. Bu çipte üç tane UART var ve bence oldukça hızlı gidebilirler; Ahududu Pi ile iletişim kurmak için bir tane kullanacak olsaydınız, bu iki kişiyi başka amaçlar için hazır bırakır. Feragatname: Bu panolardan birini satın aldım, ancak henüz basitçe doğrudan G / Ç gereksinimlerini karşılamak için Raspberry Pi'nin kendisini kullandım.
Çok daha yavaş UART'lar istiyorsanız, Gömülü Pi kartındaki STM32F, özellikle de bazı Arm assembly dili yazmaya istekliyseniz, muhtemelen makul bir rakamı kullanabilir. Tek bir kartta iki grup 16 G / Ç pimi varsa, aynı anda 16 UART'ın bir kerede oldukça iyi bir baud hızında çalıştığı UART'lara sahip olmak mümkün olabilir (3x veya 5x'te saklanan baud hızında periyodik olarak kesme olabilir) Alıcı porttan bir tampon belleğe 16 bitlik mandallanmış değerler ve tampondan iletim portuna 16 bitlik önceden hesaplanmış değerler verir, eğer bunu yaparsanız, o zaman UART yazılımı için ortalama servis süresi çok iyi olmaz. Arada bir en kötü durum isabetinin gerçekleşip gerçekleşmeyeceği önemli değildir (örneğin, on altı portun tümü aynı anda bayt alır).
"Ortak durum" kodunun bireysel UART'lara bakması gerekmediğinden, bu yaklaşım almak için oldukça etkili bir şekilde çalışabilir. Verileri 5x örnekleme yaptığınızı ve arabelleğin son 47 baytının hemen önce çoğaltıldığını varsayalım. Verilerin arabelleğe artan sırada yazıldığını varsayarsak, şunu söyleyerek 16 kanaldan herhangi birinde herhangi bir baytın tam olarak alındığını kontrol edebilirsiniz:
bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);
Eğer bytes_ready
sıfırdır, hiçbir veri alındı. Aksi taktirde, örneğin bit 2'si bytes_ready
ayarlanmışsa, bu, alınan veri baytının veri bit 2'sinde [rx_ptr-40], veri [rx_ptr-35], veri [rx_ptr-30], vb. Bulunabileceği anlamına gelir. Veriler, armed_flag'ın bit 2'sini temizleyin ve yaklaşık 44 örnekten sonra yeniden ayarlanmasını ayarlayın.
Bu yaklaşım, bir bayt verisinin tamamen alındığı örnekler üzerinde biraz çalışmayı gerektirir (ve 16 kanalın hepsinde bir bayt verisinin bir defada gelmesi durumunda potansiyel olarak çok fazla çalışma), ancak çoğu numunede iş miktarı çok fazla olacaktır. hafif. Birinin 64 G / Ç iğnesi varsa, bu yaklaşımı kullanarak "ortak" duruma herhangi bir ek çalışma yapmadan 32'ye kadar UART işleyebilir.