Linux环境下RS485通讯软件开发与界面设计
2020-09-09
来源:小侦探旅游网
文章编号:1001—9944(2010)12—0022—04 Linux环境下R¥485通讯软件开发与界面设计 尤保常,杨源源,张 晓,王建华 (河南天冠燃料乙醇有限公司,南阳473O00) 摘要:Linux具有可靠的系统安全性,开发功能强,支持几乎所有的主流程序设计语言。文中 介绍了在ubuntu9.04发行版本下基于GN0ME/GTK+图形用户界面库进行的RS485总线通 讯软件开发,主要包括通讯网络一般结构、终端IO详细设置、GTK+软件开发库的构成及其 信号机制与回调函数,特别是利用Ghb库的IO通道机制、超时函数等,使图形用户界面下终 端Io编程结构变得简洁、方便。系统在实际应用中稳定可靠.达到了设计要求 关键词:Lj nUx:RS-485总线;GN0M E/GTK+;10终端;图形用户界面 中图分类号:TP311.52 文献标志码:B Development and Interface Design of RS485 Communication Software Under Linux YOU Bao—chang,YANG Yuan—yuan,ZHANG Xiao,WANG Jian—hua (Henan Tianguan Fule Alcohol CO.,LTD.,Nanyang 473000,China) Abstract:Linux has a reliable system security and strong development function,it supports almost all mainstream pro- gramming languages.This paper introduce RS485 bus communication software development based on GNOME/GTK+ graphical user interface library under Ubuntu 9.04 release,it mainly include the general structure of communication network,terminal IO detailed setting,composition of GTK+software development library and it’S signal mechanism. callback function and SO Oil.Particularly,it makes treminal IO programming structure becomes more simple and con— venient by using IO channel mechanism and timeout function of GLib library.The system is stable and reliable in practical applications,and achives the design objective. Key words:Linux;RS-485 bus;the GNU network object model environmentlgimp toolKit+(GNOME/GTK+);terminal IO;graphical user intefface Ljnux近些年越来越受到人们的重视。作为一 个操作系统.Linux自身有强大的网络通讯支持能 力.在工业控制领域,Linux支持工业以太网、GPRS 面实现进行了阐述。 1 系统组成及功能概述 应用系统由上位PC机和下位智能仪表及通讯 适配器组成.仪表为日本A&D公司AD4401智能称 网络,ProfibuS—DP总线、RS一485总线、红外、蓝牙等 多种通讯协议和硬件.往往成为嵌入式操作系统的 首选 开发基于Linux的RS一485总线通讯软件需要 重控制仪 仪表通讯基于RS一485总线,使用自由口 通讯协议.有六种数据传输模式.常用的有流 (Stream)模式及指令(Command)模式。流模式适用 于单台仪表与主机通讯.仪表将称重值连续发送至 用到系统的IO终端设置.但设置相对复杂 本文结 合一个实际应用的系统实例.在程序设计层面上对 Linux环境下RS485总线通讯软件开发及其窗口界 收稿日期:2010—04—23:修订日期:2010~09—27 作者简介:尤保常(1966一),男,工程师,研究方向为过程控制自动化;杨源源(1975一),女,助理工程师,研究方向为过程控 制自动化;张晓(1975一),男,助理工程师,研究方向为计算机应用;王建华(1973一),男,工程师,研究方向为计算 机应用。 囝 Automation&Instrumentation 201D(J2) 通讯端口:指令模式下.由PC主站将包含地址信息 一个或多个常量的或运算: 的指令发送至总线上.每台从站都能收到该指令. 只有地址匹配的从站会做出响应.将包含自身地 址、数据的包发送回主站。指令模式适用于多台仪 表组成的网络通讯.该型号仪表支持多达99个节 点的通讯网络 RS一485总线通讯结构如图l所示.主站是一台 0 RDONLY O WRONLY 0 RDWR 只读打开: 只写打开: 读、写打开 这三个常量中必须指定一个且只能指定一个 下面的常量则是可以选择的: O N0C 不将终端设备分配作为进程 工业计算机.从站是多台智能仪表 从站通讯端El 的控制终端(进程的控制终端是指登录其上的终端 为RS一485物理协议.每台仪表分配唯一的地址.通 设备或网络登录情况下的伪终端设备): 讯总线接至控制室后经232/485适配器转换为RS一 0 N0NBL0CK 设置文件打开方式为非阻 塞模式.它使CPU等高速设备在 读终端低速设备时不会永远阻塞. 如果操作不能完成.则调用立即出 错返回.不致影响后续指令执行 2.2设置终端属性 1)终端属性结构 图1 RS一485总线通讯结构图 Linux中可以检测和更改的终 Fig.1 RS-485 bus communication structure diagrams 端设备特性都包含在termi0s结构 232物理接口接入主站 中,该结构定义在头文件<termios.h>中ll。从整体上 系统软件环境为Linux的Ubuntu 9.04发行版 说.程序通过修改termios中各成员的值来控制串口 本,GNOME2.6桌面环境;采用C语言编程,使用 终端的各种特性.从操作系统的角度来看.终端设备 GCC3.0编译器 后台使用开源的Mysql数据库.完 驱动程序也是利用该结构控制串口的。 成数据存储及相关报表生成功能。 2)获得终端属性 设置终端属性要用到两个函数: 2 Linux终端IO设置 #include<termios.h> 所有操作系统的终端I/0设置都是非常繁琐 int tcgetattr(int field,struct termios*termptr); 的.UNIX也不例外 在大多数版本的UNIX手册中. int tcsetattr(int field,int options,struct termios 终端I/0手册页常常是最长的部分… 终端I/0设 termptr); 置的条目也非常多。任何一个小的参数设置不合 这两个函数都有一个指向termioS结构的指针. 理.就会出现各种莫名其妙的问题,比如说数据接 tegetattr函数获得当前系统termios结构的内容并将 收都很正常.可发送的却是乱码等现象 其存人termptr指针所指的结构变量内.然后程序就 2.1 打开终端 可以设置结构变量成员值至合适的值.最终由tcse— 在Linux环境下.串口等终端设备都被当做文 tattr函数将设置后的结构变量的值写入系统当前 件来看待.串1:I文件名从ttyS0开始依次是ttyS1、 termios结构。 ttyS2等.若加入USB转RS一232设备.还会有文件 3)设置终端属性 名ttyrUSBO等 在LinUx中.打开串El设备和打开普 termi0s结构成员的数据类型teflag t的长度足 通文件一样,使用的是open()系统调用: 够长,因为结构体每个成员,例如控制标志C cflag, fd=open(”/dev/ttySO”,0一RDWR f O_NOCTFY l 都包含很多设置选项,因此无符号整形(或长整形) Otcflag t字节中被分成了许多小段.每段由不等的位 —NONBL0CK); 该函数打开串口COM1.并返回一个整型值的 构成,每个小段(数据位)代表一项设置,如“启用硬 串口文件描述符fd 函数的第二个参数用来说明此 件流控制”、“字符屏蔽”等。其中最基本的设置标志 函数的多个选型.它是定义在<fcnt1.h>头文件中的 有数据位CSIZE.停止位CSTOPB,奇偶校验位 自动亿与仪表2010(12 田 PARENB、PARODD等。 设置某一标志的方法是使用掩码屏蔽掉其它 位(即不影响其它位),而对本标志按位进行“与”、 “或”运算 对于执行串15终端收发任务的程序来 说.需要对终端做如下设置: cfsetispeed(&options,B9600);//设置输入波特 塞9600b/s cfsetospeed(&options,B9600);∥设置输出波特 室9600b/s / 设置C cflag控制标志各属性 / options.C—cflagl=(CLOCAL l CREAD); options.C cflag&=~PARENB;//设置无奇偶校验 options.c_cflag&=~CSTOPB://设置一位停止位 options.e _cflag &=~ CSIZE//:用字符长度屏蔽 CSIZE将表示字符长度的位清零 optionS.C cflag l-CS8://设置8位数据位 设置c_iflag、c_oflag输人、输出及本地标志 各属性术/ options.c_ilfag&=-(IXON IIXOFF IIXANY);//关 闭启动一停止输人、输出控制, options...一ilfag&=-(INLCR IIGNCR IICRNL);// 避免忽略接收控制字符CR和避 ,/免NL与CR的相互转换。这两个选项要根据 各型仪表不同的通讯协议而定 options~一oflag&=-OPOST;//关闭c oflag字的 各种实现定义. options.C—llfag&=~(ICANON IECHO IECHOE I ISIG)://关闭规范模式、终端回显等 设置终端超时选项 / options.C CC『VMIN]:0;// options.c Cc[VTIME]=10;//这两项设置意思是 系统读串口等慢速终端设备时.没有读到数据也可 返回.或读超过1s也将返回.这种设置对需要响应 人机交互操作的窗口界面程序是可行的.避免等待 慢速设备时使用户产生系统响应慢的感觉,但代价 是增加了系统开销 3 Linux用户图形界面编程 Linux应用程序的GUI(图形用户界面),目前有 两个最受欢迎的GUI库:GNOME/GTK和KDE/Qt 。 GTK完全用C写成,Qt采用的是C++语言。GTK与 Qt各有所长,Qt由于采用面向对象技术,方便、快 田 捷.但有版权限制;而GTK编译后代码轻巧,采用 LGPL许可协议.是GUN自由软件.双方相互竞争 发展 本篇文章主要讨论GNOME平台GTK+库在 终端IO通讯方面的一些问题 3.1 GNOME/GTK简介 GNOME是由GIMP(Linux下著名的图像处理 软件)程序员发起的一个项目.目标是为Linux创建 一个统一的桌面 现在GNOME已经成为Red Hat Linux默认桌面的基础 GTK+(the Gimp Too1Kit)也是来源于GIMP。简 而言之,GTK+是一个库,它提供一组已制作好的称 作“窗口部件”的组件.通过简单易用的函数调用把 这些组件和应用程序逻辑组合在一起.从而极大地 简化了GUI的创建_2 GTK+建立在以下库的基础之上:Glib通用库. Pango库.ATK库.GdkPixbuf库,GDK库。其中Glih 提供了许多有用的数据类型,宏.类型转换,字符串 操作]一具.文件操作工具,抽象消息循环等机制。下 面介绍的用于终端通讯的10通道概念就来源于这 个库;Pango用于国际化的文本处理,是许多文本窗 口部件如文本框(GtkEntry),标签(GtkLabe1)和 GtkTreeView的引擎 对这些部件的图形处理,如字 体.字形大小、颜色,背景色等都要用到这个库[3]。 虽然GTK+用C语言写成.但却采用面向对象的 设计思想.通过GObjeet库支持面向对象和面向对象 编程。GTK中各种基本的窗口组件。如窗口(GtkWin. d0w)、按钮(GtkButton)、数据列表或树视图(GtkTree view)、文本框(GtkEntry)等.都是通过继承和多态从抽 象类GObject、GtkObiect继承下来的,继承和多态是通 过宏完成的 例如某一函数的参数需要GtkButton类 型变量.而调用的却是GtkWidget抽象类型变量but. ton.可使用宏GTK BUTFON在GtkWidget和Gtk. Button之间进行类型转换:GTK BUTTON(button)。 进行GNOME平台软件开发.需安装gnome—de— vel和gn0me—deve1~d0es软件开发包和开发文档。 3.2 图形界面的事件、信号和回调函数 所有的图形用户界面程序都有一个共同点:必 须有某种机制响应用户动作以执行代码 在GTK+ 中,事件,如用户击键。称为信号(signa1);事件监听 称为回调函数(eallback)。用以完成相关事件的处理 工作 把回调函数与某一信号连接起来需要用到函 数:gulong g_signal_—connect();该函数的第二个参 数是信号名,第三个参数即是回调函数的句柄。 3.3 GTK+终端IO的方式 用于串行终端通讯的程序必须能够感知串行 对于采用RS485总线通讯的网络.总线上往往 挂接了多台仪表设备.主站要采用轮询的方式发送 指令.指令中包含地址码等信息以使不同的从站做 出响应.因此程序必须要有定时发送机制 GTK+中通过建立超时函数.也能非常方便地完 成定时发送任务: g_timeoutadd(guint interval,write—digital_port, —终端数据收发的事件.当串口有仪表数据传人时. 应启动数据接收子程序.并根据不同仪表的数据传 输格式 分析接收的字符串,找到有用的信息。同时 程序还应发送指令.通过缓冲区发送至485总线上 去。以使各台仪表产生响应。 截至目前.系统描述的结构是单线程的,在任 务单一或后台运行的程序中.这种结构是可行的, 程序可以通过一个while()循环不停地去读串口。但 是在图形用户界面.程序要响应用户的界面操作. 后台还要发送仪表指令.系统结构相对复杂了许 gpointer userdata); _— 其中:interval是定时间隔,单位为ms;writeseri—al port是回调函数名.该回调函数完成发送通讯指 令的任务:user data是传递给回调函数的参数。这 个函数的作用是每隔一定间隔.调用写串口函数.发 送通讯指令 只需一条语句就完成了定时发送的任 务,非常简洁、方便。 多.程序怎样才能完成不同的事件响应呢.GTK软 件包提供了IO通道的概念.使处理复杂的终端10 操作变得非常简单。10通道(IO Channels)实际是 Glib库的一个功能.它提供了便捷的文件.管道和 4结语 RS485总线通讯网络拓扑结构相对简单.在工 业现场有着大量的应用.而Linux下基于GTK+软件 库开发的程序能够用简洁的代码完成较为复杂的任 sockets操作支持[4]。通过函数新建一个IO通道: GIOChannel serialport=g_iochannelunix———_new (fd); 务.特别是Glib库的IO通道、超时函数机制使程序 员可以拿出更多的精力解决具体的业务问题 笔者 单位利用上述开发平台与工具开发的产品流量计量 系统将一个制粉厂十八台智能仪表组成一个通讯网 络.读取各条生产线原料与产品产量数据.除显示实 时流量外.还将数据存入后台数据库,生成各级产量 报表。为生产调度提供分析数据,系统运行稳定、可 靠.收到了良好的经济效益 参考文献: [1]W.Richard Stevens,Stephen A Rago.UNIX环境高级编程[M]. 2版.尤晋元,等译.北京:人民邮电出版社,2008. [2]Neil Matthew,Richard Stones.Linux程序设计[M]-3版.陈健,等 译.北京:人民邮电出版社,2008. [3]GNOME Foundation.GTK+Reference Manua1.2.20.1 version 参数fd是串口的文件描述符.函数返回指向 GIOChannel的指针.然后通过函数 guint source=g ioadd——_watch(serial——port—G IO _IN,readserialport,gpointer userdata); ——向窗口主循环添加具有默认优先级的对10通 道事件的监视 G 10 IN是事件监视类型.在这里是 数据输入事件(读串E1),相同的还有G IO OUT.数 据输出(写串口);read serial port是回调函数名; user data是传递给回调函数的参数 这个函数的作 用是当有数据传输入串口时调用read serial Doft函 数完成相关处理任务 由于g io add watch()函数将IO通道的事件监 视加入到窗口消息循环队列中.程序员不必处理频繁 [Z],2007. [4]GNOME Foundation.GLib Reference Manua1.2.16.1 version 『Z].2007. ■ 的10数据传输事件,而将精力放在数据通讯、数据存 储的处理上.大大简化了程序开发人员的工作量 自动化与仪表2olo(12、 田