Javascript node.js+;串行代码工作不一致

Javascript node.js+;串行代码工作不一致,javascript,node.js,Javascript,Node.js,我试图使用node.js计算均方根,试图聪明地从串口对数据进行某种高分辨率的实时测量 代码其实并不重要。但每次我尝试运行多次,但它输出的rms输出值完全不同,有时非常大,有时非常小,NaN,等等。 问题是: 为什么?怎样?有没有我错过的node.js怪癖?像进程间共享内存分配 在我重写程序(一些编辑)或等待一段时间后,它被修复了 每次重新运行程序都应该做同样的事情,对吗 顺便说一句,我使用nodeserial进行串行通信,波特率为500k 如果您愿意,实际代码可能稍后发布 编辑:代码 var-m

我试图使用node.js计算均方根,试图聪明地从串口对数据进行某种高分辨率的实时测量

代码其实并不重要。但每次我尝试运行多次,但它输出的rms输出值完全不同,有时非常大,有时非常小,NaN,等等。 问题是: 为什么?怎样?有没有我错过的node.js怪癖?像进程间共享内存分配

在我重写程序(一些编辑)或等待一段时间后,它被修复了

每次重新运行程序都应该做同样的事情,对吗

顺便说一句,我使用nodeserial进行串行通信,波特率为500k

如果您愿意,实际代码可能稍后发布

编辑:代码

var-math=require('mathjs');
var fs=需要('fs');
//为静态html“客户端”提供服务
var http=require('http');
var finalhandler=require('finalhandler');
var serveStatic=require('service-static');
var serve=serveStatic(“./”);
var server=http.createServer(函数(req,res){
var done=最终处理程序(请求、回复);
送达(请求、回复、完成);
});
//socket.io
var app=require('express')();
var http2=require('http')。服务器(应用程序);
var io=require('socket.io')(http2);
io.on('连接',函数(套接字){
log(“客户端连接”);
});
/*控制台界面,用于手动插入某种变量*/
//标准蛋白质相互作用
var stdin=process.openStdin();
var命令=“”;
var commandmode=false;
var缓冲数据;
var命令=0;
//连载材料
var serialport=require('serialport');
var SerialPort=SerialPort.SerialPort;
//portName=process.argv[2];
portName=“COM4”
//将命令行参数解析为组件名称
var myPort=新的串行端口(端口名{
波特率:500000,//在115200、57600、38400、19200、9600、4800、2400、1800、1200、600、300、200、150、134、110、75或50之间选择
//在每个数据包的末尾查找return和newline:
解析器:serialport.parsers.readline(“\n”)
});
myPort.on('open',showPortOpen);
myPort.on('data',sendSerialData);
myPort.on('close',showPortClose);
myPort.on('error',ror);
var-datacount=0;
函数showPortOpen(){
log('port open.Data rate:'+myPort.options.baudRate);
}
var时间戳;
年龄;
var-dt;
功能板(数量、大小){
var s=“0000”+num;
返回s.子字符串(s.长度-大小);
}
功能填充(数量、大小){
var s=“00000000”+num;
返回s.子字符串(s.长度-大小);
}
var-vrms=[];
var-irms=[];
var-torq=[];
var速度=[];
var vraw=[];
var iraw=[];
函数sendSerialData(数据){
如果(数据计数===0){
timestampold=Date.now();
}
如果(数据计数===10){
控制台日志(数据);
}
如果(数据计数===1000){
timestamp=Date.now();
dt=时间戳-时间戳;
var采样器;
var datalength=data.length+1;
采样器=数据计数*1000/dt;
var troughput=数据长度*采样器;
var troughputp=800*troughput/500000;
console.log(数据计数+”数据已被记录。经过的时间:“+dt+”,采样器:“+samplerate+”槽口:“+troughput+”/“+troughputp+”%);
}
var parseddata=data.split(“,”);
vraw.push(parseInt(parseddata[0],16));
push(parseInt(parseddata[1,16]);
torq.push(parseInt(parseddata[2],16));
speed.push(parseInt(parseddata[3],16));
rmsfast(vraw[datacount],iraw[datacount]);
//var rawlog=pad(数据计数,8)+“,“+pad(vraw[datacount],4)+”,“+pad(iraw[datacount],4)+”,“+pad(速度[datacount],4)+”,“+pad(torq[datacount],4);
//var rawlog=padd(数据计数,8)+“,+vraw[datacount]+”,“+iraw[datacount]+”,“+speed[datacount]+”,“+torq[datacount]+”>“+vrms[datacount]+”,“+irms[datacount];
//fs.appendFileSync('raw.txt',rawlog);
//console.log(rawlog);
++数据计数;
}
函数showPortClose(){
console.log('端口关闭');
}
功能错误(错误){
log('串行端口错误:'+错误);
}
var varray=[0];
//零位设置;
var-mid=2048//理想的;更改了零交叉检测
/*来自微控制器的数据如下:VVV、III、TTT、NNN
CC=命令/运行模式
VV=电压读数
IIII=当前读数
TTTT=扭矩读数
NNNN=转速(RPM)读数
Z=为零(0=假,1=电压,2=电流)
数据之间的差值t(微秒);
*/
var bufferV=[0];
var bufferI=[0];
var数据计数;
var dataindex;//对以下内容调用的数据索引
var rmslength=80;
var Sigmav平方=0;
var sigmaIsquared=0;
var lastVvalue=0;
var lastIvalue=0;
var-Vrms=0;
var-avgV=0;
var-avgI=0;
函数rmsfast(newVoltage,newCurrent){//示例use=rmsfast(数据,缓冲区,)
var newSqVoltage=数学功率(新电压,2);
var newSqCurrent=Math.pow(newCurrent,2);
缓冲电压推送(电压);
如果(bufferV.length==80){
lastVvalue=bufferV.shift();
}否则{
//LASTV值=新的QV电压;
}
avgV+=((新的QVoltage-lastVvalue)/80);
Vrms=数学sqrt(avgV);
bufferI.push(newSqCurrent);
lastIvalue=bufferI.shift();
avgI+=(newSqCurrent-lastIvalue)/80;
var-Irms=math.sqrt(avgI);
var darn=数学sqrt(4000000);
如果(数据计数<1000){
var darz=数字isInteger(新电压);
var vavg=avgV;
var vrms=vrms;
console.log(新电压+“\t--”+avgV+“\t--”+Vrms);
}
如果(数据计数===1000){
myPort.close(process.exit());
}
推送(vrms);
推送;
}
服务器。听(2000);//收听港口
addListener(“数据”,函数(cons){//“侦听”stdin
command=cons.toString().trim();
});

好的,因此您的代码无法持续工作。。。我们当然需要看。对不起,这不是我能想到的最好的代码。我可以用async和其他东西做得更好。我认为,今天将使每个使用的值都有自己的变量