Искаженные старшие биты на последовательном выходе
Я пытаюсь отправить байт 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
довольно ясно, что по умолчанию биты четности отсутствуют.
@Cactus, 👍1
1 ответ
Похоже, эта ошибка характерна для библиотеки Rust ARM, которую я использую; цитата из https://github.com/klangner/sam3x/issues/9:
Похоже, что при скорости передачи данных = 9600 таймер отправляет данные со скоростью ~888. А затем компьютер не может понять вывод.
Исходя из этого, я начал экспериментировать со скоростью передачи данных, которую я передаю библиотеке при ее инициализации, и использование 11000 вместо 9600 эмпирически, похоже, работает (т.е. я вижу устойчивый поток 0x5A
на моем ПК, получающем на скорости 9600).
- Построение графика на Python с использованием Tkinter Canvas
- Что является более быстрой альтернативой parseInt()?
- SerialUSB на Arduino Due
- Использование экрана SD-карты на Arduino Due
- Связь между Python и Arduino ненадежна
- Serial.availableForWrite против Serial.flush
- Проблемы с I2C и Wire.Available()
- Протокол связи Arduino с python — помимо примера pyserial и Arduino