Задать вопрос
rishatss
@rishatss
Simple Developer ^)

Почему читаемые данные с COM порта ломаются при потоке?

Всем еще раз привет.
Не так давно просил помощи и снова проблема с буфером.

Сейчас цель такая:
Ардуина шлет int число в поток вывода, а мы на NODE JS читаем этот COM порт и переводим в string и записываем в array. Но при записи порой данные ломаются.

NODE.JS
var SerialPort = require('serialport');
var array = [];

var port = new SerialPort('/dev/ttyACM0', {
    baudRate: 9600
});

port.on('readable', function () {

    array.push(port.read().toString());
    console.log(array);
});



// Open errors will be emitted as an error event
port.on('error', function(err) {
    console.log('Error: ', err.message);
})


Полученый массив:
[ '22' ]
[ '22', '22' ]
[ '22', '22', '22' ]
[ '22', '22', '22', '2' ]
[ '22', '22', '22', '2', '2' ]
[ '22', '22', '22', '2', '2', '22' ]
[ '22', '22', '22', '2', '2', '22', '2' ]
[ '22', '22', '22', '2', '2', '22', '2', '2' ]
[ '22', '22', '22', '2', '2', '22', '2', '2', '22' ]


Данные числа это градусы по C и число всегда на датчиках было 22. Но в array как-то разбивается на 2 числа и записывает элемент.
Как избежать этого?

Скетч Arduino
//TMP36 Pin Variables
int sensorPin = 0; //the analog pin the TMP36's Vout (sense) pin is connected to
                        //the resolution is 10 mV / degree centigrade with a
                        //500 mV offset to allow for negative temperatures
 
/*
 * setup() - this function runs once when you turn your Arduino on
 * We initialize the serial connection with the computer
 */
void setup()
{
  Serial.begin(9600);  //Start the serial connection with the computer
                       //to view the result open the serial monitor 
}
 
void loop()                     // run over and over again
{
 //getting the voltage reading from the temperature sensor
 int reading = analogRead(sensorPin);  
 
 // converting that reading to voltage, for 3.3v arduino use 3.3
 float voltage = reading * 5.0;
 voltage /= 1024.0; 
 
 
 // now print out the temperature
 int temperatureC = (voltage - 0.5) * 100 ;  //converting from 10 mv per degree wit 500 mV offset
                                               //to degrees ((voltage - 500mV) times 100)
 Serial.print(temperatureC);
 
 
 delay(1000);                                     //waiting a second
}
  • Вопрос задан
  • 396 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@vanyamba-electronics
В приведённом коде использована функция Serial.print(). То есть код просто пишет в порт два символа - '2' и '2'.

На входе принимаем следующий текст - '22222222222222222222222222222222222222222222222222222'.

В какой-то момент буфер заполняется и происходит чтение с последующим разбором. Сколько при этом символов в буфере - сколько есть, столько и будет передано.

Логичнее было бы использовать какой-нибудь символ-разделитель. Например, перенос строки. Чтобы в буфере было '22\r\n22\r\n22\r\n22\r\n'.

Для этого достаточно использовать функцию Serial.println() вместо Serial.print().
Ответ написан
mannaro
@mannaro
Умею профессионально гуглить
Ну, вроде как, COM - последовательный порт. Это значит, что данные просто бегут по нему. Например, там скопилось 22, пока вы пытались его прочитать, пришло 22, а бывает, что прочитали быстро и успела дойти только одна цифра. Поэтому надо после отправки числа отправлять какой-то разделитель, чтобы потом понимать, где заканчивается предыдущий ответ и начинается новый.

Но если передаете только температуру, то я бы советовал использовать Serial.write(25). Он передаст один байт со значением 25 (0b00011001). В nodejs надо будет его просто распарсить.
Иначе же он приведет число к строке (2 байта: "2" и "5") и будет посылать их раздельно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы