2012-11-08 54 views
2

如何确定AT命令的结束发送到GSM模块?对AT命令的响应结束

我需要一些字符或字符串代表AT命令结束每个案件由于找到整个响应时收到。

我想它有一些“\ r \ n”序列,但是,这个序列可能在AT命令响应的开始?

+0

EOF/CTRL + Z呢? http://en.wikipedia.org/wiki/Control-Z – rkosegi

+0

所以你真实**而不是**寻找指示命令**结束的东西,但是**表示响应结束的东西(如果有的话) )? – alk

+1

@alk是的,我试图指示AT命令的响应结束 –

回答

3

像你想的那样是\r\n
这定义了一条线的末端。

而且它只处理完整的行是有意义的。

某些命令仅响应OK\r\n,其中一些命令带有一些数据。
所以你应该首先构建一个解析器,它可以检测完整的行,因此它们可以用一个处理响应的函数处理 。

有时您甚至可以得到您没有请求的回复,例如更改事件net login或SIM卡状态#QSS: 2\r\n

所以,你需要知道你所期望的答案,等到你这个

+0

是的,很好的建议。 AT命令响应应始终[逐行解析](https://stackoverflow.com/a/36899432/23118)。 – hlovdal

0

响应格式是命令特定的。尽管有一些相似之处(“OK \ r \ n”),但最后你需要对每个进行明确的处理。

1

Referring the original Hayes command set Wikipedia is stating

<CR>回车字符,是在命令行和结果代码 终止字符,该值,在0和255之间的十进制ASCII,指定 在参数S3内。默认值是13.

所以应该可以设置任何字符来表示响应的结束(以及发送到调制解调器的命令的结束)。


无论如何<CR> s不仅作为最后一个字符被许多调制解调器的响应返回。

因此,它可能是一个有趣的实验是否写一个不同的字符值S3只想改变在调制解调器的响应端发送的最后一个字符,或者这是否会改变调制解调器的应答期间发送的任何<CR>是值存储在S3

+0

有趣的想法,我一定会尝试,我会发布调查结果。 –

1

以下是我在Python中使用。有用。可能还有其他更好的解决方案。

ser = serial.Serial(com, baudrate, timeout=5) 
while True: 
# a simple AT return result parser 
    new_char = ser.read(1) 
    byte_flow += new_char 

    if len(byte_flow) >=4 and byte_flow[-4:] == b'\r\nOK': 
     break 
    elif len(byte_flow) >= 7 and byte_flow[-7:] == b'\r\nERROR': 
     break 
byte_flow += ser.read(2) # the final '\r\n' 

如果还有其他模式,您可以添加更多elif