在安卓系统中通过JNI处理GSM调制解调器

3
我正在开发一个向GSM调制解调器发送AT命令并读取响应的程序。
一些程序员建议我在此链接中使用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命令的响应?
1个回答

2
您简化的太多了; 您必须保持读取和解析调制解调器发送回来的所有内容的逻辑。 在发送任何AT命令行之后,应继续处理响应(并且不执行其他任何操作!),直到获得最终结果代码,例如 OKERROR+CME ERROR: ... 等。

至于命令行回显,这是调制解调器的正常行为,尽管您可以通过ATE0关闭回显,请参见V.250中的“5.2.3 命令行回显”。该规范是任何使用AT命令的人受益于阅读的最基本的AT命令文档。阅读第5章的所有内容,然后在第6章中查找相应的命令(如果适用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接