Mengapa saya tidak berhasil mengirim pesan melalui RS232?

9

Jadi minggu lalu saya telah bekerja untuk mendapatkan pesan UART yang dikirim dari STM32F407 dan membacanya di laptop saya melalui kabel RS232 ugreen ke USB menggunakan rayap.

Saya telah menggunakan STMCube untuk menghasilkan kode dan menambahkannya dengan membaca instruksi yang relevan di bagian atas file "stm32f4xx_hal_uart.c" (dan menonton banyak video dan membaca online).

Saya telah memeriksa pesan yang dikirim pada osiloskop dan cocok dengan representasi ASCII-nya.

Misalnya saya mengirim 'Q' yaitu 0101 0001, saya menerima 'W' yaitu 0101 0111. Pembacaan pada ruang lingkup menunjukkan:

masukkan deskripsi gambar di sini

Output rayap untuk sinyal yang sama seperti yang ditampilkan pada osiloskop. masukkan deskripsi gambar di sini

Saya telah mengkonfirmasi baud rate / parity / HWcontrol cocok dengan rayap dan dalam kode saya.

Untuk menerima karakter yang benar, saya telah mencoba menurunkan dan meningkatkan baud rate.
Saya sudah mencoba set karakter yang berbeda untuk mencoba menemukan pola yang menyebabkan karakter yang salah ditampilkan.
Selain itu saya telah mencoba berbagai terminal seperti pada Putty atau Teraterm.

FeraTaTa
sumber
8
Apakah "RS232 to USB cable" Anda berfungsi dengan level tegangan RS232 atau level tegangan "TTL", dan apakah papan STM32F407 Anda menggunakan driver / penerima yang sesuai untuk level tersebut? Saya hampir yakin jawaban untuk pertanyaan 2 adalah "Tidak", karena jika saya menafsirkan jejak lingkup Anda melalui filter "level & polaritas" yang salah, saya melihat "W" juga. Kemungkinan papan Anda tidak memiliki perangkat keras driver / penerima (jadi gunakan level TTL) dan "RS232 to USB cable" Anda memiliki perangkat keras driver / penerima RS232 (jadi gunakan level RS232).
brhans
3
Mencoba beberapa karakter yang berbeda akan mengonfirmasi hipotesis @brhans secara instan. Mengirim karakter yang sama berulang kali sambil mengharapkan hasil yang berbeda adalah salah satu definisi dari kegilaan ...
Dave Tweed
3
FeraTaTa - Hanya satu titik yang saya pikir belum disebutkan sejauh ini: Pada pandangan pertama, jejak lingkup Anda menunjukkan sinyal yang tampaknya menganggur pada 0V (lihat 1simbol dengan latar belakang kuning di sebelah kiri jejak - itu tingkat 0V) dan kemudian pulsa di bawah 0V. Itu tidak akan benar untuk sinyal logika langsung dari STM32 dan, memang, itu tidak benar. Melihat di sudut kiri bawah, Anda telah mengatur saluran 1 ke kopling AC (itu ~simbol yang Anda lihat di sana). Sinyal benar-benar idle tinggi dan berdenyut di sekitar 0V. Gunakan kopling DC untuk tampilan yang sehat dari sinyal itu.
SamGibson

Jawaban:

22

Anda telah melewatkan detail utama RS232. Tingkat logika adalah sebagai berikut:

masukkan deskripsi gambar di sini

Gambar 1. Level sinyal RS232. Sumber: Wikimedia Commons .

  • Logika 1 = -3 hingga -12 V.
  • Logika 0 = +3 hingga +12 V.
  • Antara -3 dan +3 level logika tidak terdefinisi.
  • Bit mulai RS232 adalah logika 0.

Untuk mengkonversi dari logika TTL (5 V) ke RS232 diperlukan driver. Chip seperti MAX232 melakukan inversi level logika dan meningkatkan voltase untuk Anda.

Dimungkinkan untuk "menipu" kadang-kadang dan memasukkan sinyal TTL ke input RS232 asalkan level logika dibalik. Keandalan metode ini tergantung pada chip yang digunakan pada input RS232.

