android - 在 Android 中通过 JNI 处理 GSM 调制解调器

标签 android c galaxy at-command modem

我正在开发一个向 GSM 调制解调器发送 at-command 的程序,我想读取响应。

一些程序员建议我在这个 link 中使用 atinout 程序.

所以我移植到 android 并将代码简化为这个 C 代码,因为我不想使用文件(输入和输出):

JNIEXPORT jstring JNICALL Java_com_marakana_NativeLib_hello(JNIEnv * env, jobject obj)
{
FILE *modem;
char *line="AT\r";
bool success;
int res;

modem = fopen("/dev/smd0", "r+b");
if (modem == NULL) 
    return (*env)->NewStringUTF(env, "2fopen() failed: /dev/smd0\n");

res = fputs(line, modem);
if (res < 0)
return (*env)->NewStringUTF(env, ("5failed to send '%s' to modem res = " + res,line));  

line = fgets(buf, (int)sizeof(buf), modem);
if (line == NULL)
    return (*env)->NewStringUTF(env, "6EOF from modem\n");
strcpy(buf2, line);
strip_cr(buf2);

res = fclose(modem);
if (res != 0) 
    return (*env)->NewStringUTF(env,  ("9closing modem failed: %s\n", strerror(errno)));

return (*env)->NewStringUTF(env, buf2);
}

static void strip_cr(char *s)
{
char *from, *to;
from = to = s;
while (*from != '\0') {
    if (*from == '\r') {
        from++;
        continue;
    }
    *to++ = *from++;
}
*to = '\0';
}

问题是: 调制解调器响应是相同的请求。这意味着我从函数中收到了 AT

注意:我的手机是三星 Galaxy Win Duos。

是我手机调制解调器的问题。或者在我的代码中?如何获取 at 命令的响应?

最佳答案

你简化的太多了;您必须保留读取和解析调制解调器发回的所有内容的逻辑。在发送任何 AT 命令行后,您应该继续处理响应(不要做任何其他事情!)直到您获得最终结果代码,例如OK, ERROR, +CME ERROR: ...

至于获取命令行的回显,这是正常的调制解调器行为,尽管您可以使用 ATE0 关闭回显,请参阅 V.250 中的“5.2.3 命令行回显” .该规范是最基本的 AT 命令文档,任何使用 AT 命令的人都可以从阅读中受益。阅读第 5 章的全部内容,然后查看第 6 章中适用的特定命令。

关于android - 在 Android 中通过 JNI 处理 GSM 调制解调器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23739867/

相关文章:

java - Android Studio -- 无法应用插件 [id 'appengine']

C 错误 "variable-sized object may not be initialized"

c - 代码块错误

c - Objective-C 全局整数数组未按预期工作

android - 我在哪里/如何获得三星 Galaxy Player (YP-G1) 的 Android SDK OEM USB 驱动程序

java - 如何在 RxJava 服务器轮询中对 "repeatWhen"进行单元测试

android - StackOverflowError 在 Kotlin 中使用 Singleton

Android:用于类似 Galaxy S3 的 AVD 的 AVD 设置

android - 自定义标题栏和选项卡

android - Galaxy S5 Lollipop - 并非所有断点都在 Android Studio 调试器下停止执行