Thực hiện các lệnh điều khiển cho MCU qua serial


8

Tôi đang tìm cách tích hợp một giao diện lệnh trong một dự án mà tôi đang thực hiện sẽ chấp nhận các lệnh quá nối tiếp từ PC.

Ý tưởng là thiết bị sẽ làm việc của nó nhưng nó được gửi một lệnh, nó sẽ thực hiện nó. Điều này khác với hầu hết các ví dụ tôi đã quản lý để tìm thấy, đây chỉ là một thiết bị chạy không tải đang chờ dữ liệu nối tiếp.

Vì vậy, ví dụ, một thiết bị điều khiển đèn LED và phát hình động. Hãy nói rằng có 3 hình động được cài đặt sẵn và khi bật, nó luôn phát số 1. Về phía PC, tôi sẽ gửi lệnh 'phát trước cài đặt 2' hoặc 'đổi màu thành màu xanh lá cây' hoặc gửi hoạt hình thời gian thực tới thiết bị để chơi trên đèn LED.

Vì vậy, câu hỏi của tôi là tôi không thể tìm thấy nhiều thông tin về "mẫu thiết kế" này? Tôi không biết bắt đầu từ đâu. Gần nhất tôi đã đến là các thư viện phân tích cú pháp nối tiếp arduino được tạo sẵn. Tuy nhiên tôi đang tìm kiếm thêm phương pháp C / non arduino / lý thuyết.

Tôi đã xem xét các giao thức nối tiếp nhưng đó chỉ là những thứ như SPI và I2C, v.v., không thực sự là cách thực hiện giao diện điều khiển / lệnh trong phần mềm.

Tôi cũng đã tìm hiểu về HDLC, một lần nữa mặc dù nó dường như là một giao thức chuẩn / giao thức hơn. Một chủ đề tương tự là /programming/1445387/how-do-you-design-a-serial-command-protatio-for-an-embedded-system Có một số thông tin rất hay nhưng một lần nữa với giao thức / giao tiếp chính nó.

Tôi đang cố gắng tìm cách mã hóa / thực hiện điều này để tạo ra một lệnh hoặc khả năng kiểm soát.

Tôi có sử dụng vòng lặp vô hạn để giám sát và bắt nối tiếp cho lệnh đến không và sử dụng danh sách các câu lệnh IF để chọn lệnh nào sẽ thực hiện, nhưng sau đó điều gì xảy ra khi không có lệnh và hệ thống sẽ bình thường hoặc nếu nó bỏ lỡ một lệnh?

Ngắt lái, máy nhà nước?

Có một tên chính thức cho điều này có thể được sử dụng để nghiên cứu và tìm ví dụ?

BIÊN TẬP:

Đối với bất kỳ ai có cùng câu hỏi, tôi đã tìm thấy ví dụ thực sự hay này khi nghiên cứu, http://www.adnbr.co.uk/articles/parsing-simple-usart-commands


Tại sao không sử dụng một khung như FreeMODBUS hoặc Firmata?
Ignacio Vazquez-Abrams

Câu trả lời:


5

Có nhiều cách để thực hiện một giao thức truyền thông. Ví dụ: bạn có thể chọn sử dụng:

  • định dạng con người có thể đọc được hoặc nhị phân
  • kiểm tra lỗi như tổng kiểm tra hoặc CRC
  • ký tự bắt đầu và / hoặc kết thúc
  • chiều dài tin nhắn, số vv thông tin tải trọng
  • thừa nhận / thừa nhận tiêu cực / thử lại cơ chế

Lệnh ví dụ của bạn là con người có thể đọc được và nên sử dụng '\ n' (enter) làm kết thúc ký tự thông báo. Bắt đầu / kết thúc các ký tự thông báo giúp phân tích luồng đầu vào dễ dàng hơn.

Một luồng chương trình điển hình sẽ là đợi ký tự bắt đầu được nhận, sau đó lưu các byte tiếp theo vào bộ đệm thông báo cho đến khi nhận được ký tự kết thúc. Khi điều đó xảy ra, chuyển bộ đệm sang chức năng khác để phân tích thông điệp. Nếu không có ký tự bắt đầu, chỉ cần bắt đầu lưu trữ byte ngay lập tức cho đến khi nhận được ký tự kết thúc.

Hầu hết * các hệ thống nhúng chạy trong một vòng lặp vô hạn. Việc xử lý truyền và nhận nối tiếp được thực hiện thông qua các ngắt trên Arduino (xem Phần cứngSerial.cpp). Các ký tự nhận được được đặt vào một bộ đệm. Trên mỗi lần lặp của vòng lặp, bạn kiểm tra xem liệu có bất kỳ ký tự nào trong bộ đệm (Serial.av Available ()) và xử lý chúng không. Bằng cách nhận các ký tự bằng cách sử dụng các ngắt, không nên bỏ qua các ký tự. Mặc dù vậy, bạn không thực hiện tất cả quá trình xử lý trong các thói quen ngắt này, nếu không chúng sẽ trở nên quá dài và do đó bỏ lỡ các lần gián đoạn tiếp theo.

Nếu bạn không muốn thiết bị của mình không hoạt động, hãy đặt thiết bị ở trạng thái ngủ để 'tạm dừng' vòng lặp cho đến khi xảy ra sự cố hoặc sự kiện khác.

Tôi thực sự thích thư viện này cho tin nhắn có thể đọc được của con người: http://playground.arduino.cc/Code/Mesbah

* Tôi không thể nghĩ ra một hệ thống không có nhưng có lẽ có một hệ thống ngoài đó.


3

Tất cả chương trình của bạn phải làm là:
1. thường xuyên kiểm tra cổng nối tiếp cho một ký tự mới
2. chuyển đến trạng thái thường xuyên / trạng thái thiết lập / bất cứ điều gì, tùy thuộc vào ký tự
3. chuyển đến 1

Chương trình có thể hoạt động trên các ký tự đơn hoặc bạn có thể tạo định dạng tin nhắn của riêng mình - Tôi thường bắt đầu một camedge với "$" và kết thúc bằng dòng mới, và sử dụng các ký tự ASCII có thể đọc được cho lệnh (giúp gỡ lỗi dễ dàng hơn!).

Hãy chắc chắn rằng chương trình sẽ không bị treo nếu nhận được lệnh không hợp lệ!


Một số Thiết bị kiểm tra tự động (ATE) sử dụng các liên kết nối tiếp rất giống nhau để thực hiện việc này.
Muỗ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.