Tại sao tôi không thể gửi thành công tin nhắn qua RS232?


9

Vì vậy, tuần vừa qua tôi đã làm việc để nhận các tin nhắn UART được gửi từ STM32F407 và đọc nó trên máy tính xách tay của tôi thông qua cáp USB từ ugreen đến USB bằng cách sử dụng mối.

Tôi đã sử dụng STMCube để tạo mã và thêm vào nó bằng cách đọc các hướng dẫn liên quan ở đầu tệp "stm32f4xx_hal_uart.c" (và xem nhiều video và đọc trực tuyến).

Tôi đã kiểm tra thông điệp truyền đi trên máy hiện sóng và nó phù hợp với đại diện ASCII của nó.

Ví dụ: tôi gửi 'Q' là 0101 0001, tôi nhận được 'W' là 0101 0111. Việc đọc trên phạm vi hiển thị:

nhập mô tả hình ảnh ở đây

Đầu ra mối cho tín hiệu tương tự như hiển thị trên máy hiện sóng. nhập mô tả hình ảnh ở đây

Tôi đã xác nhận tốc độ baud / parity / HWcontrol phù hợp với mối và trong mã của tôi.

Để nhận được ký tự chính xác, tôi đã thử hạ thấp và tăng tốc độ baud.
Tôi đã thử các bộ ký tự khác nhau để cố gắng tìm một mẫu khiến các ký tự sai được hiển thị.
Ngoài ra, tôi đã thử các thiết bị đầu cuối khác nhau như trên Putty hoặc Teraterm.


8
"Cáp nối với USB" của bạn có hoạt động với các mức điện áp RS232 hoặc các mức điện áp "TTL" không, và bảng STM32F407 của bạn có sử dụng trình điều khiển / bộ thu phù hợp cho các mức đó không? Tôi gần như chắc chắn câu trả lời cho câu hỏi 2 là "Không", bởi vì nếu tôi diễn giải dấu vết phạm vi của bạn thông qua bộ lọc "mức sai & độ phân cực", tôi cũng thấy "W". Rất có thể bo mạch của bạn không có phần cứng trình điều khiển / bộ thu (vì vậy sử dụng các mức TTL) và "cáp nối với USB" của bạn có phần cứng trình điều khiển / bộ thu tín hiệu (vì vậy sử dụng các mức RS232).
Brhans

3
Thử một số nhân vật khác nhau sẽ xác nhận giả thuyết @brhans ngay lập tức. Gửi cùng một nhân vật nhiều lần trong khi mong đợi một kết quả khác nhau là một trong những định nghĩa về sự điên rồ ...
Dave Tweed

3
FeraTaTa - Chỉ một điểm mà tôi không nghĩ đã được đề cập cho đến nay: Thoạt nhìn, dấu vết phạm vi của bạn cho thấy tín hiệu dường như không hoạt động ở 0V (nhìn vào 1biểu tượng có nền màu vàng bên trái dấu vết - đó là mức 0V) và sau đó xung dưới 0V. Điều đó sẽ không đúng với tín hiệu logic trực tiếp từ STM32 và thực tế, điều đó không đúng. Nhìn ở góc dưới bên trái, bạn đã đặt khớp kênh 1 thành AC (đó là ~biểu tượng bạn thấy ở đó). Tín hiệu thực sự ở mức cao và dao động trong khoảng 0V. Sử dụng khớp nối DC cho chế độ xem lành mạnh của tín hiệu đó.
SamGibson

Câu trả lời:


22

Bạn đã bỏ lỡ một chi tiết chính của RS232. Các mức logic như sau:

nhập mô tả hình ảnh ở đây

Hình 1. Các mức tín hiệu RS232. Nguồn: Wikimedia Commons .

  • Logic 1 = -3 đến -12 V.
  • Logic 0 = +3 đến +12 V.
  • Giữa -3 và +3, mức logic không xác định.
  • Bit khởi động RS232 là logic 0.

Để chuyển đổi từ logic TTL (5 V) sang RS232, cần phải có trình điều khiển. Các chip như MAX 232 thực hiện đảo ngược mức logic và tăng điện áp cho bạn.

Đôi khi có thể "gian lận" và đưa tín hiệu TTL vào đầu vào RS232 với điều kiện mức logic được đảo ngược. Độ tin cậy của phương pháp này phụ thuộc vào chip được sử dụng trên đầu vào RS232.

