Phát hiện bit start trong phần mềm UART


9

Tôi đang thử nghiệm viết UART phần mềm trên vi điều khiển của mình bằng các chân GPIO. Điều này là để tạm thời thêm kênh UART vào dự án cho đến khi chúng tôi nhận được thiết kế mới được triển khai sử dụng uC với nhiều cổng UART hơn.

Điều tôi gặp khó khăn là phát hiện chính xác bit bắt đầu trong luồng nối tiếp. Nguồn của luồng là bên ngoài và không quan tâm khi thiết bị của tôi bật nguồn. Vì vậy, rất có khả năng thiết bị của tôi sẽ bật nguồn và bắt đầu nhìn thấy các bit dữ liệu ở giữa truyền byte. Không còn nghi ngờ gì nữa, điều đó sẽ khiến UART phần mềm của tôi đọc các giá trị sai, vì nó sẽ không thể nói được sự khác biệt giữa bit start và bất kỳ chuyển đổi từ cao xuống thấp nào khác.

Đây có phải là vấn đề không thể tránh khỏi với kênh UART? Hoặc có một số mẹo thông minh mà các nhà sản xuất uC sử dụng trong UART phần cứng của họ?


Câu hỏi hay. Thiết bị bên ngoài của bạn liên tục gửi nhân vật? Nếu không, bạn nên kiểm tra xem bit start và bit stop có được căn chỉnh không. Và nếu dữ liệu giữa các lần kiểm tra của bạn (tổng / bit)?
Paul

Bạn có thể có luồng UART bên ngoài gửi lời mở đầu không? Giống như một luồng dữ liệu đặc biệt để chỉ ra một luồng đang đến sẽ khác với bit bắt đầu? Nếu bạn có thể làm điều đó, thì bạn có thể biết liệu dữ liệu có bị lỗi hay không nếu bạn cấp nguồn ở giữa đường truyền hay không.
Funkyguy

1
Nếu luồng nối tiếp không chứa bất kỳ khoảng thời gian nhàn rỗi đủ dài - youart của bạn không có khả năng phục hồi từ điều này. Giải pháp một phần có thể đến trong trường hợp bạn không nhận được bit "dừng" như mong đợi. Sau đó, bạn sẽ có thể thiết lập lại trạng thái và thử lại.
Eugene Sh.

1
Bạn không cần một lời mở đầu đặc biệt ... chỉ là phần còn lại thỉnh thoảng dài hơn một ký tự (bao gồm, bắt đầu, dừng bit). Hoặc, hơn 10 bit dừng liên tiếp, đó là điều tương tự.
Brian Drumond

2
@Fuaze, thiết bị bên ngoài liên tục gửi một dòng ký tự dài, nhưng đôi khi nó không hoạt động. Trường hợp xấu nhất, tôi chỉ có thể bỏ qua đầu vào cho đến khi lần đầu tiên nó không hoạt động.
Dan Laks

Câu trả lời:


5

Nếu bạn sử dụng độ dài bit dừng dễ dàng phân biệt với phần còn lại của luồng dữ liệu, chẳng hạn như thời gian 1,5 bit, thì có thể dễ dàng bắt đầu nhận truyền giữa. Tuy nhiên, điều này đi kèm với chi phí tăng chi phí. Tổng thông lượng dữ liệu có sẵn của bạn sẽ bị ảnh hưởng khi bạn tăng độ dài của bit stop.

Nếu bạn không sử dụng xe buýt quá nhiều và thường xuyên có các khoảng trống giữa các khung, thì đó có thể chỉ là vấn đề chờ đợi một trong những khoảng trống này xảy ra, sau đó chọn đường truyền hi-lo đầu tiên làm điểm bắt đầu của bạn bit bắt đầu tiếp theo.

