摘要
在从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的分析,希望对大家有所帮助。