Массив nodejs не копируется? - PullRequest
0 голосов
/ 25 июня 2018

Я делаю конечный автомат, используя NodeJS, используя последовательный порт, который мне нужен, чтобы получить и отправить серию команд для проверки правильности связи, во втором состоянии я получаю 31 байт данных и мне нужно отправить их на мой четвертое состояние, для этого я просто копирую полученный массив, чтобы отправить его позже, но в моем четвертом состоянии console.log ничего не показывает, что может происходить?

Вот мой код:

const SerialPort = require('serialport');
const ByteLength = SerialPort.parsers.ByteLength;
const port = new SerialPort("COM6");
const parser = new ByteLength({length: 1});
port.pipe(parser);

var state = 0;
var cache = [];
var history;

parser.on('data', function (data) {
    cache.push(data[0]);
    flowcontrol();
});

function porterr() {
    console.log('error');
    process.exit(1);
}

function flowcontrol() {

    switch (state) {
        case 0:
            // ---------------------------------------------
            //  State 0 -> Recives ENQ, Sends ACK
            // ---------------------------------------------
            // Receives 1 byte
            if (cache.length !== 1) {
                return;
            }

            // Verify answer received
            if (cache[0] !== 5) {
                // Wrong answer received
                porterr();
            }

            console.log('state ' + state);
            // Sends Answer, clears cache, and waits for next state
            port.write(Buffer.from([6]));
            state++;
            cache.length = 0;
            break;

        case 1:
            // ---------------------------------------------
            //  State 1 -> Recives DATA, Sends ACK
            // ---------------------------------------------
            // Receives 31 bytes
            if (cache.length !== 31) {
                return;
            }

            console.log('state ' + state);
            history = cache; // <--- data is saved for later use

            // Sends Answer, clears cache, and waits for next state
            port.write(Buffer.from([6]));
            state++;
            cache.length = 0;
            break;

        case 2:
            // ---------------------------------------------
            //  State 1 -> Recives EOT, Sends ENQ
            // ---------------------------------------------
            // Receives 1 byte
            if (cache.length !== 1) {
                return;
            }

            // Verify answer received
            if (cache[0] !== 4) {
                // Wrong answer received
                porterr();
            }

            console.log('state ' + state);
            // Sends Answer, clears cache, and waits for next state
            port.write(Buffer.from([5]));
            state++;
            cache.length = 0;
            break;

        case 3:
            // ---------------------------------------------
            //  State 3 -> Recives ACK, Sends DATA
            // ---------------------------------------------
            // Receives 1 byte
            if (cache.length !== 1) {
                return;
            }

            // Verify answer received
            if (cache[0] !== 6) {
                // Wrong answer received
                porterr();
            }

            console.log('state ' + state);
            console.log[history]; // <-- Nothing is shown here!!!

            // Sends Answer, clears cache, and waits for next state
            //port.write(Buffer.from(history));
            //state++;
            //cache.length = 0;
            break;

        default:
            console.log('not yet completed');
            console.log(cache.length);
            break;
    }
}

1 Ответ

0 голосов
/ 25 июня 2018

Вы не должны назначать объект со знаком равенства в javascript.

использовать для этого Object.assign или lodash.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

https://lodash.com/docs/4.17.10#cloneDeep

Что происходит в вашем коде, это когда вы меняете значение cache.length = 0;это также меняет ценность истории.поскольку это объект, а не ссылочный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...