为尽可能简洁,我正在连接由multitech制造的telit ME910c1-nv套接字调制解调器。并不是很重要,但是我知道有人会认为这个问题与硬件无关。
该设备同时具有4g cat m-1调制解调器和内置的gps模块。我通过UART将它们连接到树莓派。
问题在于,当我发送AT命令以获取GPS位置时,模块最终将停止发送和/或无法再从串行端口读取我的代码。
我正在使用节点js与模块进行通信,但是python也遇到了相同的问题。我在C语言中没有任何问题,这使我认为这是一个更高层次的编程问题和计时问题。
一个基本的例子是:
getGpsData=(modem, callback)=>{
modem.write("AT$GPSACP\r");
const timer = setTimeout( ()=>{
callback(null);
}, 5000); //wait 5 sec before returning null
modem.on('readable', readRaw=()=>{
let data = modem.read();
let output = "";
if(data){
data = data.toString();
output += data;
if(data.includes(escape_character)){ //escape character is "OK" or "ERROR"
clearTimeout(timer);
callback(output);
}
}
});
}
//connect to serial port
modem = new serialport("/dev/serial0");
on.('connect', ()=>{
//on connect read gps data at constant interval
setInterval(()=>{
getGpsData(modem, (data)=>{
modem.removeListener('readable', rawRead);
console.log(data);
}
}, 10000); //loop every 10 sec
});
运行此命令时,我将获得约10-20 gps的读数,然后显示所有null。当我停止代码并再次启动它时,它可以正常工作。有时它会运行一个小时或更长时间而没有任何问题,然后开始产生null值,并且永远无法恢复。如果我直接连接到调制解调器并发送AT指令,则根本不会遇到此问题。好像我的读取与其写入串行端口的模块不同步。
模块的输出为:
$gpsacp: "gpsdata..........."
OK
我得到空数据读取,因为它超时并且从不读取我的转义字符。有时我会得到“ OK”转义字符,并且还会得到空数据。 我已经多次重写命令和读取函数,但始终遇到相同的问题。任何人都知道为什么会这样或有类似的经历吗?