2016-03-15 8 views
0

Я пытаюсь заставить Intel Galileo запускать Node.js и serialPort.js для сбора данных, отправляемых с пусковой площадки MSP430 (плата на базе Arduino) , Когда я запускаю код на Galileo, сообщение «Port Open» печатается, поэтому я знаю, что состояние «open» было достигнуто в serialPort, но оно просто никогда не будет использовать функцию данных.Node.js cant просмотреть любые данные из последовательного порта Подключен к MSP430 Launch Pad

Вот код сервера без функции:

var express = require('express'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(4000)); 
var com = require("serialport"); 

app.get('/', function(request, response){response.sendfile(__dirname + "/home.html");}); 
app.use('/static', express.static(__dirname + '/public')); 

var activeClients = 0;  

io.sockets.on('connection', function(socket){clientConnect(socket);}); 

var serialPort = new com.SerialPort("/dev/ttyS0", { 
    baudRate: 9600, 
    dataBits: 8, 
    parity: 'none', 
    stopBits: 1, 
    flowControl: false, 
    parser: com.parsers.readline("\n") 
    }); 

serialPort.on('open',function() { 
    console.log('Port open '); 
    console.log(process.argv[0] + " " + " " + process.argv[1]); 

serialPort.on('data', function(data) { 
     console.log("Data recieved: "); 
     console.log(data.toString()); 
     io.sockets.emit('heartUpdate', {heartcrc:data}); 
     emitHeartRate(data); 
    }); 
serialPort.on('close', function() { 
     console.log('Port close'); 
    }); 
serialPort.on('error', function() { 
     console.log('Error'); 
    }); 


}); 

Вот скрипт установки запуска на Galileo перед запуском кода сервера, чтобы настроить порты на Galileo:

#!/bin/bash 

# Initialize sysfs to use the uart on pins 0 and 1 as /dev/ttyS0: 
echo -n "4" > /sys/class/gpio/export 
echo -n "40" > /sys/class/gpio/export 
echo -n "41" > /sys/class/gpio/export 
echo -n "out" > /sys/class/gpio/gpio4/direction 
echo -n "out" > /sys/class/gpio/gpio40/direction 
echo -n "out" > /sys/class/gpio/gpio41/direction 
echo -n "strong" > /sys/class/gpio/gpio40/drive 
echo -n "strong" > /sys/class/gpio/gpio41/drive 
echo -n "1" > /sys/class/gpio/gpio4/value 
echo -n "0" > /sys/class/gpio/gpio40/value 
echo -n "0" > /sys/class/gpio/gpio41/value 
stty -F /dev/ttyS0 raw 
stty -F /dev/ttyS0 9600 

Ниже приведен код на MSP430, который устанавливает и передает данные:

//UART configuration settings 
UCA0CTL1 &= UCSWRST;       //Reset UART control register 
UCA0CTL1 = UCSSEL_2 + UCMSB;     //UART timer input MCLK, enable MSB sent first 
               //Defaults: Parity disabled, 8 bit data, one stop bit, UART mode, asyncronous 
UCA0BR0 = 0x68;         //1MHz 9600 baud 
UCA0BR1 = 0x00;         //1MHz 9600 baud 
UCA0MCTL = UCBRS0;        //Modulation UCBRSx = 1 
UCA0CTL1 &= ~UCSWRST;       //Enable the USCI peripheral (take it out of reset) 

пара функций, которые используются для передачи данных:

void uartCHAR(int txChar) 
{ 

    while (!(IFG2 & UCA0TXIFG));  //Wait for the transmit buffer to be ready 
    UCA0TXBUF = (char)txChar;   //Put integer value in to UART transmit buffer in character format 

} 

void uartTransmit(int tx) 
{ 
    P1OUT |= REDLED;     //Turn on Red LED 
    unsigned int byteSelect = 0xFF00; //Declare value used to isolate each byte 
    unsigned int byteHold = 0;   //Declare varible to hold isolated byte 
    unsigned char sendByte = 0;   //Declare a variable to hold the byte to be transmitted 
    int k;        //Declare a variable to be used in the for loop 
    for (k = 1; k>=0 ; k--)    //Cycle through the code twice 
    { 

     byteHold = byteSelect&tx;  //Isoltate each section of 8 bits in the and store in byteHold 
     byteHold >>= (8*(k));   //Shift the data down to the lowest byte position 
     sendByte = byteHold; 
     uartCHAR(sendByte);    //Pass sendByte in to the uartCHAR function 
     byteHold = 0; 
     byteSelect>>=8;     //Shift the byte selector to the next section of 8 bits 
    } 
    P1OUT &= ~REDLED;     //Turn off Red LED 
    uartCHAR('\n');      //Send symbol to indicate to the parser that the end of the message has arrived 
} 

Если кто-то может указать на то, если я делаю что-то неправильно, я очень ценю это. Я не получаю никакого вывода на экран, когда он работает. Я знаю, что если бы у меня были несоответствия скорости бод, то я получал бы странный результат, но нет никакого выхода, поэтому я не могу его изучить и исправить.

+0

Вы видите что-нибудь на линии TXD с помощью осциллографа или логического анализатора? –

+0

@CL Да, поток бит, который выходит, соответствует байтам, которые я отправляю. Я сделал тест, где я отправил известный номер, и он вышел в двоичном формате. Я чувствую, что проблема заключается в том, что я не отправляю биты в правильном формате из MSP или что код serialPort не настроен должным образом, чтобы поднять его. – Skywatermelon

+0

@CL Возможно ли, что простое размещение байтов в буфере передачи не означает, что отправляются биты начала и окончания? – Skywatermelon

ответ

0

DCO при запуске, вероятно, работает где-то около 1 МГц, но вы действительно должны использовать откалиброванные настройки. Я не уверен, что чип вы используете, но вы можете включить что-то вроде следующего в вашем INIT:

DCOCTL = 0x00; 
BCSCTL1 = CALBC1_1MHZ; 
DCOCTL = CALDCO_1MHZ; 

Поскольку времени для последовательной связи очень важно, это может быть причиной вам проблемы.

 Смежные вопросы

  • Нет связанных вопросов^_^