Hãy nhớ rằng số lượng bit dữ liệu nên có thể dự đoán được, cũng như kích thước khung hình, vì vậy ngay cả khi bạn đang sử dụng 100% dung lượng của xe buýt và bit stop của bạn là một bit thời gian, bạn vẫn có thể tìm thấy bắt đầu bit nếu bạn thu thập đủ khung. Mỗi khung hình được đảm bảo có một chuyển tiếp hi-lo trong đó. Bit dừng là một trong đó luôn luôn cao. Bit bắt đầu là một mức luôn luôn thấp. Giả sử dữ liệu của bạn là ngẫu nhiên (hoặc đủ ngẫu nhiên), bạn có thể làm điều gì đó đơn giản như tạo bộ đệm kích thước khung hình của mình, đặt từng bit trong đó, sau đó tiếp tục thu thập khung và AND chúng vào bộ đệm này cho đến khi bộ đệm chỉ có 1 thiết lập bit. Bit này là bit stop của bạn. Một trong những sau đó là bit bắt đầu của bạn. Voila! Bạn đã tìm thấy nó.

Nếu bạn đang sử dụng bit chẵn lẻ, một tùy chọn khác sẽ là lấy hai giá trị dữ liệu, chọn bit thấp đầu tiên làm bit bắt đầu, sau đó tính toán tổng kiểm tra và so sánh với bit chẵn lẻ. Nếu nó khớp, thì bạn (có lẽ) đã tìm thấy bit start. Nếu không, chọn bit thấp tiếp theo và lặp lại cho đến khi bạn có được tổng kiểm tra tốt. Nếu bạn không thể tìm thấy một chút trong hai khung dữ liệu kiểm tra là bit bắt đầu hợp lệ, thì dữ liệu của bạn đã bị hỏng và bạn sẽ cần lấy thêm hai khung nữa.


Ý tưởng gọn gàng để AND cùng nhau tạo khung cho đến khi các bit start và stop tồn tại. Điều đó sẽ là quá nhiều chi phí cho ứng dụng cụ thể của tôi, nhưng dù sao cũng thông minh.
Dan Laks

Nếu thiết bị bên ngoài là thứ mà OP không kiểm soát được (mà anh ấy đã nêu trong một nhận xét trước đó cho câu hỏi), không có khả năng anh ấy sẽ có thể thay đổi độ dài của bit stop.
tcrosley

Nhận xét đó đã không được đưa ra tại thời điểm tôi bắt đầu viết câu trả lời này. Tuy nhiên, ba tùy chọn khác mà tôi đã liệt kê vẫn áp dụng trong trường hợp độ dài bit dừng được cố định.
Bác sĩ Funk

3

UART phần cứng có cùng một vấn đề. Nhưng dù sao nó cũng thường tự giải quyết theo thứ tự ngắn. Ở cuối mỗi khung, kiểm tra bit stop và nếu nó không cao, loại bỏ khung và chờ chuyển tiếp từ cao xuống thấp tiếp theo. Giả sử rằng dữ liệu từ nguồn không hoàn toàn là bệnh lý (ví dụ: chuỗi dài "UUUU" hoặc ASCII 0x55), UART cuối cùng sẽ tự "đi" đến bit bắt đầu thực.


1

Giả sử truyền 8N1.

Bạn phải đợi một chuỗi gồm 9 bit cao hoặc thấp liên tiếp.

Nếu cao, nó sẽ biểu thị một khoảng trống nhàn rỗi trong dữ liệu hoặc ký tự 0xFF và bit STOP
hoặc
nếu bit START thấp và ký tự NULL 0x00 thấp.

Một trong những điều kiện này sẽ cho phép đồng bộ hóa.

Để tăng tốc độ: Nếu bạn biết một số ký tự không thể có trong dữ liệu, bạn có thể phân tích dữ liệu đến liên tục (sau thực tế) cho mỗi bit và nếu bạn nhận được một chuỗi 7 ký tự vô nghĩa (bộ bit cao, thấp hơn trường hợp, mã kiểm soát, dấu câu hoặc bất cứ điều gì) theo sau là một ký tự hợp lệ, bạn có thể khá chắc chắn rằng bạn được đồng bộ hóa.

Bạn sẽ gặp các vấn đề tương tự khi bạn sử dụng thiết bị ngoại vi UART tích hợp và không thể thực hiện đánh giá bitwise và cũng phải nhớ đặt lại tất cả các bit lỗi đóng khung và như vậy bất cứ khi nào chúng xảy ra (đặc biệt là khi bật nguồn).

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.