wq_601840968 发表于 2019-4-8 13:37:20

关于linux下NB模块AT指令接收方式的思考与疑问

移远bc28模块,对接电信NB平台;
arm向模块发送AT指令,对于接收到的模块应答,每条应答都不大一样,而且接收到的应答条数也不同,造成接收的时候不大好处理。
具体举例如下:
正常通讯情况下:
arm->模块:AT+NMGS=5,0102030405;(某数据上报指令)
模块->arm:①: AT+NMGS=5,0102030405; (模块应答的指令回显)
                     ②:OK;                                 (模块的应答)
                     //应答②、③间会有1~3秒的延迟(电信服务器延迟)
                     ③:+NNMI:4,AAAA0000         (服务器应答)

异常通讯情况下:
arm->模块:AT+NMGS=5,010203040506;(某数据上报指令,指令错误)
模块->arm:①: AT+NMGS=5,010203040506; (模块应答的指令回显)
                     ②:ERROR;                                 (模块的应答)

针对以上情况:接收方式如下:
1、采用read()+串口超时的方式;
    设置该条指令应答的超时时间为5s(>3s);一次性接收到(①②③)所有的应答指令,然后统一处理;
    但是这种方式指令接收时间太长,效率低;而且对于错误指令,同样需要等待5s。
2、采用getline()/fgets()函数一行一行接收;
   每接收一行则写到buffer中,所有的接收完成之后,对buffer统一进行处理;
    但是这种方式接收的时候并不知道需要接收多少行,即不知道需要调用多少次getline();

两种方式都存在问题,不知道有没有其他更好的办法?

广轻电气091 发表于 2019-4-8 13:49:23

对模块的指令进行封装,串口接收使用select机制,把数据放到环形队列

dongwang_fl 发表于 2019-4-8 14:27:34

我目前单片机是按第一种方式处理的。反正他也不干其它的事情。慢点就慢点吧。

dongwang_fl 发表于 2019-4-8 14:31:24

对了。请教一下: ③:+NNMI:4,AAAA0000         (服务器应答)这一句是电信平台下发的数据还是你自己的平台下发的数据,如果是电信的平台,是自动应答的吗?如何设置自动应答?谢谢。

wq_601840968 发表于 2019-4-8 15:19:27

dongwang_fl 发表于 2019-4-8 14:31
对了。请教一下: ③:+NNMI:4,AAAA0000         (服务器应答)这一句是电信平台下发的数据还是你自己的 ...

电信平台自动下发的,编解码插件->新增消息->勾选添加响应字段

dongwang_fl 发表于 2019-4-8 15:46:43

wq_601840968 发表于 2019-4-8 15:19
电信平台自动下发的,编解码插件->新增消息->勾选添加响应字段

找到了。谢谢。

wq_601840968 发表于 2019-4-8 17:26:08

广轻电气091 发表于 2019-4-8 13:49
对模块的指令进行封装,串口接收使用select机制,把数据放到环形队列

没大明白,能详细说下吗
页: [1]
查看完整版本: 关于linux下NB模块AT指令接收方式的思考与疑问