Pertanyaan Bagaimana cara mengatur baud rate khusus di Linux?


Saya ingin berkomunikasi melalui port serial saya di Linux ke perangkat dengan baud rate non-standar yang tidak didefinisikan dalam termios.h.

Saya mencoba metode "baud rate aliasing" posting ini, tetapi ketika saya menjalankan program-C saya (saya beri nama "testprogram"), kata Linux "testprogram sets custom speed on ttyS0. This is deprecated."

Saya melakukan pencarian di Google, dan tampaknya ada metode lain (yang lebih baru?) Untuk mengubah baud rate ke nilai non-standar: Aktif http://sourceware.org/ml/libc-help/2009-06/msg00016.html penulis mengatakan bahwa c_flag dari struct termios harus OR BOTHER (=CBAUDEX | B0). Dengan metode ini, baud rate ditetapkan secara langsung di c_ispeed dan c_ospeed-anggota dari struct termios. Namun, saya tidak tahu bagaimana saya menggunakan metode ini dalam program-C saya. Seperti yang dikatakan penulis, tidak ada BOTHER ditentukan / tersedia ketika saya termasuk termios.h, jadi apa yang harus dilakukan untuk mengatur baud rate dengan cara ini?

Bagaimana saya bisa mengatur baud rate ke nilai non-standar tanpa mengubah kernel?


32
2017-09-28 19:39


asal


Jawaban:


Saya memperhatikan hal yang sama tentang BOTHER yang tidak didefinisikan. Seperti yang dikatakan Jamey Sharp, Anda dapat menemukannya <asm/termios.h>. Hanya peringatan, saya pikir saya mengalami masalah termasuk masalah itu dan reguler <termios.h> file pada saat bersamaan.

Selain itu, saya menemukan dengan glibc yang saya miliki, itu masih tidak berhasil karena tcsetattr glibc sedang melakukan ioctl untuk versi lama dari struct termios yang tidak memperhatikan pengaturan kecepatan. Saya dapat mengatur kecepatan khusus dengan secara manual melakukan ioctl dengan struct gaya termios2 baru, yang juga harus tersedia dengan menyertakan <asm/termios.h>:

struct termios2 tio;

ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 12345;
tio.c_ospeed = 12345;
ioctl(fd, TCSETS2, &tio);

19
2017-11-15 02:32



Anda dapat menetapkan baud rate khusus menggunakan stty perintah di Linux. Misalnya, untuk menetapkan baud rate khusus sebesar 567890 pada port serial / dev / ttyX0 Anda, gunakan perintah:

stty -F /dev/ttyX0 567890

13
2017-12-11 11:33



dougg3 memiliki ini cukup banyak (saya tidak bisa berkomentar di sana). Hal tambahan utama yang perlu Anda ketahui adalah header yang tidak bertentangan satu sama lain tetapi memberikan prototipe yang benar. Jawabannya adalah

#include <stropts.h>
#include <asm/termios.h>

Setelah itu Anda dapat menggunakan kode dougg3, sebaiknya dengan pengecekan error sepanjang panggilan ioctl (). Anda mungkin perlu menempatkan ini dalam file .c terpisah ke kode port serial lainnya yang menggunakan termios normal untuk mengatur parameter lainnya. Melakukan manipulasi POSIX pertama, maka ini untuk mengatur kecepatan khusus, berfungsi dengan baik pada UART bawaan Raspberry Pi untuk mendapatkan baud rate 250k.


3
2018-02-22 20:49



BOTHER tampaknya tersedia dari <asm/termios.h> di Linux. Menarik definisi dari sana akan menjadi sangat tidak portabel, tapi saya menganggap API ini tidak portabel, jadi mungkin tidak ada kerugian besar.


0
2017-11-05 06:39



Ada chip I / O serial pada CPU motherboard Anda (16650 UART). Chip ini menggunakan port 8-bit sebagai kontrol dan bus data, dan dengan demikian Anda dapat mengeluarkan perintah melalui menulis ke chip ini melalui kontrol dan bus data.

Biasanya, aplikasi melakukan langkah-langkah berikut pada port serial

  1. Atur baud rate, paritas, encoding, kontrol aliran, dan panjang urutan awal / akhir selama memulai program. Pengaturan ini dapat dilakukan melalui ioctl ke perangkat serial atau perintah 'stty'. Bahkan, perintah stty menggunakan ioctl ke perangkat serial itu.
  2. Tulis karakter data ke perangkat serial dan driver akan menulis data charaters ke chip UART melalui bus data 8-bit.

Singkatnya, Anda dapat menentukan baud rate hanya dalam perintah STTY, dan kemudian semua opsi lainnya akan disimpan sebagai default, dan seharusnya cukup untuk terhubung ke perangkat ohter.


0
2017-12-14 06:56



Untuk pengguna Mac (mungkin juga untuk beberapa Distribusi Linux)

stty ospeed 999999

stty ispeed 999999

0
2017-11-19 21:58