SIM800C GSM AT COMMAND 如何以编程方式上传 .amr 音频文件

SIM800C GSM AT COMMAND How to upload .amr audio file programmatically

我正在拼命尝试将一些音频文件上传到 SIM800C 的内存中,到目前为止这是我能够做的,但是上传的文件似乎无效,并且没有播放任何声音。但是 AT+FSLS=C:\ 我可以看到文件在那里。

以下是我使用的 AT 命令:

AT+FSCREATE=tts2.amr 
AT+FSWRITE=tts2.amr,0,5030,10 
AT+FSLS=C:\

我制作了一个 nodeJS 程序来完成这项工作,但我对任何其他适用于 linux 的语言开放。

  modem.executeCommand('AT+FSCREATE=tts2.amr',(result) => { log.debug(result); });
        modem.executeCommand('AT+FSWRITE=tts2.amr,0,5030,10',(result) => { log.debug(result); });
        modem.executeCommand('AT+FSLS=C:\',(result) => { log.debug(result); });

如果你想知道我已经看过这个,它对 OP 和我都没有帮助。

我还看到 this post but it doesnt suit to me, because it uses a tool (AmrFile Download.exe) 手动完成这项工作,我需要以编程方式完成。我想如果那个工具可以做到,我也可以,一定有办法,但还没有找到...

真正让我烦恼的是文件是如何从我的计算机中找到的,甚至在加载它之前就读取了它的内容。 我将音频文件 tts2.amr 保存在与 nodejs 脚本相同的目录中,因为 AT 命令显示我无法为它只考虑目标的源文件指定路径,所以我不知道如何做了,我觉得这样不行

更新:


来自文档:

这里他们提到了一个data读取操作的参数,所以你可以得到读取的数据。 但是对于写操作没有这样的东西,所以我很困惑。

我觉得 you mentioned is right. In App note,第13页,也有例子。

所以在你的程序中,假设你有一个本地文件 ~/tts0.amr,大小为 5030 字节, (tts2.amr 是调制解调器内的文件名)

  1. 读取文件~/tts0.amr到内存变量,例如amr_data
  2. 发送AT+FSWRITE=tts2.amr,0,5030,10到调制解调器,等待>而不是OK
  3. amr_data到调制解调器,就像上面的步骤一样;
  4. 如果尺寸匹配,调制解调器现在应 return OK

通过使用@ximingr 的回答,我想出了这段工作正常的代码。

var fs= require("fs");
let serialportgsm  = require('serialport-gsm');
let modem = serialportgsm.Modem();
let serialport = serialportgsm.serialport;

serialportgsm .list((err, result) => {
    // console.log(result);
})

let options = {
    baudRate: 115200,
    dataBits: 8,
    stopBits: 1,
    parity: 'none',
    rtscts: false,
    xon: false,
    xoff: false,
    xany: false,
    autoDeleteOnReceive: true,
    enableConcatenation: true,
    incomingCallIndication: true,
    incomingSMSIndication: true,
    pin: '',
    customInitCommand: '',
    logger: console
}
 
modem.open('COM11', options);

modem.on('open', data => {
    modem.initializeModem(function(p) {

        fs.readFile('tts2.amr', function(err,amr_data) {
            if(!err) {
                let fsize= fs.statSync('tts2.amr').size;
                modem.executeCommand('AT+FSCREATE=C:\User\tts2.amr',(result) => { log.debug(result); });
                modem.executeCommand('AT+FSWRITE=C:\User\tts2.amr,0,'+fsize+',100',(result) => { 
                modem.port.write(amr_data);
                });
             });
            }
        });     
    });
});