1

我正在拼命地尝试将一些音频文件上传到 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 和我都没有帮助的帖子。

我也看过这篇文章,但它不适合我,因为它使用工具(AmrFile Download.exe)手动完成这项工作,我需要以编程方式完成。我想如果那个工具可以做到,我也可以,一定有办法,但还没有找到......

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

更新:


从文档:

在此处输入图像描述 在此处输入图像描述

这里他们提到了一个data用于读取操作的参数,因此您可以拥有读取的数据。但是对于写操作没有这样的事情,所以我很困惑。

4

2 回答 2

3

我认为你提到的帖子是正确的。在第 13 页的App note中,也有一个示例。

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

  1. 将文件读取~/tts0.amr到内存变量,amr_data例如;
  2. 发送AT+FSWRITE=tts2.amr,0,5030,10到调制解调器,等待>而不是OK
  3. 写入amr_data调制解调器,就像上面的步骤一样;
  4. 如果大小匹配,调制解调器将OK立即返回。
于 2019-07-07T08:29:37.760 回答
1

通过使用@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);
                });
             });
            }
        });     
    });
});
于 2019-07-08T14:29:20.887 回答