这(希望)是一个可怕的旅程的结束。我有通过tty终端程序与串口通信的悠久历史,通常需要5分钟才能将它们全部设置好。
我在试着做什么?
1.通过javascript将命令写入TH-D72A
2.通过javascript从TH-D72A读取数据
成功案例:
答:可以用python读写。然而,TH-D72A进入了一种奇怪的模式,它没有反应。
B:联系了建伍的客户支持,并与他们进行了很长时间的讨论。然而,我已经花了3周的时间,应该只需要5分钟。他们似乎也不知道哪里出了问题。
C:这个操作模式将在Raspberry Pis上运行,但我的开发操作系统是Mac OS。我可以在这两个平台上编写python脚本。
代码
我不确定是否必须使用解析器,还是简单地从端口读取。port.read()不显示任何数据。这段代码可以编译,但没有数据发送给函数:
'use strict';
var express = require('express');
var router = express.Router();
var util = require("util");
const SerialPort = require('serialport');
const Readline = SerialPort.parsers.Readline;
var devicePath = '/dev/ttyUSB0';
var osvar = process.platform;
console.log(osvar);
if (osvar == 'darwin') {
console.log("Using Mac OS");
devicePath = '/dev/tty.SLAB_USBtoUART';
}else{
devicePath = '/dev/ttyUSB0';
}
const port = new SerialPort(devicePath, {
baudRate: 9600,
parity: 'none',
stopBits: 1,
dataBits: 8,
flowControl: false
}, function(err) {
if (err){
console.log('error: ', err.message);
port.close();
}});
const parser = new Readline({delimiter: '\n'});
port.pipe(parser);
console.log('parser setup');
parser.on('data', function(data) {
console.log('data received: ', data);
});
port.on('data', function(data) { console.log('Date:' +data);
});
port.on('open', function() { console.log('Port Opened');
});
port.on('close', function() { console.log('Port Closed');
});
port.write('DISP\r\n');
router.get('/', function (req,res) {
res.render('terminal', { title: 'Terminal Page' });
});
module.exports = router;
其他
这些项目在github:https://github.com/kcw-grunt/nodetest上是开放的,我创建了一个模块(npm)来添加更多的方法:https://www.npmjs.com/package/th-d72-ax25
我希望有一些javascript专家可以看到这个问题(这必须非常简单)。
发布于 2018-07-11 06:56:53
Background我已经成为一名法医专家,试图弄清楚为什么这个简单的任务花了6周的时间,...and我找到了一个解决方案。我认为这是一种变通方法,但我可以继续使用它来继续编写我的更大的解决方案
我的每个支持者都认为javascript是健全的,我倾向于同意他们的观点。但是,系统完全没有响应。这包括串口2.0.6,2.1.2,甚至是v6.2.0。
这段代码实际上可以工作(正如@psiphi75所说的那样):
'use strict';
var express = require('express');
var router = express.Router();
var serialport = require('serialport');
var SerialPort = serialport.SerialPort;
var devicePath = '/dev/ttyUSB2';
var port = new SerialPort( devicePath, { // change path
baudrate: 9600
, function ( err ) {
if ( err ) {
console.error('error opening serial port:' , err);
}
}
});
port.on('data', function(data) {
console.log('Data:'+data)
});
port.write('KISS ON\r\n', function(err) {
console.log('KISS ON Turned on');
});
port.write('RESTART\r\n', function(err) {
console.log('Restarted');
});
port.on('open', function() {
console.log('Port Opened');
});
port.on('closed', function() {
console.log('Port Closed');
});
var start = Date.now();
setInterval(function() {
var delta = Date.now() - start; // milliseconds elapsed since start
// alternatively just show wall clock time:
console.log(new Date().toUTCString());
port.write('I\r\n');
}, 5000); // update
router.get('/', function (req,res) {
res.render('terminal', { title: 'Terminal Page' });
});
module.exports = router;
问题实际上出在Kenwood TH-D72A串行(USB)端口。事实上,当在开发环境中使用它时,它保持在第二个串口‘连接’之后不发出数据的状态。这是一个严重的缺陷,肯伍德应该解决,特别是HT被认为是市场上最昂贵的之一。
解决方法是在每次启动build + run时关闭并关闭TH-D72A的电源。
我可能会花一些时间找出是否有一些持久的状态导致了这一点。但是,代码在每个构建中重新启动 HT。对于该领域的非技术用户来说,这将是一个严重的问题,更不用说没有2个Raspberry Pis、Linux、windows和Mac的用户了
发布于 2018-07-10 05:56:52
我已经使用SerialPort很多次了,没有任何问题(gprs-signal-strength,super-duper-serial-gps-system。下面是一些示例代码。
注意:它们使用的是SerialPort v2.0.x。这看起来像是使用了new SerialPort.SerialPort(...)
语法,而不是更新的new SerialPort(...)
语法。
const port = new SerialPort.SerialPort('/dev/ttyS2', {
baudrate: 115200,
parser: SerialPort.parsers.readline( '\r\n' ) // you may just want \r or \n
}, function ( err ) {
if ( err ) {
console.error( 'Error opening GPRS serial port: ', err );
}
} );
port.on('data', function(data) {
console.log(data)
});
发布于 2019-07-11 17:05:06
如果有人还在尝试这样做,我用下面的代码和serialport@7.1.5
让它工作
const SerialPort = require("serialport");
const port = new SerialPort("/dev/tty.SLAB_USBtoUART", {
baudRate: 9600,
dataBits: 8,
parity: "none",
stopBits: 1,
rtscts: true
});
我认为诀窍是使用rtscts: true
打开硬件流控制。
https://stackoverflow.com/questions/51254319
复制相似问题