oFono学习笔记——GATChat(4):GATSyntax

摘要

在从IO收到GSM/GPRS模块回传的数据后,就可以按照一定的规则解析这些命令。熟悉Android的朋友可能会想起RIL架构中readline以及process_line这两个函数,一个负责接受一行数据,一个负责对这一行数据进行解析。在GATChat这个库中,将解析这个过程抽象成了一个GATSyntax对象,方便用户进行扩展操作。并分别提供了两个不同的GATSyntax的实现。

1. GATSyntax

1 struct _GAtSyntax {
2     gint ref_count;
3     int state;
4     GAtSyntaxSetHintFunc set_hint;
5     GAtSyntaxFeedFunc feed;
6 };

这里简要分析一下结构体中元素的意义:

state 记录当前syntax进行的状态
set_hint 回调函数,作用是用来通知syntax接下来接收数据的类型,如接受提示符('>')或者接收PDU等,并调整state到相应状态
feed 回调函数,作用是解析由GAtIO收到的模块数据类型

 2. 自带的两个syntax实现

 1 /* This syntax implements very strict checking of 27.007 standard, which means
 2  * it might not work with a majority of modems.  However, it does handle echo
 3  * properly and can be used to detect a modem's deviations from the relevant
 4  * standards.
 5  */
 6 GAtSyntax *g_at_syntax_new_gsmv1(void);
 7 
 8 /* This syntax implements an extremely lax parser that can handle a variety
 9  * of modems.  Unfortunately it does not deal with echo at all, so echo must
10  * be explicitly turned off before using the parser
11  */
12 GAtSyntax *g_at_syntax_new_gsm_permissive(void);

从上面的注释我们就可以看出自带的两个syntax实现的差别。

g_at_syntax_new_gsmv1创建的syntax是严格遵守3GPP 27.007标准的,正因为严格遵守标准,所以这个syntax并不一定适用于很多模块,但是这个syntax的优点是很好的处理了AT命令回显的问题。

g_at_syntax_new_gsm_permissive则是创建了一个较为宽松的AT命令返回结果的parser,但是他不能处理AT命令的回显,所以当使用这个syntax时需要手动将模块的回显关闭,比如ATE0。

两个Parser的具体实现细节就不在这里讨论了。当然用户也可以自己编写符合自己应用要求的parser,然后创建一个syntax在GATChat中使用。

3.总结

以上就是对syntax的分析,希望对大家有所帮助。

 

posted @ 2013-07-03 09:24  ZHX_1Q89  阅读(1032)  评论(0编辑  收藏  举报