在实际的企业应用中,串口操作是一项标准配置,特别是在自动化方面。最近在一个项目为了实现对各种传感器的数据读取和写入,在joomla系统上操作串口遇到了一些很有意思的问题,特总结一下,希望对后人有所帮助

1,项目需求


我们使用基于Joomla开发了一套工控组件,系统的核心要求是运行在Linux上,通过串口发送指令来获得传感器的数据,并且依据传感器的数据自动操作感应设备。以实现自动化。

为什么选择Joomla来做?客户为政府企业,需要使用高安全的开源系统,需要源码绝对开放,并且需要跨平台的支持。而这三点Joomla完全吻合。

com操作.png

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的连接
  • 然后再启动我们的串口程序,就可以读到数据了。

用户评分: 0 / 5

不活动星星不活动星星不活动星星不活动星星不活动星星
 

评论

  • 未找到评论