基于Joomla的串口控制 原
在实际的企业应用中,串口操作是一项标准配置,特别是在自动化方面。最近在一个项目为了实现对各种传感器的数据读取和写入,在joomla系统上操作串口遇到了一些很有意思的问题,特总结一下,希望对后人有所帮助
1,项目需求
我们使用基于Joomla开发了一套工控组件,系统的核心要求是运行在Linux上,通过串口发送指令来获得传感器的数据,并且依据传感器的数据自动操作感应设备。以实现自动化。
为什么选择Joomla来做?客户为政府企业,需要使用高安全的开源系统,需要源码绝对开放,并且需要跨平台的支持。而这三点Joomla完全吻合。
2,php serial类
google或者百度PHP操作串口,你就会看到PHP Serial类。这是大概在2012年的时候由国外开发者发布在github上的开源类库。网上评论不一。在实际的使用过程中,发现很BUG。
2.1 window系统
在window系统上,你需要修改源码。大概在114行。在做设备匹配的时候少了一个 "\".否则在window根本无法连接
elseif ($this->_os === "windows") { if (preg_match("@^COM(\\d+):?$@i", $device, $matches) and $this->_exec( exec("mode " . $device . " xon=on BAUD=9600") ) === 0 ) { $this->_winDevice = "COM" . $matches[1]; //$this->_device = "\\.com" . $matches[1]; $this->_device = "\\\.\com" . $matches[1]; $this->_dState = SERIAL_DEVICE_SET; return true; }
2.2 linux系统
在Linux系统上,除了程序编码要正确以为,还需要注意如下的问题
1 串口的命名
如果你使用的是串口直接插入,那么你的串口设备的名称为ttyS0. ttyS1.这是和Window不同的,window使用的COM1,COM2.如果你使用的串口转USB接口,那么就是 ttyUSB0 ttyUSB1
2 权限的分配
在linux上,任何的设备都是文件,因此,如果你需要通过网页操作串口,那么你需要给串口设备文件权限。如 chmod 777 /dev/ttyUBS0等等
3 串口设备的启用
同一时间,只允许一个程序操作串口。
3,调试过程 - 解决链接成功,但不能读取数据
在这问题上我吃过大亏,大概耽误了一天的时间,才搞清楚了这个问题。如果你在linux上操作串口,发现不能读取数据的时候可以考虑下面的操作。由于本人长期在window上工作,对linux并不特别熟悉。当将代码移植到linux上部署的时候,我们发现串口没有报错,但是就是读不到数据。这在window上是可以正常的。更要命的是 PHP Serial类说是跨平台的。但实际操作并非如此。
需要有系统的知识。才能顺利的排除错误。这是对所有的程序人都适用的建议。程序排除绝对不能靠蒙,靠运气。而是要依靠经验和知识。
- 1,首先我们面对的第一个问题就是这个USB转串口放到linux服务器上是否需要安装驱动。因为在window上是需要安装驱动的。
- 2,如何确认这个串口在linux上被正确的安装和识别。在window上有很多串口调试功能,可以可视化的看到串口是否物理连接ok.
- 3,当设备连接正常的时候,那么就需要考虑程序代码的问题了。另外,需要检查一些和操作系统相关的内容。比如 路径符号,是否大小写敏感,串口设备的命名规则等等
对于第一个问题。在linux上是不需要安装串口驱动的。你可以使用ls -l ttyS* 命令来查看串口是否被识别
对于第二问题,如何确认在linux上串口是否工作正常的呢。可以安装screen工具或者minicom工具。这两个工具就相当于window上的串口调试助手了。使用screen /dev/ttyUSB0 9600就可以以波特率9600来尝试连接 /dev/ttyUSB0这个串口设备了。如果一切ok,系统可以从这个设备上读取到文件的。
cat命令虽然能够读取串口的内容,但不能将其作为串口是否正常工作的依据。需要使用专用的工具。
另外,需要注意的是,同一个时间,只能有一个程序能访问串口的设备。如果你使用了screen连接成功了。这个时候,你需要先kill掉screen的连接,才能进行下一步的代码调试
4,奇怪的问题
在实际操作中,串口连接成功,权限分配完成,程序能够连接串口,但就是读不到数据。这是一个很奇怪的问题。至于为什么会这样我不清楚,但经过实际的操作,发现采用如下的方案是可以解决的。
- 首先,在启动程序连接串口之前,我们需要使用screen 工具连接。
- 当screen工具收到数据后,退出连接。使用kill命令结束screen的连接
- 然后再启动我们的串口程序,就可以读到数据了。