Здравствуйте.
Перехожу на искру с ардуино и не совсем понимаю как выполнить две операции последовательно, учитывая, что на искре нет блокирующих функций.
Задача:
При включении искры посылать запрос на отключение автокалибровки датчика MH-Z19, затем начать считывать показание датчика. Соединение организовано через Serial3 (P0, P1).
Встречал на форуме такой вариант:
function check_co2() {
Serial3.write("\xFF\x01\x86\x00\x00\x00\x00\x00\x79");
print_data(Serial3.read(9));
}
Но у меня после write сразу ничего не считывается, т.е. Serial3.read(9) ничего не возвращает.
Пробую решить таким методом(ниже), но проблема в том, что ответ с датчика приходит уже после завершения функции writeCommand. Можно ли как-то выполнить ожидание ответа? Как понять когда можно начать считывание показаний датчика? Запускать SetInterval внутри SetTimeout'а, а SetTimeout ставить на то кол-во мс, за которое выполнится отключение автокалибровки?
MHZ19_uart.prototype.writeCommand = function(cmd) {
Serial3.setup(9600, { tx: this._pintx, rx: this._pinrx });
var checksum = this.checksum(cmd);
Serial3.write([cmd, checksum]); //Отправляем команду на отключение автокалибровки
var a = setInterval(function()
{
if(Serial3.available() > 0) //на второе срабатывание функции ответ с датчика уже пришел
{
clearInterval(a);
var count = Serial3.available();
var res = Serial3.read(9);
for(var i = 0; i < count; i++)
{
console.log(res[i].charCodeAt(0), typeof res[i]);
}
}
}, 50);
}
Про подписку на событие data знаю, но не уверен, что она решит проблему.
Хотелось бы в целом узнать как реализовывать алгоритмы в Iskra js, где необходимо посылать запрос, дожидаться ответа и только потом переходить к следующей операции.