Я запустил проект, который требует связи между Arduino и локальным nodejs сервером ( не имеет отношения , данные будут отправлены через HTTP-запрос или сокет на фактический удаленный сервер позже) , Я использую нодальный пакет serialport. В начале последовательной связи серверу необходимо «найти» arduino. Я выбрал следующий кодекс согласования:
1) сервер отправляет символ "c" (как при соединении), который arduino прослушивает
2) arduino отвечает на все "c "s с другим" c ", который сервер будет прослушивать для
, другими словами, когда обе стороны получат" c ", что означает, что последовательное соединение работает
Однако из-за использования последовательного порта обещает, что не могу go через все доступные порты и проверить, есть ли там arduino (который отвечает "c").
Вот что я придумал:
var SerialPort = require('serialport');
var Readline = require('@serialport/parser-readline');
async function tryPort(path) {
var port = new SerialPort(path, {
baudRate: 9600
});
port.on('error', function (err) {
console.log(err);
});
port.pipe(new Readline({ delimiter: '\n' })).on('data', (data)=>{
console.log(port);
console.log(data);
if (data == 'c') {
return port;
}
port.close();
});
port.write("c", function (err) {
if (err) console.log(err);
});
}
async function connect() {
var connection, ports = await SerialPort.list();
for(i=0;i<ports.length;i++){
connection = await tryPort(ports[i].path);
}
setTimeout(() => {
if (!connection) {
console.log("no port/response found");
}else{
console.log(connection);
}
}, 3000);
}
connect();
Я предположил, что переменной 'connection' будет присвоено значение порта, который ответил правильно последний, потому что этот порт будет самым длинным до фини sh. К сожалению, кажется, что это не будет работать с обещаниями ... Так что мне интересно, есть ли другой способ выполнить sh это?