Asyn c при связи с последовательным портом дает смешанные данные - PullRequest
1 голос
/ 26 января 2020

Я пытаюсь связаться с Arduino, который имеет датчики.

Итак, у меня есть объект, называемый материнской платой, у которого есть датчики, и у каждого датчика есть метри c, который может иметь порог и / или опрос, который имеет метод getValue, который отправляет данные в arduino и возвращает данные с обещанием , Проблема в том, что если я установил c датчики для получения их значений, все датчики получают одинаковое значение.

Я не знаю, почему это происходит. Я запрограммировал только javascript на 1 год и angular на 5 месяцев. Я проверил сообщение async / await с использованием serialport в node.js, но я проверил свой код и сделал то, что было предложено в посте.

Метод связи находится внутри службы.

Кто-нибудь может помочь?

tl; dr: отправлять данные в arduino, возвращать данные в обещании. Метри c А и Б получают одно и то же обещание. Опрос компонента также получает обещание порога. (метри c имеет порог и опрос)

Me data mixed

communication.service.ts

communicate(cmd: string, serialPort: SerialPort, expectedResponse: string, notExpectedResponse){
    const parser = serialPort.pipe(new Delimiter({delimiter: '\n'}));
    return new Promise((resolve, reject) => {
      serialPort.write(cmd, () => {
        console.log('message written');
        parser.on('data', data => {
          const dataString = data.toString();
          if (dataString != null && dataString.includes(expectedResponse)) {
            let responseRemoved = dataString.replace(expectedResponse + ' ', '');
            resolve(responseRemoved);
          } else {
            let response;
            if (dataString != null && dataString.includes(notExpectedResponse)) {
              response = dataString.replace(notExpectedResponse + ' ', '');
            }
            reject(response);
          }
        });
        setTimeout(() => {
          reject('');
        }, this.timeOutTime);
      });
    });
}

threshold.component.ts

 private getValuesThreshold(): void{
    console.log(this.metricId);
    this.motherboardInUse.getValues(this.metricId, GlobalVariableCMD.GET_THRESHOLD_VALUES,
      GlobalVariableResponse.GET_THRESHOLD_VALUES, GlobalVariableResponse.GET_THRESHOLD_VALUES).then(data => {
      let dataString = data.toString();
      if(dataString){
        console.log(dataString);
        let responseSplit = dataString.toString().split(' ');
        let minimumValue = parseInt(responseSplit[1]);
        let maximumValue = parseInt(responseSplit[2]);
        minimumValue < this.floor ? this.minimumThreshold = this.floor : this.minimumThreshold = minimumValue;
        maximumValue > this.ceil ? this.maximumThreshold = this.ceil : this.maximumThreshold = 90;
        this.enabled = responseSplit[0].includes('1');
        console.log(this.minimumThreshold);
        console.log(this.maximumThreshold);
        console.log(this.enabled);
      }
    }).catch(err => {
      let errString = err.toString();
      if(errString){
        console.log(errString);
      }
    });
  }

motherboard.component.ts

getValuesThreshold(metricId: string, ATcmd: string, expectedResponse: string, notExpectedResponse: string) {
    let command = this.communicateBuilder.BuildCommandGetMetricValue(ATcmd, this.usedSensorId, metricId);
    console.log('motherboard get values' + command);
    let responseOk = this.commandBuilderService.respondsSuccess(expectedResponse);
    let responseNotOk = this.commandBuilderService.respondsFail(notExpectedResponse);
    return this.communicateService.communicate(command, this.motherboard.serialPort, responseOk, responseNotOk);
  }


Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Проблема была в отправке асинхронных c данных с последовательным портом. Узел Serialport не имел возможности узнать, какой ответ был связан с какими данными, которые были отправлены. Таким образом, это действовало на первом полученном ответе и возвратило это. Единственный способ решить эту проблему - спросить у них син c.

0 голосов
/ 27 января 2020

Может быть, вы можете попробовать это

async getValuesThreshold(metricId: string, ATcmd: string, expectedResponse: string, notExpectedResponse: string) {
    let command = this.communicateBuilder.BuildCommandGetMetricValue(ATcmd, this.usedSensorId, metricId);
    console.log('motherboard get values' + command);
    let responseOk = this.commandBuilderService.respondsSuccess(expectedResponse);
    let responseNotOk = this.commandBuilderService.respondsFail(notExpectedResponse);
    return await this.communicateService.communicate(command, this.motherboard.serialPort, responseOk, responseNotOk);
  }
...