Làm cách nào để chuyển đổi ASCII thành nhị phân để tạo điều kiện cho cầu nối UART sang SPI cho MSP430?


2

Tôi hiện đang làm việc trên dự án nơi các lệnh cho PC tới MSP430 sẽ được truyền thông qua UART. Các lệnh này cần được chuyển đổi thành nhị phân để có thể ghi vào bus SPI.

Ví dụ: 'a' từ PC được dịch thành 0x61 trên vi điều khiển. Điều thực sự cần thiết là hex 'a' Do đó
ASCII 'a' từ PC = 0x61 => cần dịch hex 0x0A

Câu hỏi: Cách đơn giản nhất để chuyển đổi ASCII sang nhị phân là gì? Tôi đang sử dụng "C".


Mã ASCII chỉ là số. Nếu bạn đang xác định giao thức cho kết nối SPI, bạn có thể đơn giản là cầu nối của bạn lặp lại dữ liệu từ USART đến cổng SPI không?
Niall C.

1
Tôi thực sự không nhận được câu hỏi của bạn. Các ký tự ASCII chỉ là 1 byte - bạn chỉ cần đặt byte này vào bộ đệm / dòng TX. Có vấn đề gì vậy? Hoặc có những chi tiết bạn không cung cấp?

1
Vì vậy, bạn muốn chuyển đổi một ký tự đại diện cho một chữ số thập lục phân '0', '1' ... 'a' ... 'f' thành giá trị của chữ số đó (0x00, 0x01 ... 0x0A ... 0x0F)?
Niall C.

1
Không rõ câu hỏi là gì nhưng đoán nó giống như một giao thức trong đó dữ liệu nhị phân được truyền dưới dạng hex ascii? ví dụ: byte có giá trị 255 được truyền dưới dạng ascii "FF" vậy (thập phân) 46, 46 di chuyển trên dây? Thêm chi tiết cần thiết.

Chúng ta đừng quên một cách thực sự đơn giản: tra cứu bảng. Có thể là quá mức cần thiết, nhưng tôi chưa thấy ánh xạ đầu vào / đầu ra được xác định rõ ràng cho tất cả các trường hợp.

Câu trả lời:


4

Đầu vào từ PC là một ký tự, tức là giá trị ASCII. Để hiểu cách thức này được lưu, hãy xem bảng ASCII . Các số '0' đến '9' được biểu thị bằng mã ASCII 0x30thành 0x39. Các chữ in hoa 'A' đến 'Z' được đại diện bởi 0x41đến 0x5A, và các chữ cái nhỏ 'a' đến 'z' bởi 0x61đến 0x7A.

Tất nhiên bạn có thể sử dụng một chức năng như sscanf, như được đề xuất bởi @ JohnO'M. Các chức năng như vậy ( printf,, scanf...) có nhiều tính năng nhưng do đó đòi hỏi rất nhiều năng lượng và bộ nhớ [Cần dẫn nguồn] , mà chúng ta thường không muốn chi cho vi điều khiển. Một cách khác đơn giản là phân biệt 3 trường hợp có thể (0-9 hoặc AF hoặc af) và trừ số chính xác khỏi mã ASCII để đi đến kết quả:

if( (s >= 0x30) && (s <= 0x39)) {        // 0-9
    x = s - 0x30;
}
else {
    if( (s >= 0x41) && (s <= 0x46)) {    // A-F
        x = s - 0x37;
    }
    else {
        if( (s >= 0x61) && (s <= 0x66)) { // a-f
            x = s - 0x57;
        }
        else {                            // wrong input
            x = 0xFF;
        }
    }
}
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.