nhập mô tả hình ảnh ở đây

Hình 2. Dạng sóng truyền đi. Trên cùng là mẫu bit của 'Q' mà bạn đã truyền. Ở phía dưới là cách đầu vào RS232 đọc nó.

Lưu ý rằng đầu vào RS232 đang tìm kiếm một cạnh dương để chỉ ra bit bắt đầu. Điều này không xảy ra cho đến khi bit thứ hai của dữ liệu của bạn để mọi thứ sau đó là một bit ở bên phải và đảo ngược khi người nhận nhìn thấy nó. Vì may mắn là MSB của bạn là mức logic chính xác cho bit stop nên người nhận hiểu nó là khung hợp lệ, giải mã nó và hiển thị 'W'.

Đối với mục đích thử nghiệm, bạn có thể đảo ngược đầu ra TTL của bạn. Điều này có thể sẽ làm việc vì nó đang "làm việc" tại thời điểm này.

nhập mô tả hình ảnh ở đây

Hình 3. Chip MAX 232 sử dụng các tụ điện trong mạch bơm sạc để tăng nguồn cung cấp 5 V cho các mức RS232.

Để có độ tin cậy, hãy thêm chip MAX 232 để truyền và nhận tín hiệu mức RS232 phù hợp.


3
Vì có lẽ là một sự thay thế tốt hơn, có sẵn cáp USB to TTL UART. Nếu OP vẫn đang sử dụng bộ chuyển đổi USB, sẽ không có quá nhiều điểm khi thêm một chip bổ sung để thay đổi cấp độ.
Graham

1
RS-232 là logic 0 = lưỡng cực V + là bất cứ thứ gì> 2V và ngưỡng tương đương với TTL là 1,5V. trong CMOS như 74HCTxx với độ trễ nhỏ (50mV ??)
Tony Stewart Sunnyskyguy EE75

6
Bằng tiếng Anh, làm ơn, Tony?
Transitor

3
Đó là tiếng Anh của EE, phần nào bạn không hiểu? RS232 là -V khi không hoạt động và> + 2V khi bắt đầu nhưng là logic âm đối với điện áp (0 = V +, 1 = V-) cho dữ liệu và dừng trên V-. Tôi cá là bạn không biết ngưỡng RS-232 là 1,4 ~ 1,5V
Tony Stewart Sunnyskyguy EE75

8
Cảm ơn, Tony. Điều đó dễ đọc và hợp lý hơn nhiều. Bạn bỏ dấu chấm câu, từ khóa và kết hợp trên quá nhiều câu trả lời nhanh chóng của bạn. Tôi là một cậu bé như bạn với gần bốn thập kỷ EE. Hình 1 của tôi cho thấy các điện áp ngưỡng cho RX. Xem thêm Omega , Analog , WikipediaMaxim . Tất cả trạng thái ± 5 V cho TX và ± 3 V cho RX.
Transitor

7

Xem xét đường ngắn và tốc độ bit thấp 9600, mức độ TTL và CMOS hoạt động tốt. Vấn đề được nêu chi tiết một cách hùng hồn bởi @Transistor là dữ liệu UART là logic âm 0 ~ 5V và RS-232 là logic dương +/- V f trong khoảng +/- 3 và +/- 15V (?)

Do đó, như ông cũng gợi ý, một biến tần sẽ hoạt động.

Vấn đề không phải là vấn đề tỷ lệ lỗi bit (BER) hay tính toàn vẹn tín hiệu, mà là logic đảo ngược.

Ngoài ra, "vùng màu xám" dành cho biên độ nhiễu đường dài Nó không phải là <+/- 3V cho bạn vì cáp của bạn ngắn. Ngưỡng logic thực tế của RS-232 Rx hoàn toàn giống với ngưỡng cũ (hai giọt Vbe) hoặc dung sai 1,4V +/- 20% (?).

Họ gọi nó là một vùng màu xám để đáp ứng tất cả các thông số về khoảng cách và tốc độ truyền do các trục trặc tiếng ồn và tiếng chuông cạnh.

Đối với cáp dài hơn, nhận bất kỳ MAX 232. Biến thể có thể phụ thuộc vào tốc độ điện áp và tính năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.