【发布时间】:2012-11-07 23:08:45
【问题描述】:
我正在处理一个工业环境,我必须在现场记录来自串行设备的读数。我当前的设置涉及连接到 Moxa 5150A 或 5130 串行设备服务器的设备,该服务器通过有线或无线方式连接到我的网络,具体取决于各个设备的位置。目前,我依赖硬件供应商提供的软件来管理数据收集。当前的软件是基于windows X86的,并且由于以前的硬件故障而在我们购买的新硬件上造成了无穷无尽的麻烦。我专门选择 Moxa 串行服务器是因为它们的 linux 驱动程序和兼容性。该设备通过 RS-422(4 线半双工)7 位 1-stop 奇校验和 NO 流控制进行通信,除非请求,否则不会发送任何信息。
我正在开发自己的解决方案,将信息存储在数据库(可能是 MySQL)中。就终端通信而言,这是两部分。我必须发送请求并接收响应。
迄今为止,我已将串行服务器的 Moxa 驱动程序安装到我的 linux 服务器上。我编写了一个 bash 脚本,它从 /dev/ttyrXX 设备读取数据,解释输入并将信息加载到 mysql 数据库中。
while read line
do
something something....
done < /dev/ttyrXX
我仍在解决一些小的脚本错误,例如在设备脱机时正确重启并稍后重新联机以及其他此类问题,但我的脚本正在读取和记录我的数据,这完全符合我的需要。
此解决方案依赖于两个因素。
1) Moxa 设备支持 FIFO 并允许同时进行多个连接
2) 供应商提供的在单独的 Windows 机器上运行的软件当前正在提交信息请求。
我需要一起删除基于 Windows 的软件。我已经编写并测试了一个脚本,该脚本打印到 /dev/ttyrXX 发出我想要的请求并收到适当的响应,并按照我的第一个脚本的需要记录它们。
some list of things
for x in list
do
printf "request" > /dev/ttyrXX
done
我在使用供应商提供的软件时遇到的一个主要问题是,它硬编码依赖于接收对每个请求的及时响应。这会产生许多问题,包括完全冻结窗口以及设备在不合时宜的时间停止服务时崩溃。
我的两个脚本协同工作,以明显更好的间隔收集数据,并且人工干预更少。
这是我的问题。我可以在 Python 中使用什么方法来获得与我的 Bash 脚本相当的结果?
我无法找到不需要我打开/关闭文件的与 printf 或 cat 等效的 Python。此外,我查看过的每个终端界面都有内置的或必需的等待响应或在放弃之前阅读这么长时间。我确定那里存在某些东西,我几乎没有运气找到它。我承认我是 Python 的新手,并且只写了几行代码来探索它的能力。
让我说得很清楚。我想写信给我的终端,而不用担心我在写的时候(使用我不在乎的线程或单独的脚本)。我想从我的终端上阅读,而不用担心我的下一段文字何时到来。 (我并不是在暗示一个永无止境的循环,但我确实需要它来简单地等待输入)。我希望/需要我的写入和读取完全独立于彼此,而不关心对方昨天、现在或下周在做什么。
提前谢谢你。
如果有必要,我将能够提供更详细的代码,但是我觉得我在搜索中更需要指导而不是修复错误。虽然我仍然完全愿意接受建议和“永远不要这样做......因为这个......”类型输入
【问题讨论】:
-
如果我理解正确,您不需要知道为了解释响应而编写了什么命令?你可以有一个处理所有 TX 的程序和一个处理所有 RX 的程序,它们不需要交换任何信息,也不需要同步?
-
关于数据库选择:你考虑过sqlite吗?如果您的数据库需求很简单,那么设置起来会容易得多。
-
@maxy 你完全正确,我不需要同步通信。其中大部分是由所涉及的硬件和通信的性质处理的。设备仅在 A 被请求或 B 收到无法理解的消息并以错误消息响应时才发送数据。大多数情况下,失败的 TX 将导致设备没有发送任何内容。我们在供应商软件方面遇到了无穷无尽的麻烦,因为它是在发送等待响应的基础上运行的。
-
@maxy 也是。我偏爱 MySQL,因为我在 php/mysql 网页设计方面的工作对它很熟悉。我还使用 PHP/MySQL Web 界面来查看和处理从设备获取的数据。并不是说 sqlite 不能满足我的需求,我只是坚持我所知道的。然而,我正在考虑将 Django 作为我未来的 Web 界面。我自己公司的人希望对界面进行如此多样的更改,我认为一旦我们摆脱了供应商的限制,这可能是必要的。
标签: python bash serial-port