Как последовательный монитор узнает, где заканчивается строка, когда мы используем Serial.print вместо Serial.println?
РЕДАКТИРОВАТЬ: Я думал, что мне нужно проанализировать данные, поступающие в программу, но из-за скорости, с которой она работает, на глаз невозможно отличить, что слово печатается по частям.
Я пытаюсь создать последовательный монитор в Rust, используя крейт последовательного порта. Для проверки я использую следующую модификацию блинк-кода на uno:
void setup() {
// инициализируем цифровой вывод LED_BUILTIN как выход.
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
// функция цикла выполняется снова и снова, вечно
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("HIGH");
delay(700);
digitalWrite(LED_BUILTIN, LOW);
Serial.print("LOW");
delay(700);
}
с помощью println я думаю просто объединить полученные буферы и распечатать их при получении nl или cr. Последовательный монитор неплохо справляется с распознаванием строки, если a завершилась без NL или CR при запуске кода. Как оно это делает? Вот мой код прямо сейчас:
use std::time::Duration;
use serialport;
fn main() {
let open_port_config = serialport::new("/dev/cu.usbmodem1201", 9600).timeout(Duration::from_secs(10));
let open_port_result = open_port_config.open();
let mut port = match open_port_result {
Ok(res) => res,
Err(_) => panic!("Couldn't open the port")
};
println!("Data bits: {}", port.data_bits().unwrap());
println!("Flow control: {}", port.flow_control().unwrap());
println!("Parity: {}", port.parity().unwrap());
println!("Stop bits: {}", port.stop_bits().unwrap());
loop {
let mut serial_buf: [u8; 8] = [0; 8];
port.read(&mut serial_buf[..]).expect("Found No data");
let output = String::from_utf8(serial_buf.to_vec()).unwrap();
println!("{:?},{:?}: {}", serial_buf, output.trim_matches('\0'), output);
}
}
@Aman, 👍0
Обсуждение1 ответ
Лучший ответ:
Ответ: не знает. Или, если хотите посмотреть на это по-другому: время и шанс.
Вы просто никогда не сталкивались со случаем, когда вы читаете последовательный буфер на стороне ПК именно в тот момент, когда Arduino выполняет запись в него. Этот особый случай будет состоять в том, что вы читаете и очищаете буфер и выводите «HI». (за которым следует символ новой строки, поскольку вы добавляете его в свой код) на последовательном мониторе; затем, во время следующего цикла вашего кода ржавчины, остальные символы будут прочитаны, выведя "GH".
Я бы сказал, что вам повезло, что до сих пор это всегда срабатывало.
Лучше всегда использовать println
на стороне Arduino; и на стороне ПК: функция ржавчины для «чтения до новой строки»; из последовательного соединения (я предполагаю, что оно существует, потому что оно существует в других стандартных библиотеках; я никогда раньше не работал с ржавчиной). Таким образом, у вас будет внутриполосная сигнализация «следующий блок данных начинается ЗДЕСЬ».
Если вы создаете последовательный монитор, вы не контролируете, как он будет использоваться. Некоторые пользователи не смогут систематически добавлять терминаторы строк., @Edgar Bonet
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Вы можете поэкспериментировать с задержками менее 700 мс и посмотреть, в какой момент последовательный монитор начнет объединять сообщения., @Edgar Bonet
@EdgarBonet Я не могу четко понять, объединяются ли сообщения, когда я уменьшаю задержку. Кажется, я тут и там заметил заикание, но похоже, что он печатает все слово/строку за один раз., @Aman
Мне непонятно, что вы имеете в виду под распознаванием струн. Последовательный монитор просто считывает байтовые данные из последовательного порта и выводит их в текстовое поле. Он не знает отдельных строк, только байтов. В чем именно ваша проблема с текущим кодом?, @chrisl
скопируйте содержимое последовательного монитора и вставьте его в свой вопрос... скриншотов нет, @jsotola
последовательный монитор не должен добавлять символы, которые не получены... это не анализатор, поэтому он не знает человеческого значения полученных данных... ответ на ваш вопрос в заголовке: "он не знает", @jsotola