使用nodejs写文件时,为什么我的文件会出现无效字符?

时间:2015-05-16 02:21:42

标签: node.js

我有以下代码,我从serialport接收数据并将所有内容附加到文本文件中。数据来自连接到Arduino UNO的Xbee。我正在使用Serial.print方法打印数据。散列'#'表示消息的结尾,因此我将其打印到文本文件中。无线模块处于AT(透明)模式。

我试图更改字符编码,但它会一直显示我的文件包含无效字符的消息。现在我将数据转换为字符串,但它仍然不起作用。

我使用的是node.js v0.12.1,我的操作系统是Debian测试版。

var http = require('http');
var fs = require("fs");
var SerialPort = require("serialport").SerialPort;

var sensorData = "";    

var serialPort = new SerialPort("/dev/ttyUSB0", {
  baudrate: 9600
});

serialPort.on("open", function () {
  console.log('Serial port is open');
  serialPort.on('data', function(data) {
    var c = data.toString('utf8');
    switch(c) {
      case "#":    
        console.log(sensorData);
        fs.appendFile("file.txt", sensorData, function (err) {
          if (err) throw err;
        });
        sensorData = "";
        break;
      default:
        sensorData += c;
    }        

  });
});

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Test');
}).listen(1337, '127.0.0.1');
console.log('server is up at: http://127.0.0.1:1337/');

这是我收到的信息:

enter image description here

在Windows平台上执行时,我没有得到这个。有什么问题?

1 个答案:

答案 0 :(得分:0)

Arduino字符串通常为end with a null byte(即\ 00),这可能意味着您的设备发送空字符串。

为了防止这种情况,我会检测你的data缓冲区在长度为1时是否在第一个位置包含一个空字节,如果是这样的话,只需返回,这样你就不会将该内容附加到sensorData

serialPort.on('data', function(data) {
    if (data.length === 1 && data[0] === 0) return;
    var c = data.toString('utf8');
    ...