masukkan deskripsi gambar di sini

Gambar 2. Bentuk gelombang yang ditransmisikan. Di atas adalah pola bit dari'Q 'yang Anda kirimkan. Di bagian bawah adalah bagaimana input RS232 membacanya.

Perhatikan bahwa input RS232 mencari tepi positif untuk menunjukkan bit mulai. Ini tidak terjadi sampai bit kedua dari data Anda sehingga semuanya sesudahnya adalah sedikit ke kanan dan terbalik seperti yang dilihat penerima. Jika beruntung, MSB Anda adalah tingkat logika yang benar untuk bit berhenti sehingga penerima menafsirkannya sebagai bingkai yang valid, mendekodekannya dan menampilkan 'W'.

Untuk tujuan pengujian Anda dapat membalikkan output TTL Anda. Ini mungkin akan berfungsi karena "berfungsi" saat ini.

masukkan deskripsi gambar di sini

Gambar 3. Chip MAX232 menggunakan kapasitor di sirkuit pompa pengisian untuk meningkatkan pasokan 5 V untuk level RS232.

Untuk keandalan, tambahkan chip MAX232 untuk mengirim dan menerima sinyal level RS232 yang tepat.

Transistor
sumber
3
Sebagai alternatif yang lebih baik, tersedia kabel USB ke TTL UART. Jika OP menggunakan adaptor USB, tidak ada gunanya menambahkan chip tambahan untuk level-shifting.
Graham
1
RS-232 adalah logika 0 = bipolar V + yang berarti> 2V dan ambang batas TTL dari tipuan 1.5V. dalam CMOS seperti 74HCTxx dengan histeresis kecil (50mV ??)
Tony Stewart Sunnyskyguy EE75
6
Tolong, dalam bahasa Inggris, Tony?
Transistor
3
Itu bahasa Inggris ke EE, bagian mana yang tidak Anda mengerti? RS232 adalah -V saat idle dan> + 2V saat start tetapi logika negatif terhadap tegangan (0 = V +, 1 = V-) untuk data dan berhenti pada V-. Saya yakin Anda tidak tahu ambang RS-232 adalah 1,4 ~ 1,5V
Tony Stewart Sunnyskyguy EE75
8
Terima kasih, Tony. Itu jauh lebih mudah dibaca dan masuk akal. Anda mengabaikan tanda baca, kata kunci, dan kata sambung pada terlalu banyak balasan cepat Anda. Saya orang tua seperti Anda dengan EE hampir empat dekade. Gambar 1 saya menunjukkan tegangan ambang untuk RX. Lihat juga Omega , Analog , Wikipedia dan Maxim . Semua status ± 5 V untuk TX dan ± 3 V untuk RX.
Transistor
7

Mempertimbangkan angkut pendek dan laju bit rendah 9600, level TTL dan CMOS berfungsi dengan baik. Masalahnya fasih rinci oleh @ Transistor adalah bahwa data UART adalah logika negatif 0 ~ 5V dan RS-232 adalah logika positif +/- Vf antara +/- 3 dan +/- 15V (?)

Karena itu seperti yang ia sarankan, inverter akan berfungsi.

Masalahnya bukan masalah laju kesalahan bit (BER) atau integritas sinyal, tetapi logika terbalik.

Juga, "zona abu-abu" adalah untuk margin kebisingan jarak jauh. Ini bukan <+/- 3V untuk Anda karena kabel Anda pendek. Ambang logika aktual RS-232 Rx persis sama dengan TTL lama (dua tetes Vbe) atau 1,4V +/- 20% (?) Toleransi.

Mereka menyebutnya zona abu-abu untuk memenuhi semua jarak dan spesifikasi baud rate karena gangguan kebisingan dan dering tepi.

Untuk kabel yang lebih panjang, dapatkan MAX232. Variasi mungkin tergantung pada kecepatan dan fitur tegangan.

Tony Stewart Sunnyskyguy EE75
sumber