Искаженные старшие биты на последовательном выходе

Я пытаюсь отправить байт 0x5A (0b01011010) на последовательный выход Arduino Due. Моя программа основана на этом примере проекта, но я удалил все не имеющие отношения к делу части:

#![feature(lang_items)]
#![no_std]
#![no_main]

extern crate sam3x;

pub mod rust_base;
use sam3x::*;
use sam3x::hal::peripherals::{Peripheral};
use sam3x::drivers::led::{Led};
use sam3x::hal::rtt::{init_timer, wait_ms};
use sam3x::hal::pmc;
use sam3x::hal::uart;


#[link_section=".vectors"]
pub static VECTOR_TABLE: VectorTable =
    VectorTable {
        reset_handler : start,
        exceptions    : [0; 14],
    };


fn start() -> ! {
    init_timer();
    pmc::enable_peripheral_clock_0(Peripheral::PioC);

    let led = Led::connect(Peripheral::PioB, 27).expect("Wrong pin for led.");
    let tx = uart::Tx::init(uart::BR_9600);

    let mut led_on = true;
    led.on();
    loop {
        tx.write_byte(0b01011010);

        wait_ms(250);
        if led_on {
            led.off()
        } else {
            led.on()
        }
        led_on = !led_on;
    }
}

Как видите, все, что я делаю, это отправляю байт 0x5A четыре раза в секунду, при этом мигает светодиод, просто чтобы показать, что программа работает.

Моя проблема в том, что если я подключаю последовательную терминальную программу с настройками 9600-8N1, я не получаю 0x5A; вместо этого я получаю в основном 0xBA, а иногда проскакивает 0x9A.

Записываем биты:

0101 1010    5A
1011 1010    BA
1001 1010    9A

Обратите внимание, что младший полубайт всегда правильный, поэтому я не думаю, что это проблема настройки последовательной связи; кроме того, из реализации uart::Tx::init довольно ясно, что по умолчанию биты четности отсутствуют.

, 👍1


1 ответ


1

Похоже, эта ошибка характерна для библиотеки Rust ARM, которую я использую; цитата из https://github.com/klangner/sam3x/issues/9:

Похоже, что при скорости передачи данных = 9600 таймер отправляет данные со скоростью ~888. А затем компьютер не может понять вывод.

Исходя из этого, я начал экспериментировать со скоростью передачи данных, которую я передаю библиотеке при ее инициализации, и использование 11000 вместо 9600 эмпирически, похоже, работает (т.е. я вижу устойчивый поток 0x5A на моем ПК, получающем на скорости 9600).

,