Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js回调;如何加入SerialPort后续数据事件?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript Node.js回调;如何加入SerialPort后续数据事件?

Javascript Node.js回调;如何加入SerialPort后续数据事件?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我无法解决Node.js中的SerialPort问题。在MODBUS RTU协议中,如果两个数据块之间出现指定的超时(比如10 ms),则消息被视为完全传输。 我使用SerialPort的经验表明,我经常在单个数据事件中获得一个或几个字节,而实际消息可能长达100字节。现在,我如何知道消息是否已结束,并且我可以将数据传递给其他处理程序?好吧,现在我做以下几点: var timeoutTimer; function dataEventHandler(chunk) { clearTimeou

我无法解决Node.js中的SerialPort问题。在MODBUS RTU协议中,如果两个数据块之间出现指定的超时(比如10 ms),则消息被视为完全传输。 我使用SerialPort的经验表明,我经常在单个数据事件中获得一个或几个字节,而实际消息可能长达100字节。现在,我如何知道消息是否已结束,并且我可以将数据传递给其他处理程序?好吧,现在我做以下几点:

var timeoutTimer;
function dataEventHandler(chunk) {
    clearTimeout(timeoutTimer);
    // concatenate the chunks
    timeoutTimer = setTimeout(10, handleFullMessage);
}
这显然不是最好的方法。。。想象一下,另一个回调出现了,例如HTTP请求处理程序,它的计算长度可达100毫秒

有几个想法:

在handleFullMessage中,检查串行端口上是否有可用的信息,如果有,请退出,假设可能再次调用数据事件MODBUS是主/从协议,因此没有人会在没有请求的情况下说话。但我不知道怎么做。 以某种方式将数据事件优先于超时。。。
serialport事件没有时间戳吗?我可以安全地假设,如果数据事件发生,它是当前消息的一部分,如果之前没有命令,从机将不会说话;因此我甚至不需要时间戳。但这并不能解决我的问题,因为在一段时间后我仍然需要传递消息。让我举一个例子:1。调用dataEventHandler。handleFullMessage计划在10毫秒后调用。2。正在执行100毫秒的操作,例如HTTP处理程序3。同时串行数据到达,另一个“数据”事件被添加到回调队列,但是。。。4.不幸的是调用了handleFullMessage。不,我指的是事件本身而不是消息。因此,在处理程序中,您检查事件发生的时间,而不是处理程序执行.Hm时,我不确定Node.js事件队列是如何实现的,但我希望如果数据在10毫秒超时之前到达,那么对它的dataEventHandler调用也会安排在handleFullMessage之前。即使这两项任务都因正在进行的任务而延迟了100毫秒。您是否查看了?