搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 2013-12-25 15:08:22 | 显示全部楼层 |阅读模式
本帖最后由 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 规定时间内没有接收到数据 返回错误
编程模型:
  1. switch (步骤)
  2.     {
  3.        case 0;
  4.                串口发送AT命令;
  5.                开启超时定时器;
  6.                步骤=1;
  7.                break;或return;   //退出函数以处理其他任务
  8.        case 1;
  9.                如果(时间到)
  10.               {   
  11.                   如果(收到回码 且 回码正确)
  12.                    {
  13.                     步骤2;
  14.                     break;或return;   //退出函数以处理其他任务
  15.                    }
  16.               }else
  17.                   超时处理;
  18.        case 2;
  19.         …………
  20.         …………
  21.         …………
  22.         …………
  23.         ……

  24.      }
复制代码

出0入0汤圆

 楼主| 发表于 2013-12-25 16:57:06 | 显示全部楼层
自己顶一个

出0入0汤圆

 楼主| 发表于 2013-12-25 20:12:18 | 显示全部楼层
h黄金时间定一个

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2013-12-25 21:14:05 | 显示全部楼层
hameyou 发表于 2013-12-25 20:34
楼主我就是这么做的,
呵呵,早用上了,目前工作稳定:

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

出0入0汤圆

 楼主| 发表于 2013-12-25 21:57:53 | 显示全部楼层
hameyou 发表于 2013-12-25 20:34
楼主我就是这么做的,
呵呵,早用上了,目前工作稳定:

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

出0入0汤圆

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

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

出0入0汤圆

发表于 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数据。

出0入0汤圆

发表于 2014-3-11 08:58:54 | 显示全部楼层
就是逐字节寻找“/r/n”+内容+“/r/n”这个格式的数据,然后提取出内容进行判断对吧?我设置成80ms读取一次环形缓冲区,这个时长合适不?

出0入0汤圆

发表于 2014-6-15 21:45:12 | 显示全部楼层
终于找到我想要的了,用于GSM模块应该也是通用的啦,感谢分享

出0入10汤圆

发表于 2017-1-22 15:27:55 | 显示全部楼层
本帖最后由 lklhzu 于 2017-1-22 15:29 编辑

请教下楼主,RTT系统下操作GPRS模块功能实现了吗?基本模型最后怎么定的?以前操作GPRS模块习惯裸奔,现在也打算上个系统,在RTT和FREERTOS中间犹豫中。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 17:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表