Как последовательный монитор узнает, где заканчивается строка, когда мы используем 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);
    }
}

, 👍0

Обсуждение

Вы можете поэкспериментировать с задержками менее 700 мс и посмотреть, в какой момент последовательный монитор начнет объединять сообщения., @Edgar Bonet

@EdgarBonet Я не могу четко понять, объединяются ли сообщения, когда я уменьшаю задержку. Кажется, я тут и там заметил заикание, но похоже, что он печатает все слово/строку за один раз., @Aman

Мне непонятно, что вы имеете в виду под распознаванием струн. Последовательный монитор просто считывает байтовые данные из последовательного порта и выводит их в текстовое поле. Он не знает отдельных строк, только байтов. В чем именно ваша проблема с текущим кодом?, @chrisl

скопируйте содержимое последовательного монитора и вставьте его в свой вопрос... скриншотов нет, @jsotola

последовательный монитор не должен добавлять символы, которые не получены... это не анализатор, поэтому он не знает человеческого значения полученных данных... ответ на ваш вопрос в заголовке: "он не знает", @jsotola


1 ответ


Лучший ответ:

0

Ответ: не знает. Или, если хотите посмотреть на это по-другому: время и шанс.

Вы просто никогда не сталкивались со случаем, когда вы читаете последовательный буфер на стороне ПК именно в тот момент, когда Arduino выполняет запись в него. Этот особый случай будет состоять в том, что вы читаете и очищаете буфер и выводите «HI». (за которым следует символ новой строки, поскольку вы добавляете его в свой код) на последовательном мониторе; затем, во время следующего цикла вашего кода ржавчины, остальные символы будут прочитаны, выведя "GH".

Я бы сказал, что вам повезло, что до сих пор это всегда срабатывало.

Лучше всегда использовать println на стороне Arduino; и на стороне ПК: функция ржавчины для «чтения до новой строки»; из последовательного соединения (я предполагаю, что оно существует, потому что оно существует в других стандартных библиотеках; я никогда раньше не работал с ржавчиной). Таким образом, у вас будет внутриполосная сигнализация «следующий блок данных начинается ЗДЕСЬ».

,

Если вы создаете последовательный монитор, вы не контролируете, как он будет использоваться. Некоторые пользователи не смогут систематически добавлять терминаторы строк., @Edgar Bonet