Jembatan USB ke UART murah dan tersedia, tetapi memiliki karakteristik pengaturan waktu yang sangat buruk. Newark menjual papan "Embedded Pi" yang memiliki prosesor STM32F ARM tempat Anda dapat menulis kode bare-metal. Chip itu memiliki tiga UART di atasnya, dan saya pikir mereka bisa berjalan sangat cepat; jika Anda menggunakan satu untuk berkomunikasi dengan Raspberry Pi yang akan meninggalkan dua tersedia untuk keperluan lain. Penafian: Saya telah membeli salah satu papan ini, tetapi belum menggunakan Raspberry Pi itu sendiri untuk menangani kebutuhan I / O secara langsung.
Jika Anda ingin banyak UART yang lebih lambat, STM32F pada board Pi Tertanam mungkin dapat menangani angka yang wajar, terutama jika Anda bersedia menulis beberapa bahasa rakitan Arm. Jika ada dua kelompok 16 pin I / O yang tersedia pada satu papan, dimungkinkan untuk memiliki 16 perangkat lunak UART simultan yang semuanya bekerja sekaligus dengan kecepatan baud yang cukup baik (memiliki interupsi berkala pada 3x atau 5x baud rate yang menyimpan Nilai latch 16-bit dari port terima ke buffer, dan output nilai 16-bit yang sudah dikomputasi dari buffer ke port transmit; jika Anda melakukan ini, maka berikan waktu servis rata-rata untuk perangkat lunak UART yang tidak terlalu besar, itu tidak masalah jika ada hit terburuk yang terjadi sesekali (mis. semua enam belas port menerima byte secara bersamaan).
Pendekatan ini sebenarnya dapat bekerja sangat efisien untuk menerima, karena kode "kasus umum" bahkan tidak harus melihat masing-masing UART. Misalkan Anda mengambil sampel data sebesar 5x, dan 47 byte terakhir dari buffer digandakan segera sebelum itu. Dengan asumsi data ditulis ke buffer dalam urutan menaik, Anda dapat memeriksa apakah byte telah diterima sepenuhnya di salah satu dari 16 saluran dengan hanya mengatakan:
bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);
Jika bytes_ready
nol, tidak ada data yang diterima. Kalau tidak, jika mis. Bit 2 bytes_ready
diset, itu berarti bahwa byte data yang diterima dapat ditemukan dalam bit 2 data [rx_ptr-40], data [rx_ptr-35], data [rx_ptr-30], dll. Sekali orang mengambil data, hapus bit 2 dari bersenjata_flag dan atur agar data diatur ulang setelah sekitar 44 sampel.
Pendekatan ini akan membutuhkan sedikit kerja pada sampel-sampel tersebut di mana satu byte data diterima sepenuhnya (dan berpotensi banyak pekerjaan jika semua 16 saluran memiliki satu byte data tiba sekaligus) tetapi pada sebagian besar sampel jumlah pekerjaan akan sangat sedikit. Jika seseorang memiliki 64 pin I / O, seseorang dapat menangani hingga 32 UART menggunakan pendekatan ini tanpa menambahkan pekerjaan tambahan untuk kasus "umum".