Tránh nhầm lẫn giữa không có đầu vào và số 0 trong nhị phân?


10

Giả sử tôi đang truyền dữ liệu qua FM trong đó 0 là 2Hz và 1 là 4Hz. Máy phát đang truyền 2Hz khi không có đầu vào. Nếu tôi đưa nhị phân nhận vào cổng UART của vi điều khiển, thì vi điều khiển sẽ phân biệt giữa không có dữ liệu và 0 như thế nào?

Điều này trở nên có liên quan khi truyền các ký tự ASCII chẳng hạn. Giả sử chuỗi sau:

01000110 01101111 01101111 01100010 01100001 01110010

Vì tôi đã thêm dấu cách, chúng tôi có thể dịch phần này sang:

Foobar

Nhưng với một máy, chuỗi sẽ như thế này:

010001100110111101101111011000100110000101110010

Làm thế nào bạn có thể tạo ra các "khoảng trắng" đó để bạn không bị các ký tự ASCII rối tung khi bạn nhận được nhị phân?


5
Đây là cách UART giải quyết nó, liên kết . Dừng và bắt đầu bit, vì zou đưa nó vào cổng UART nên zou cũng sẽ truyền chúng.
Bence Kaulics

Tôi sợ tôi không hiểu sơ đồ của bạn. Có vẻ như "Bit bắt đầu" chỉ đơn giản là số không, điều này phục hồi lại vấn đề của tôi. Ví dụ, làm thế nào để biết sự khác biệt giữa 01111000 và 00111100 nếu chuỗi là 000 01111000 000?
Allenph

2
@ ALLenph, khi bạn không gửi xe buýt ở chế độ chờ và nó được giữ ở trạng thái logic cao. Khi bạn bắt đầu truyền gói, bit đầu tiên luôn ở mức thấp. Đây là bit bắt đầu. Sau đó theo tám bit dữ liệu và sau đó là một bit stop cao về mặt logic. Bộ vi xử lý biết khi nào bit tiếp theo đến vì nó biết tốc độ bus mà bạn đã cấu hình. Cả bộ vi xử lý và bộ phận truyền đến bộ vi xử lý cần phải được cấu hình với cùng tốc độ truyền.
Mattias Johansson

Câu trả lời:


16

Nếu bạn cung cấp một cái gì đó cho cổng UART của bộ vi xử lý, bạn phải tuân theo giao thức truyền thông UART nếu bạn muốn bộ vi xử lý hiểu những gì bạn đang cho nó ăn. Bạn cần nhúng từng ký tự ASCI vào gói UART chứa bit start, bit stop và có thể là bit chẵn lẻ, rất nhiều thông tin có sẵn trên trang Wikipedia UART .

Khi bạn không gửi xe buýt ở chế độ chờ và nó được giữ ở trạng thái logic cao. Khi bạn bắt đầu truyền gói, bit đầu tiên luôn ở mức thấp. Đây là bit bắt đầu. Sau đó theo tám bit dữ liệu và sau đó là một bit stop cao về mặt logic. Bộ vi xử lý biết khi nào bit tiếp theo đến vì nó biết tốc độ bus mà bạn đã cấu hình. Do đó, có thể truyền ví dụ hai số 0 cạnh nhau. Cả bộ vi xử lý và đơn vị truyền tới bộ vi xử lý cần phải được cấu hình với cùng tốc độ truyền, tính chẵn lẻ và số lượng bit dừng.


2
Một điểm quan trọng là số bit dừng được cấu hình là tối thiểu, không phải tối đa. Trạng thái nhàn rỗi của dòng nối tiếp async là một bit stop mở rộng. Vì vậy, nếu radio phải nhàn rỗi ở 0, thì câu trả lời dễ dàng là đảo ngược đầu ra UART trước khi lái radio với nó để nó không hoạt động ở 0 và 1 là bắt đầu. Sau đó đảo ngược dữ liệu nhận được trước khi xử lý nó bằng UART.
RBerteig

6

rất nhiều kỹ thuật cho việc này. Bạn có thể muốn xem mã ManchesterZ hoặc mã NRZ. Hoặc mã hóa 8b / 10b , ánh xạ cứ 8 bit dữ liệu thành chuỗi 10 bit cho phép khôi phục đồng hồ, sửa lỗi và các ký hiệu "dấu phẩy" đặc biệt có thể được sử dụng để phát hiện bắt đầu và kết thúc truyền.


5

Tất cả các ký tự ASCII đều rộng 8 bit, bạn có thể thấy điều đó trong bảng ASCII. Giá trị HEX của các ký tự ASCII không vượt quá FF (1111 1111)

UART không thể nhận nhiều hơn một byte dữ liệu (8 bit) cùng một lúc, bên cạnh dữ liệu 8 bit đó còn có các bit STOP và START, PARITY và một vài thứ nữa, bạn có thể thấy trong hình hiển thị bên dưới và cùng tạo thành gói giao tiếp UART.

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

Vì vậy, khi bạn gửi các ký tự ASCII đến UART, bạn sẽ gửi từng ký tự một và đó là cách tạo chuỗi. Bạn đã biết chuỗi đó chỉ là một mảng các ký tự.


4
ascii là 7 bit, không phải 8, tuy nhiên người ta thường đặt nó trong một vết cắn 8 bit để làm cho việc căn chỉnh trở nên tầm thường. Nó cũng cho phép các bộ ký tự khác và utf8.
hildred

0

Giao thức UART, như Mattias giải thích, là giao thức không đồng bộ dựa trên thời gian. Điều xác định ranh giới giữa các bit là thời gian lấy từ đầu bit bắt đầu. Vì vậy, vi điều khiển sẽ "lấy mẫu" bit (N+half)/baudrategiây sau khi bit start bắt đầu. Nửa bit chỉ là lấy mẫu ở giữa các bit để nó có thể có một nửa chênh lệch về thời gian giữa máy thu và máy phát (hãy nhớ rằng sự khác biệt là tích lũy và trường hợp xấu nhất xảy ra ở bit cuối của mỗi khung, thường là, nhưng không phải luôn luôn, rộng 8 bit, tùy thuộc vào cấu hình). Chìa khóa để làm cho nó hoạt động là có máy thu và thu phát với tốc độ càng gần càng tốt.

Vì vậy, vi điều khiển đếm thời gian giữa mỗi bit để biết mỗi bit nằm trong một khung. Nhân vật tiếp theo sẽ đi vào khung hình tiếp theo. Khi mỗi khung kết thúc, vi điều khiển bắt đầu tự động lắng nghe khung hình tiếp theo, vì vậy khi bit bắt đầu tiếp theo xuất hiện, nó đã biết nên bắt đầu một khung mới. Đó là cách các nhân vật được tách ra.

Ngoài ra, tôi sẽ thêm rằng bạn thực sự không cần hai tần số để truyền đến vi điều khiển nhận UART. Bạn có thể sử dụng một tần số duy nhất là OOK thay vì hai tần số như FSK . Nó có hiệu suất phổ cao hơn và các mạch đơn giản hơn nhiều, vì bạn chỉ cần một bộ chuyển đổi sóng mang là máy phát và máy dò tần số duy nhất là máy thu, khá giống mã morse. Hãy nhớ thường sử dụng các sóng mang có tần số cao hơn nhiều so với tốc độ baud, nếu không các mạch đơn giản hơn sẽ không hoạt động chính xác.

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.