版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux下的串口通信
)
摘要:I/O终端现在有着非常广泛的使用,使用时也是相当的复杂,其中的串I」通信应用
在各个领域,尤其是在嵌入式设备的开发和通信过程中获得了广泛的应用,在本文中选择使
用了RS-485串行通信协议,并且在Linux的环境3使用POSIX编程标准,编写了可以在
Linux环境下运行的RS-485串口通信程序,并且给出了一个使用RS-485串口通信的应用。
关键词:Linux:串口:RS-485
Theserialcommunicationinlinux
Abstract:I/Oterminalsnowhaveaverywiderangeofuse,isalsoquitecomplextouse,inwhich
serialcommunicationapplicationsinvariousfields,especiallyinthedevelopmentofembedded
devicesandcommunicationprocesshasbeenwidelyused,inthisarticlechosetousetheRS-485
Serialcommunicationprotocol,andintheLinuxenvironment,UsingPOSIXprogramming
Standard.IheRS-485serialcommunicationprogramwhichcanruninLinuxenvironmentis
written,andanapplicationusingRS-485serialcommunicationisgiven.
KeyWords:Linux;serial;rs485
1引言
1.1串口通信的研究背景
随着计算机的不断普及以及工业领域等一些其他行业的不断发展,其中使用
最多的通信功能就变得越来越重要,其中在远距离通信时,山于布线简单,需要
使用的传输数据的用线也很少,成本比较低,经常采用串行通信。而在近距离通
信时,运用串行通信更加普遍,比如我们日常经常使用的打印机,磁盘等使用了
串行通信,尤其在工业领域对设备的实时控制和数据管理方面,经常采用多台微
机组成一个分布式控制系统,而每个从机之间使用的通信方式就是串行通信了。
而且使用串行通信技术不仅可以组成一个一个的控制系统,还会使得组成控制系
统的从站的硬件的设计变得简单化,具有更高的可靠性,从而降低开发成本。,
1.2常见的串口通信总线
在选择使用串行通信总线时,一般会从以下的一些的度去考虑使用哪种串行
总线协议:
(1)数据传输速率;
(2)数据位传输顺序,先传输最高位或者最低位;
(3)片选方式,通过硬件片选输入或者软件协议;
(4)外设与微控制器的同步方式,通过一根硬件时钟线或者通过内嵌于数据
流中的时钟信息;
(5)数据是在单根线上传输,即在“高”和“低”之间转换;还是在一对差
分信号线上传输,即两根线按相反的方向同时转换电压;
(6)是否使用匹配电阻实现阻抗匹配,一般差分信号传输两端需要兀配电阻,
而单端信号不需要匹配电阻。
根据不同的使用需要就要选用不同的串行通信方式,如图17是常用的一些
串行通信总线的对比。除了图1T所示的一些串行通信总线协议,还由其他的一
些串行通信总线协议,比如现在也经常使用的高速串行接口如
LSB3.0/3.l,ThunderBolt等协议,还有在现在日常中使用的串行通信总线中速
度最快的光缆,但是在使月中并不是传输速度越快的越好,在传输速度提升上去
的同时,一定还伴随着其他的消耗,比如布线更加复杂,使用的器材更加昂贵等
等,所以在自己的设计中选择最适合的才是最好的。
从机选中方式
协议地址硬件片选线
1-Wirc
LINbus
ScnMHPalh不见配
自同步UNVO
阴
(异步)UART
步抗
RS485
方兀
LVDS
式匹配电阻fid
CAN.USB
时钟线
代SPI
(同步)不匹配
SMBUSMICROWIRE
图IT常用串行通信总线对比
1.3RS-485标准的发展
RS-485标准是在RS-232标准上发展来的,在1969年,美国电子工业协会
(EIA)把RS-232c(简称为RS-232)定义为串行通信的电气标准,这个通信标准
对电气特性等一些参数给出了标准数据,RS-232通信标准适合数据的发送速率
在0-20000bit/s内,之后因为RS-232标准在之后的使用中发现了一些缺陷,所
以在之后美国电子工业协会(EIA)又定义了RS-422标准和RS-485标准。RS-422
标准的出现解决了一些问题,首先是传输信号的速度提高到了10Mbit/s,布线
的长度也提升到了4000英尺(在传输速度低于100kbit/s时),并且RS-422
还扩展了从站的个数,在总线上最多可以连接10个数据接收器,但是RS-422只
能单向的发送,为了解决这个问题,EIA又在1983年在RS-422标准基础上制
定了RS-485标准,RS-485标准的出现,使得在一个总线上可以有多个主站同
时发送消息而不会产生冲突,提高了数据的发送能力,在RS-485总线上最多同
时可以连接128个从站接i攵器,这样做就提高了总线的布线范围,使得数据的交
互变得更加快速。RS(recommendedstandard)的意思为这是EIA官方提供推荐
使用的标准协议,233,422,485是一种用于识别的标号,C代表这是最新的修
改标准,以前使用过A,B作为后缀,这些通信标准都对连接信号线的信号功能,
逻辑电平的定义,机械特性做出定义。
2RS-485串口通信的实现方式
2.1什么是串口通信
串口通信是串行通信中的一种,串行通信是指在通信的时候,只需要使用一
根数据线发送数据位,依次一个一个的传输,每个数据位的发送都是占用着固定
时间,这样我们在系统之间使用几根数据线就可以通信了,特别适用于嵌入式设
备的信息传输。串行通信可分为同步通信和异步通信,而串口通信就属于异步通
信,同步通信和异步通信之间的最大的区别就是发送时钟和接受时钟是否需要一
致。
串口通信的概念十分简单易懂,通信设备两端的接口通过一根信号线连接,
数据信号线上依次传输在如图2-1所示,虽然这会导致通信速度会比并行通信
慢,但是它能保障数据的准确性,比较适合远距离通信,用串口通信设备总线的
最大长度理论上可达1200米,比如传输ASCLL字符时,可以使用发送线,接收
线,地线三根线进行通信,由于是异步通信,所以在发送的时候也可以接收总线
上的数据,当用串口通信的时候,数据交互的两个设备之间波特率,数据位,停
止位,和奇偶校验这些参数必须相同,否则协议的差距,导致数据无法数据解析,
从而使得通信失败°
图27串口通信示意图
下面就是波特率,数据位,停止位,奇偶校验的概念:
(1)波特率:这「
2就是发送的速率,
比如每秒钟发送24(Z时候的波特率就是
2400Bud,转化为比率发工程中调制速率是要
比波特率大的,比如与—{TH->0—青和传输距离成一个
反比关系的,一般用—Ob'-45—俞距离短时,就需要
波特率比较小了,这—O-H3-、端口之间传输数据
时波特率一定要相需J-EEH~SH3-GH3-nZ]-
(2)数据位:这是携带真实需要传输的位数的参数,一个数据包被发送出去,
并不是所有的数据位都是携带数据的,一般在在串口通信中,数据位的设置是6
位,7位,8位,这取决你想要发送什么样的数据,在使用串口通信时,需要上
位机软件来定义到底需要多少位数据位,来定义自己的通信协议。
(3)停止位:这是存在于每个数据包的最后一个数据位,一•般在串口通信时
这个数据是1,1.5或者2,停止位不仅代表着一个数据包的停止,还可以同步
两个设备的时钟,由于数据在数据线上传输时定时传榆的,而两个通信设备都有
自己的定时时钟,很可能在传输数据中两个通信设备的时钟不一致,这时候就需
要停止位来提供时钟同步的校验。停止位越多,可以容忍的时间的差距越大,当
然,这样做的结果就是会导致数据的传输变慢。
(4)奇偶校验:串口通信提供了一些校验方法,一股这一位校验位在数据位
的后一位,用这一位来确保数据的准确性,校验并不会真正的检查数据,校验位
只是提供一个状态位,用来提醒通信双方在数据的传输过程中是否会因为噪声干
扰导致数据丢失或者数据传输不同步
2.2通信串口协议的选择(RS-485)
2.2.1RS-485协议的定义
RS-485是一种典型的串行通信的标准,这是是一种硬件层的协议,它定义
了电压,阻抗等等,之解法了数据如何传输的问题,比如两个设备之间需要互相
通信,设备一需要向设备二发送一个数据0x65,0x65的二进制为01100101,要
把8个二进制数发送给设备二,它主要解决了0怎么传,1怎么传的问题,这就
是硬件层需要的解决问题。所以RS-485的电气特性定义了两根线之间的电压为
+(2-6V)表示逻辑“1",-(2-6V)表示逻辑“0”,而且这个电平是和TTL电平
是相互兼容的,可以和TTL电弧相互连接如图2-2所示。
2.2.2RS-485协议的特点
(DRS-485标准定义了其数据在信号线上可以以10Mbps的速度传输
(2)RS-485的接口采用了差分双绞线传输,可以最大程度上减少外界噪声的
干扰。
(3)RS-485的最大的布线的距离为4000英尺,但是这个数据因为现实生活
与理论的差距,实际操作中最大的传输距离极限也就只有1200叫RS-485总线上
最多可以连接128个从站接口,即可以连接多个从站进行数据的交互,这样使用
者就可以使用RS-485总线建立分布式结构网络。因为RS-485在数据传输时一般
只是用两根线,所以RS-485采用差分双绞线传输,由两根数据线连接起来的
RS-485数据网络是半双工通信网络。
JITUL
innr
rfn
图2-2RS-485通信原理
2.2.3差分传输法
与RS-232串口协议不同,RS-485的数据传输采用了差分双绞线传输。和以
前的传输方法不同,两根信号线传输成为了差分传输法的标识特点,两根信号线
上传输的信号相位彼此相反,振幅彼此相同,这样的信号就叫差分信号。在接收
端只要判断两根信号线之间的电压差值就可以判断逻辑状态了。
使用差分信号传输,会有以下的几个好处,第一个好处就是可以控制相对的
基准电压,很容易就可以识别小的信号,在一根地线,一根信号线传输的的系统
里,是相对于地线做基准的,依赖的是“地”相同性,但是在长距离的传输中,
“地”就会产生差异性,从而导致产生误差,而差分信号的传输是用两根信号线
电压的差值来比较的,长距离的传输对两根信号线的影响是相同的,所以可以保
证信号传输的正确性。
差分信号传输的第二个好处是两根信号线传输数据时,对于外部的电磁干扰
具有抵抗性,因为电磁信号是影响两根信号线,既然差分传输使用两根信号线的
电压差值来发送信号值,这样就可以忽视掉电磁信号的干扰了。
差分信号的第三个个好处就是在只有一个电源的信号传输的系统中,为了能
够处理两极的信号,必须要建立一个虚拟的地,用比虚地高的电压来表示正极信
号,而用比虚地高的电压来表示负极信号,但是在差分信号的传输中,就没有必
要使用虚地了,也就不需要依赖虚地的稳定性了。
有好处一定会有一定的坏处,使用差分信号传输时,需要占用的布线的面积
比较大,如果在电路板上布线,而布线面积比较小时,就没法使用了。
2.3本文使用的RS-485通信模块
本文选用的RS-485串口通信模块的设计如图2-4所示,在RS-485串口通信
模块中,主站时一个运行着Linux操作系统的PC主机,通过USB转RS-485转化
器与从站模块,一个电池数据采集模块库仑计相连,从而构成一个串口通信模块,
只需要主站定时的向从站模块发送获取数据的命令,从站模块就会将采集的数据
通过RS-485中口发送给主站,主站通过通信办议解析后就可以得到电池的参数。
图2-4RS-485串口通信模块
本文所使用的USB转RS-485转换器如图2-5所示,USB转RS-485转换器让
没有串口的计算机主机可以连接带有串口的从站模块,在当今的的上位机设备
上,USB接口是此U画buntuDesxtcp发,传输数
据的速度快,即拒
尤其是对于计算才
图2-5USB转RS785串口实物图
从站的库伦计模块如图2-6所示,从站库仑计模块是一个采集电池电量参数
的模块,它的基本原理就是通过电路传感器计算单位时间内流入和流出干路电荷
的数量,然后获得的数据做积分后进行累加或者累减,最后计算出电池的当前电
量。库仑计的基本原理就是这样。
图2.3-3从站库仑计模块实物图
3Linux下的RS-485串口通信编程
3.1Linux下软件开发环境
(1)操作系
串口通信口图3T所示
图3Tubuntul6.04操作系统
(2)编辑器:
编辑器是选用Vscode(VisualStudioCode)是由微软研发的一个跨平台
的代码编辑器,支持很多的插件。
(3)编译器
编译器是选用的GCCC/C++编译器,这是由GNU开发的编程语言编译器,它
支持多种编程语言的编译,现在改名为GNU编译器套件在编译一个test,c程序
时,使用的操作如下gcctest,c-0a.out就可以生成一个a.out的可执行程序
了。
(4)代码管理
多文件的文件管理使用了Makefile文件,使用了GNU中的make工具,make
是一个命令工具,它能解释Makefile文件中的指令。在一个写好的Makefile
文件目录下,只要使用make命令,就可以编译多文件了,从而不需要手动输入
那么多的编译命令了。
3.2Linux下的设备文件
在Linux编程环境下,要想使用RS-485串口通信,首先需要打开RS-485
串口描述文件,再对打开的RS-485串口描述文件返回的句柄配置波特率,数据
位,停止位,奇偶校验等一些参数,最后就可以使用该文件句柄进行通信了,发
送数据时需要调用write。函数,接收数据时需要调用read。函数,具体流程如
图3-2所示。
结束时利用
close。函数关
闭串口描述文件
Linux输出主设次设
PC机上串口
串行设备名称备号备号
/dev/cuaO564COMI
/dev/cual565COM2
/dev/cua2566COM3
/dev/cua3567COM4
图3-2Linux下RS-485串口编程流程图
第一步要打开的RS-485串口描述文件是Linux环境下独有的,在Linux下
所有的外设接口等硬件设备都被虚拟成了一个设备文件,统一的由Linux内核提
供对外的接口函数,让应月者去调用这些接口函数从而达到操作外设的目的,而
这些设备文件被保存到了,dev目录下了,每个设备文件都有两个编号,其中一
个是主设备号,它代表着不同类型的设备,还有一个次设备号,它表示同一类型
而又不同的设备,主设备号和次设备号就可以确定一个设备了。这些设备文件分
为字符设备文件和块设备文件,字符设备文件是面向流设备,RS-485串口设备
文件就是流设备文件,每次读取数据时需要依次读取,而不能随机读取某个地方
的数据,而块设备可以随机读取设备内存中的数据。而在Linux下RS-485串口
的设备文件的命名规则是使用“ttyS”和设备号组成的。在Linux环境下RS-485
串口设备和Windows的RS-485串口之间的关系如图3-3和3-4所示。
图3-3Linux下输入RS-485串口与WindowsRS-485串口的对应关系图
Linux输入主设次设
PTVC*机in。1・甲白?口厂1
串行设备名称备号备号
/dev/ttySO4Mcavil
/dev/ttySl465C3I2
/dev/ttyS2466.侬。应关系图
图3-4
/dev/tt>S3467COVI4
有了RS-485申口设备的描述乂件,我们就口J以便,书Linux内核提供的Int
open(constchar"pathname,intflags)函数来打开文件来操作设备文件,其中
的参数“pathname”就是RS-485串口设备文件的所在路径,注意需要填写绝对
路径,第二个参数“flag”是要以什么方式打开文件,它有着许多标志,如果要
详细了解,该函数定义在〈sys/types.h>头文件中,可以去查找,这里我就不再
赘述了,当调用opon()函数打开设备文件成功后,就会返回一个设备句柄,如
图3-5和3-6所示,返回的句柄为3,这个句柄可以以供后续的RS-485串口的
操作使用。
图3-5打开设备文件调用的open()函数
图cnan()函釉3云行结果
fd=open("/dev/ttyusBeB,O_RDWR|O_NOCTTY|O_NDELAY);才是
“/if(fd>e)机,
而彳口国数
printf("openserialportsuccessful,fd=%d\nM,fd);
秘w:
3.3-Linux的KS-485申口笏数的配置
在Linux下RS-485串口的参数的配置主要有以下一些参数,波特率(Baud
rate),数据位(IRserialportsuccessful,fd=3y),除了这些参
数之外,还有很多参数可以配置,这里我只是把我的程序里的一些参数做一些说
明,Linux下的RS-485串口参数主要是在termios结构体中,要想对RS-485串
口参数进行配置,必须要对这个结构体比较熟悉,该结构体体在〈termios.h〉头
文件中定义,该结构体的定义如图3-8所示:
#include<termios.h>
structtermios{
tcflagjcjflag;/*指明输入方式的毋志位,/
tcflagjjoflag;/*指明输出方式的标志位•/
tcflagjc_cflag;/*指明控制方式的标志位*/
tcflagjc_lflag;八指明局部方式的标志位•/
cc_tc_cc[NCCS];/♦指明用于控制的特殊字符*/
if(tcgetattr(fd,&options)!=e)
(
perrorCSetupSerialI");
return(FALSE);I
)
termios结佝体看5个荽奴UWJc_itlag荽数官埋看登用H'、J枷I入方式,
c_otiagcfsetispeed(&options,speed_arr[i]);1寸举,
数据位,cfsetospeed(&options,speedarr[i]);[来,若
有数据,则发送给应用程序,c_cc参数定义了一系列控制参数的标志位,此外,
在Linux环境下还提供了一些函数去配置串口属性,如图3-9所示。
函数描述
tcgetaur获取串u属性
tcsctattr设置中「1属性
cfgetispeed获取输入速率
clgctospecd获取输出速率
cfcetispeed设跷输入速率
在打开RS-4J一罡义一个termios
c(setospeed设置输出速率
类型的结构体变直L」.会数,然后再调用
tcdrain等待所有输出被传送
cfsetispeedO函tcflow何停传输或接受俞入和输出的波特
率,然后再对定义tcflush丢弃队列中尚未传送或接受的数据内帝曷的讲■罟.附
tcsendbrcak发送BREAK字符二二;』二九:
置完成后需要tc;no中』以畲
tcgetpgrp获取前台进程组ID
文件的参数设置京tcsetpgrp设世前台进程组ID1335所不,其中
RS-485串口参数配置为波特率位9600,8个数据位,1个停止位,没有校验位。
图3-10获取终端的相关参数
图3T1设置RS-485串口的波特率
头(2字节)功能码(1数据数据2数据3数据4和校验(1字节)
字节)1
0x5A0xA50x100x000x000x00模块地0x0F(前面7字节之
址和)
1现Q14附智RS-dM中n的僖I卜代
options.ccflag|=CS8;
options.ccflag&=-PARENB;
options.ciflag&=~INPCK;
图3-15设置终端的相关参数
3.4Loptions.ccflag&=YSTOPB;break;
在本文中使用的程序如图3-16所示,首先程序的开始会去打开RS-485串口
设备文件和配逑K忘在旃cs肃嬴做出'。品)、飞,2口,周期的与从站库
仑计模块通信{lperror(1.comseterror!Xn-);中则会去连接
Mosquitto服类returr(FALSE);
}
通信时参照当口通信获取电
池参数,如图3的一种:
图377库仑计通信模块读取参数命令
使用read。函敖
接收从站发送的
数据
图:
1包头2'1字1字节
检验包头是否正7
确
।0x5A0xA53电流方模块前面14个
OxiO
O.i'f:0是放地址字节和校
1检验校验和是否■验
正确
为充电
根据不同的功能
码进行不同的数
据包解析
将解析的参数放
入缓存区
先填写数据包头
填写功能号
送模块
图3Tg填写要发送数据
senddataten=8,senddata:5affffffa509000008册98:ssei=1
图3-20晌结果
计算校验和
之后就是接收数据的处理」)函数去接收从站返回的数据,
查看返回值如图3-22所示,报检杳数据包的包头是否正确,
然后再检验校验和是否正确,S发送数据及获取5能码对数据包做不同的解析,
返回值
最后将解析出来的数据存储。二..示:
图3-21RS-485串口数据接收模块
Irecvdatalen=19,recvdata:5affffffaS098a032003*fffff84船的一舶
图2-22read。函数调用返回结果
如上图的设计模块的验证以及返回结果所示,发送读取参数的数据包给从站
模块,收到了相应的数据包回复,成功的与从站模块通过RS-485串口进行通信。
4RS-485串口通信的应用
4.1MQTT协议
为实现在手持终端上能够实时的查看通过RS-485串口通信获得的电池参
数,现在使用了MQTT协议,MQTT(MessageQueuingT31emetryTransport)协
议是专门为硬件性能比较差以及网络要求比较差的情况下而设计的一款轻量级
的协议。它是基于tcp/ip协议的上层协议。MQTT主要有三个概念,Publish(发
布),Subscribe(订阅),Broker(服务器),MQTT协议提供一对多的消息发布,
只要一端的客户端发布了一个消息,只要另一个客户端订阅相关的消息即可接受
到相应的数据,通过MQTT协议,现在已经出现了许多种编程语言编写的服务端,
而本文使用的是Linux环境下利用C语言编写的一款消息代理软件Mosquitto,
若想要详细了解该协议的使用以及在Linux下的安装配置,请自行寻找资料解
决,本文只是演示该代理软件的功能。
4.2使用MQTT协议发布数据订阅数据
在本文的程序中首先会利用RS-485串口通信获取电池参数,再使用
Vosquitt。软件中提供的接口函数去连接Mosquitt。的服务器发布相关的话题信
息,然后就由手机客户端云连接Mosquitt。的服务器去订阅相关的话题信息,就
可以获得相关的话题信息了,其流程如图4-1所示。
图图
在手机客户端使用时可L,注意这个话题一定要和发布
的话题一致,这里我订阅的市4-2所示,订阅了话题的话,
如果有相应的话题信息发布,。服务器推送的相关信息了,
如图4-3所示。
图4-2订阅温度话题
《②Subscribe
,1,Topic.A__Add
9--------------------------0--------------------------9
亭i.4GI.I.।
(<一iDashboard
〔’口19ReceivedMessages
26.000000
wendu
26.000000
wendu
图4-3获取订阅的主题的数据
以上的订阅发布消息都可以在Mosquitto服务器端查看到,如图4-4所示,
首先可以看到该服务器运行时绑定的端口时1883,这也是Mosquitto服务器默
认的绑定端口,之后我们订以看到手机客户端连接上了服务器,并且订阅了一个
“wendu”话题,之后就可以看到另一个客户端连接了服务器并且发布了话题为
“wendu”的数据,该客户端就是本文所使用的程序,最后可以看到服务器将收
到话题为“wendu”的数据推送给了手机客户端。
losqutttoversionl.o.lstarting
S57896361:C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国塔式服务器行业应用动态与发展趋势预测报告
- 2025-2030中国唇部护理行业需求规模预测与竞争战略规划报告
- 大班小学生的早晨
- 七年级数学教学工作总结7篇
- 周口师范学院就业指导服务
- 2026年贵州高考历史解析含答案
- 2025年广西壮族自治区百色市八年级地生会考考试题库(附含答案)
- 2025年湖南省怀化市八年级地理生物会考真题试卷(含答案)
- 2025年广东省中山市初二学业水平地理生物会考试卷题库及答案
- 2025年广东省深圳市初二学业水平地生会考试题题库(答案+解析)
- 2026河北省国控商贸集团有限公司招聘备考题库及一套答案详解
- (2026版)医疗保障基金使用监督管理条例实施细则的学习与解读课件
- 挖机租赁合同计时
- 浙江省2024浙江省药品监督管理局所属3家事业单位招聘15人笔试历年参考题库典型考点附带答案详解
- 社会团体内部规章制度
- 2025年国家药品监督管理局药品审评中心考试真题(附答案)
- 国家艾滋病随访指南
- 证人证言(模板)
- 【高二物理(人教版)】静电的防止与利用-课件
- DB32∕T 2975-2016 水运工程建设管理用表
- 危险废弃物处置合同范本
评论
0/150
提交评论