我曾使用过Telit的GM862-QUAD-PY模块(链接在此:http://www.telit.com/en/products.php?p_ac=show&p=4)。该模块内置Python解释器。长期以来,我将其作为单模块GSM/GPRS解决方案使用。我基本上编写Python脚本,向模块本身的GSM部分发送和接收AT命令。使用Python,我还可以访问其GPIO引脚、UART、位带SPI和I2C总线。
然而,这个Python解释器有很大的限制。它只适用于小型项目。它不支持线程或任何类型的中断或信号。因此,编写的Python程序必须具备一个大的超级循环。在我的应用中,GM862模块从UART读取传入数据并处理它们,然后将它们上传到GPRS服务器。同时,它还会读取从SMS或GPRS服务器发送的命令。随着更多用户使用我的系统(这意味着UART上的更多数据和对系统的更多SMS命令),超级循环变得越来越慢。优化Python程序并没有帮助太多,甚至使我的代码更加混乱。
最后,我决定转换到嵌入式Linux平台。Telit有GE863-PRO,它是GSM/GPRS模块的嵌入式Linux版本,但是开发套件很难获得。现在我正在看Beaglebone。我将使用GM862-QUAD-PY普通的AT命令方式。然而,AT命令处理速度较慢。某些命令可能需要长达15秒才能完成。在原始的Python代码中,我只需等待AT响应即可。之后,我会做一些不涉及AT命令的其他事情。
由于我现在在Linux上,并且可以使用Pthreads,因此我希望充分利用GSM模块并增加其吞吐量。这是我的初始想法。我创建一个AT命令挂起队列。队列中的每个元素都包含AT命令本身和回调函数。我创建一个线程,从该队列中获取AT命令并通过UART发送出去,线程轮询响应。当有响应时,线程将调用回调函数。
因为我是嵌入式Linux和Pthreads的新手,所以我想知道这是否是实现高效利用GSM/GPRS模块的最佳方法,是否有任何好的现有库可以利用。
提前感谢您的帮助。
然而,这个Python解释器有很大的限制。它只适用于小型项目。它不支持线程或任何类型的中断或信号。因此,编写的Python程序必须具备一个大的超级循环。在我的应用中,GM862模块从UART读取传入数据并处理它们,然后将它们上传到GPRS服务器。同时,它还会读取从SMS或GPRS服务器发送的命令。随着更多用户使用我的系统(这意味着UART上的更多数据和对系统的更多SMS命令),超级循环变得越来越慢。优化Python程序并没有帮助太多,甚至使我的代码更加混乱。
最后,我决定转换到嵌入式Linux平台。Telit有GE863-PRO,它是GSM/GPRS模块的嵌入式Linux版本,但是开发套件很难获得。现在我正在看Beaglebone。我将使用GM862-QUAD-PY普通的AT命令方式。然而,AT命令处理速度较慢。某些命令可能需要长达15秒才能完成。在原始的Python代码中,我只需等待AT响应即可。之后,我会做一些不涉及AT命令的其他事情。
由于我现在在Linux上,并且可以使用Pthreads,因此我希望充分利用GSM模块并增加其吞吐量。这是我的初始想法。我创建一个AT命令挂起队列。队列中的每个元素都包含AT命令本身和回调函数。我创建一个线程,从该队列中获取AT命令并通过UART发送出去,线程轮询响应。当有响应时,线程将调用回调函数。
因为我是嵌入式Linux和Pthreads的新手,所以我想知道这是否是实现高效利用GSM/GPRS模块的最佳方法,是否有任何好的现有库可以利用。
提前感谢您的帮助。
select
或epoll
或简单地使用线程来解决。我不是Linux系统调用方面的专家,所以您可以深入研究该领域。这是计算机科学中一个已经解决的问题。我知道的相关关键字有:green threads、协程、异步I/O。只需查看维基百科中的异步I/O页面(http://en.wikipedia.org/wiki/Asynchronous_I/O),您就会找到许多相关主题。 - foresightyj