solojimes 发表于 2013-12-25 15:08:22

有关rtt系统下(GPRS)串口使用的一个基本模型优化讨论

本帖最后由 solojimes 于 2013-12-25 15:19 编辑

在使用sim900a的at指令时,一般操作是通过串口发at指令给模块,模块在一定的时间内返回数据给MCU
这是个很经典的模型。
在rtt中准备这么使用
指令发送 AT\r\n
指令返回 \r\nOK\r\n
一开始我我的代码如下: (简略给出)
gprs_device = rt_device_find("uart2");

然后直接调用 rt_device_write()写入我需要发送的指令

接下来应该开始等待接收,这就是我讨论的地方:

等待多久不确定?是否接收到我想要的OK不知道?串口是否有返回我不知道?

我准备这样做:
1 设置一个回调函数 此回调函数返回当前串口中接收到的字节数
只要字节不为0 就表示有数据接收到
2 读取接收到的字节,读取字节数目按照回调函数返回的size来
并采用strstr函数判断缓冲区中在规定的等待时间内是否有我想要的字符
没有则返回错误 否则返回正确
3 规定时间内没有接收到数据 返回错误
编程模型:
switch (步骤)
    {
       case 0;
               串口发送AT命令;
               开启超时定时器;
               步骤=1;
               break;或return;   //退出函数以处理其他任务
       case 1;
               如果(时间到)
            {   
                  如果(收到回码 且 回码正确)
                   {
                  步骤2;
                  break;或return;   //退出函数以处理其他任务
                   }
            }else
                  超时处理;
       case 2;
      …………
      …………
      …………
      …………
      ……

   }

solojimes 发表于 2013-12-25 16:57:06

自己顶一个

solojimes 发表于 2013-12-25 20:12:18

h黄金时间定一个

ghostxdy 发表于 2013-12-25 20:43:00

hameyou 发表于 2013-12-25 20:34
楼主我就是这么做的,
呵呵,早用上了,目前工作稳定:

LS用的是什么IDE?这风格的字体很漂亮!

solojimes 发表于 2013-12-25 21:14:05

hameyou 发表于 2013-12-25 20:34
楼主我就是这么做的,
呵呵,早用上了,目前工作稳定:

我能参考你更多代码希望能够得到你的指点

solojimes 发表于 2013-12-25 21:57:53

hameyou 发表于 2013-12-25 20:34
楼主我就是这么做的,
呵呵,早用上了,目前工作稳定:

如果前辈还在的话 我说下对你程序的两个顾虑的地方
1 状态机的转换 这里没有必要用指针
2在使用sim900的情况下 发送ATE0\r\n的情况下 返回的应该是\r\nOK\r\n
所以你只比较前两个字符是否有问题,当然没看到你的串口处理函数中是否将这两个字符去掉
3觉得你判断是否收到回吗的机制可以做得更好,你这个应该只能判断串口中是否有数据是否能判断是完整的一帧数据,
当然还是不知道你的串口处理程序

xlqiang 发表于 2014-3-10 20:54:31

hameyou 发表于 2013-12-25 22:38
1.状态机我在这里使用的指针便于管理,系统工作的状态以及当前的步骤,外部定义的为全局结构体变量,以及 ...

大侠,我的疑问是第2点,“并开辟了两个缓冲区,一个放回码,一个放GPRS下行TCP数据”,是不是串口接收到的数据,每次都复制两份,一份放入回码缓冲区,一份放入TCP数据缓冲区,然后调用各自的处理函数进行处理?
如果不是,如何区分串口接收到的是回码还是TCP数据呢?

xlqiang 发表于 2014-3-11 08:36:22

本帖最后由 xlqiang 于 2014-3-11 08:39 编辑

hameyou 发表于 2014-3-11 08:28
没有复制两份,GPRS串口开辟一个缓冲区,在一个函数中专门处理这个缓冲区的数据,用于识别回码和TCP数据 ...

大侠,现在的问题就是,如何区分是回码还是TCP数据?通过判断"^SISR"字符串的方法检出TCP数据,测试时发现一旦服务器在很短的时间内发来好几次数据的话,会漏掉一些帧,有没有比较可靠的方法?
我在串口接收时,每个byte都入环形缓冲区,然后每80ms读取一次环形缓冲区,并对出来的数据进行解读,发现经常会漏掉一些帧。解读的方法就是,判断取出来的数据中是否有“^SISR” "+CMI",没有则一律视为回码,
进行进一步处理,然后就会漏掉一些TCP数据。

xlqiang 发表于 2014-3-11 08:58:54

就是逐字节寻找“/r/n”+内容+“/r/n”这个格式的数据,然后提取出内容进行判断对吧?我设置成80ms读取一次环形缓冲区,这个时长合适不?

duxingkei 发表于 2014-6-15 21:45:12

终于找到我想要的了,用于GSM模块应该也是通用的啦,感谢分享

lklhzu 发表于 2017-1-22 15:27:55

本帖最后由 lklhzu 于 2017-1-22 15:29 编辑

请教下楼主,RTT系统下操作GPRS模块功能实现了吗?基本模型最后怎么定的?以前操作GPRS模块习惯裸奔,现在也打算上个系统,在RTT和FREERTOS中间犹豫中。
页: [1]
查看完整版本: 有关rtt系统下(GPRS)串口使用的一个基本模型优化讨论