C#和232串口通信方法(SerialPort控件)_第1页
C#和232串口通信方法(SerialPort控件)_第2页
C#和232串口通信方法(SerialPort控件)_第3页
C#和232串口通信方法(SerialPort控件)_第4页
C#和232串口通信方法(SerialPort控件)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本例程主要讲解使用c#,实现与232串口通信。达到采集串口数据,监控,可视化 处理等。一 .概述在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control (简称 MSComm )的通讯控件,只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在 Microsoft.Net技术广泛应用的今天,Visual Studio.Net没有将此控件加入控件库, 所以人们采用了许多方法在Visual Studio.Net来编写串口通讯程序:第一种方法是通过采用Visual Studio 6.0中原来的MSComm

2、控件这是最简 单的, 最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/lnvoke调用方法实现;第三种方法是自己用API写串口 通信,虽然难度高,但可以方便实现自己想要的各种功能。现在微软推出了最新版本的Visual Studio 2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序。NET Framework 2.0 类库包含了 SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,本文着重讨论了 Visual Studio 6.0的MSC

3、omm控件和SerialPort类设计方法的异同 点。SerialPort常用属性、方法和事件1 .命名空间System.lO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步I/O和事件驱动的I/O、对管脚和中断状态的访问以及对串行驱动 程序属 性的访问,所以在程序代码起始位置需加入Usi ng System.lO.Ports。2 ,串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和SettingsSerialPort类与MSComm有一些区别:a.通讯端口号COMPortN

4、ame属性获取或设置通信端口,包括但不限于所有可用的端口,请注意该属性返回类型为String ,不是Mscomm.CommPort的short类型。通常情况下,PortName正常返回的值为COM1、COM2,SerialPort类最大支持 的端口数突破了 CommPort控件中CommPort属性不能超过16的限止,大大方便了用户串口设备的配置。b.通讯格式SerialPort 类对分别用BaudRate、PaHty、DataB网、StopB属性设置通讯格式中的波特率、数据位、停止位和校验位,其中PaHty和StopBits分别是枚举类型Parity、StopBits , Parity类型中

5、枚举了 Odd(奇)、 Even(偶)、Mark、None、Space,Parity 枚举了 None、One、OnePointFiveTwo oSerialPort类提供了七个重载的构造函数,既可以对已经实例化的SerialPort对象设置上述相关属性的值,也可以使用指定的端口名称、波特率和奇偶校验位数据位和停止位直接初始化SerialPort类的新实例。3 .串口的打开和关闭SerialPort 类没有采用 MSComm.PortOpen=True/False设置属性值打开关闭串口,相应的是调用类的Open()和Close。方法。4 .数据的发送和读取Serial类调用重载的Write和W

6、riteLine方法发送数据,其中WriteLine可发送 字符串并在字符串末尾加入换行符,读取串口缓冲区的方法有许多,其中除了 ReadExisting和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后,引发ReadExisti ng异常。5 . DataReceived 事件 该事件类似于MSComm控件中的On Comm事件,DataReceived事件 在接收到了 ReceivedBytesThreshold设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。其中ReceivedBytesThresho

7、ld相当于MSComm控件的Rthreshold属性,该事件的用法与MsComm控件的On Comm 事件在 CommEve nt 为 comEvSe nd 和 comEvEof 时是一致三SerialPort的使用对于熟悉MSComm控件的程序设计者,SerialPort类是相当容易上手 的。在 进行串口通讯时,一般的流程是设置通讯端口号及波特率、数据位、停止位和校验 位,再打开端口连接,发送数据,接收数据,最后关闭端口连接这样几个步骤。数据接收的设计方法在这里比较重要,采用轮询的方法比较浪费时间,在 Visual Basic中的延时方法中一般会调用API并用DOEvents方法来处理,但

8、程序 不易控制,建议采用DataReceived事件触发的方法,合理的设置ReceivedBytesThreshold 的值,若接收的是定长的数据,则将 ReceivedBytesThreshold设为接收数据的长度,若接收数据的结尾是固定的字符或字符串则可采用ReadTo的方法或在DataReceived事件中判断接收的 字符 是否满足条件。SerialPort类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调 用,可以使用异步处理或线程间处理调用这些读取数据的方法。由于DataReceived事件在辅线程被引发,当收到完整的一条数据,返回主线 程处理或在窗体上显示时,请注意跨线程的处

9、理,C#可采用控件异步委托的方法Control.Beginlnvoke及同步委托的方法Invoke。四.结束语在.NET平台下熟练使用SerialPort类,可以很好地开发出串口通讯类程 序, 对于过去使用MSComm控件设计了一些通讯程序,也可以将MSComm 控件替换为SerialPort类,当然为了避免对以前的项目做大的改动,可以使用 SerialPort类设计一些与MSComm控件具有相同接口的类,在今后工业控制 中, SerialPort类将广泛地应用于串口通讯程序的设计中, 发挥着与MSComm 控件一样的作用。C# SerialPort运行方式SerialPort中串口数据的读取

10、与写入有较大的不同。由于串口不知道数据何时到达,因此有两种方法可以实 现串口数据的读取。一、线程实时读串口;二、事件触发方式实现。由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件, 默认为1。 另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行

11、数据传输,必须用间接的方式实现。如下:SerialPort spSe nd; /spSe nd,spReceive用虚拟串口连接,它们之间可以相互传输数据。spSe nd发送数据SerialPort spReceive; /spReceive 接受数据TextBox txtSe nd; / 发送区TextBox txtReceive; / 接受区Button btn Se nd;/数据发送按钮delegate void Han die In terfaceUpdateDelegate(stri ng text); / 委托,此为重点 Han die In terfaceUpdateDelega

12、te in terfaceUpdateHa ndle;public void In itClie nt() /窗体控件已在初始化( in terfaceUpdateHa ndle = new Han die In terfaceUpdateDelegate(UpdateTextBox); /实伤必匕委托对象spSe nd.Ope n();/SerialPort对象在程序结束前必须关闭,在此说明spReceive.DataReceived += Ports.SerialDataReceivedEve ntHa ndler(spReceive_DataReceive d);spReceive.Re

13、ceivedBytesThreshold = 1; spReceive.Ope n();)public void btnSen d_Click(object sen der,Eve ntArgs e) (spSe nd.WriteL in e(txtSe nd.Text); )public void spReceive_DataReceived(object sen der,Ports.SerialDataReceivedEve ntArgs e) (byte readBuffer = new bytespReceive.ReadBufferSize;spReceive.Read(readBu

14、ffer, 0, readBuffer.Le ngth);this .In voke(i nterfaceUpdateHa ndle, new stri ng En cod ing.Uni code.GetStri ng(readBuffer) ); private void UpdateTextBox(string text)txtReceive.Text = text;)点评:这个例子包括了这个控件几乎所有的操作,非常有参考价值.serialPort是在.netframework2.0中才有的东西,感觉这个东西和MSCOMM很相似.这里给出的例子是基于和CSHAPE的,相应的可以在Csha

15、pe和C+中使用,基本上都是一样的.Imports SystemImports System JO. PortsImports System. ThreadingPublic Class PortChatShared ,continue As BooleanShared _serialPort As SerialPortPublic Shared Sub Main ()Dim name As StringDim message As StringDim sComparer As StringComparer =StringComparer. OrdinallgnoreCaseDim readT

16、hread As Thread = NewThread (AddressOfRead'Create a newSerialPort object with default settings .serialPort = NewSerialPort ()'Allow the user to set the appropriateproperties .serialPort. PortName =SetPortName( .serialPort. PortName)serialPort. BaudRate =SetPortBaudRate (serialPort. BaudRate)

17、serialPort . Parity =SetPortParity (serialPort . Parity )serialPort. DataBits =SetPortDataBits (serialPort . DataBits )serialPort. StopBits =SetPortStopBits (serialPort . StopB让s )serialPort. Handshake =SetPortHandshake(serialPort . Handshak©'Set the read / write timeoutsreadThread. Start (

18、)Console. WHte (“Name:”)n ame = Con sole . ReadL in e()Console. WriteLine ("Type QUIT to exit11)While (continue )message = Con sole . ReadL in e()Dim newPortName As StringConsole.WriteLine ("Available Ports:")Dim s As StringFor Each s In SerialPort. GetPortNames() Console.WriteLine (&

19、quot; 0", s) Next sConsole. Write ("COM port(0):f, defaultPortName ) n ewPortName = Con sole . ReadL in e()If newPortName = 'H, Thenn ewPortName = defaultPortNameEnd IfRetur n n ewPortNameEnd FunctionPublic Shared Function SetPortBaudRate (ByVai defaultPortBaudRate As Integer) As Integ

20、erDim newBaudRate As StringConsole. Write (''Baud Rate(0):H defaultPortBaudRate)n ewBaudRate = Con sole . ReadL in e()If newBaudRate = ,n Thenn ewBaudRate = defaultPortBaudRate . ToString0fEndlfReturn Integer. Parse(newBaudRateEnd FunctionPublic Shared Function SetPortParity (ByVai defaultPo

21、rtParity As Parity ) As ParityDim newParity As StringCon sole. WriteL ine ("Available Parity options:*)Dim s As StringFor Eachs In Enum GetName$GetType(Parity )Console. WriteLine (" 0”, s)Next sCon sole. Write ("P arity(O):n defaultPortParity .ToString ()n ewparity = Con sole . ReadL

22、in e()If newparity = Then n ewparity =.ToString ()defaultPortParity End IfReturn CTyp& Enurji Parse( GetType( Parity ), newParity), Parity)End FunctionPublic Shared Function SetPortDataBits (ByVai defaultPortDataBits As Integer) As IntegerDim newDataBits As StringConsole. Write ("Data Bits(

23、0):n,defaultPortDataBits)CTyp& Enurji Parse( GetType(StopBits ), newStopBits ), StopBits ) EndFunctionPublic Shared Function SetPortHandshake (ByVai defaultPortHandshake As Handshake) As HandshakeDim newHandshake As StringCon sole. WriteL ine ("Available Ha ndshake options/*)Dim s As String

24、For Each s InEnurji GetName$GetType(Handshak©)Console. WriteLine (" 0”, s)Next sCon sole. Write ("Stop Bits(0):H,defaultPortHandshake . ToString ()n ewHa ndshake = Con sole . ReadL in e()If newHandshake = "" Thenn ewHa ndshake =defaultPortHandshake . ToString ()End IfRetur n

25、CTyp& Enurji Parse(GetType( Handshak©, newHandshak©, Handshake)End FunctionEnd Classusing System;using System. IO. Ports ;using System. Threading ;public class PortChatstatic bool .continue ;static SerialPort serialPort;public static void Main ()stri ng n ame;stri ng messageStri ngComp

26、arer stri ngComparer =Strin gComparer . Ordin allg no reCase ;Thread readThread = n ew Thread( Read;/ Create a new SerialPort object with default sett in gs._serialPort = n ewSerialPort ();/ Allow the user to set the appropriateproperties._serialPort. PortName = SetPortName(_serialPort.PortName);_se

27、rialPort. BaudRate = SetPortBaudRate (_serialPort.BaudRate);_serialPort. Parity =SetPortParity (_serialPort. Parity );_serialPort. DataBits = SetPortDataBits (_serialPort.DataBits );_serialPort. StopBits = SetPortStopBits (_serialPort.StopBits);serialPort. Handshake =SetPortHandshake(_serialPort. Ha

28、ndshak©/ Set the read/write timeouts_serialPort. ReadTimeout = 500;_serialPort. WriteTimeout = 500;_serialPort. Oper();.continue = true ;readThread. Start ();Con sole. Write ("Name:");n ame = Con sole. ReadL in e();Console. WriteLine ("Type QUIT to exit11);while (continue )messag

29、e = Con sole. ReadL in e();if (stri ngComparer. Equals ("quit", message)_continue = false ;)else_serialPort. WriteLine (String . Format(nv0>: (D",name, message );) )readThread.Join ();_serialPort .Close ();public static void Read()while ( _continue )trystri ng message =Console. Wri

30、teLine ("Available Ports:");foreach (string s in SerialPort. GetPortNames()Con sole. WriteLi ne (" 0“,s);Console. Write (“COM port(0):H, defaultPortName );portName = Con sole. ReadL in e();if (portName ="")portName = defaultPortName ; return portName;public static int SetPor

31、tBaudRate (intdefaultPortBaudRate ) (string baudRate;Con sole. Write ("Baud Rate(0):H defaultPortBaudRate );baud Rate = Con sole. ReadL in e();if (baudRate ="")baud Rate = defaultPortBaudRate . ToString ();return int. Parse( baudRate);public static Parity SetPortParity (Parity default

32、PortParity )stri ng parity ;Con sole. WriteL ine ("Available Parity options/*);foreach (string s in EnumGetNamestypeof (Parity)Con sole. WriteLi ne (H 0H, s);Con sole. Write (T arity(O):n , defaultPortParity ToString ();parity = Con sole. ReadL in e();if (parity ="") (parity = default

33、PortParity . ToString (); return (Parity ) EnumParse(typeof (Parity ), parity);public static int SetPortDataBits (int defaultPortDataBits )(stri ng dataBits ;Con sole. Write ("Data Bits(0):n defaultPortDataBits );dataBits = Con sole. ReadL in e();if (dataBits ="") (dataBits =defaultPo

34、rtDataBits .ToString ();return int. Parse( dataBits );public static StopBits SetPortStopBits (StopBits defaultPortStopBitsstri ng StopBits ;Con sole. WriteL ine ("Available Stop Bits options:*');foreach (string s inEnumGetNamestypeof (StopBits )Con sole. WriteLi ne (" 0”, s);Con sole.

35、Write ("Stop Bits(0):" defaultPortStopBits .ToString ();StopBits = Con sole. ReadL in e(); ll! if (stopBits)StopBits defaultPortStopBits .ToString ();return (StopBits ) EnumParse(typeof (StopBits ),stopBits);public static Handshake SetPortHandshake (HandshakedefaultPortHandshake )string ha

36、ndshake ;Con sole. WriteL ine ("Available Han dshake options:"); foreach (string s inEnumGetNamestypeof (Handshak©)(Con sole. WriteLi ne (', 0'*, s);)Con sole. Write (“Stop Bits(O):H defaultPortHandshake . ToString ();han dshake = Con sole. ReadL in e();if (handshake ="&q

37、uot;)(handshake = defaultPortHa ndshake .ToString (); return(Handshak© EnumParse(typeof (Handshak©, handshake);SerialPort类的源代码已经放在下面,SerialPort类是由Remon Spekreijse提供的免费串口类。CSerialPort支持线连接的串口编程,而且是基于多线程的,工作流程:1 .设置串口参数。 函数原型:BOOL CSerialPort:lnitPort(CWnd* pPortOwner, / the owner (CWnd) of

38、the port (receives message)UINT portnr, / portnumber (1.4)UINT baud, / baudrate char parity, / parityUINT databits, / databitsUINT stopbits, / stopbitsDWORD dwCommEvents, / EV RXCHAR, EV CTS etcUINT writebuffersize) / size to the writebuffer2 .串口监测线程。BOOL CSerialPort:StartMonitoring()BOOL CSerialPor

39、t:RestartMonitoring()BOOL CSerialPort:StopMonitoring()void CSerialPort:WriteChar(CSerialPort* port)void CSerialPort:ReceiveChar(CSerialPort* port, COMSTAT comstat) void CSerialPort:WriteToPort(char* string)3 .监测线程接收事件信息,再进行消息处理即可。SerialPort类的应用基于对话框的串口程序开发:1 ,将SerialPort类添加进工程;2 .进行消息的映射;(注意:在Serial

40、Port类的头文件中的:#define WM_COMM_RXCHAR WM_USER+7需要手动进行映射)在工程的主对话框头文件中,格式如下:afx_msg LONG OnComm(WPARAM ch,LPARAM port);在工程的主对话框的CPP文件中,格式如下:BEGIN_MESSAGE_MAP(CMy20040889SerialPortTestDlg, CDialog) AFX_MSG_MAP(CMy20040889SerialPortTestDlg)ON_MESSAGE(WM_COMM_RXCHAR,OnComm) AFX_MSG_MAPEND_MESSAGE_MAP()然后在CP

41、P中添加消息处理函数,本例中为 OnComm。例如:LONG CTestDlg:OnComm(WPARAM ch, LPARAM port)(m_strEditReceiveMsg += ch;UpdateData(FALSE);return 0;) m_strEditReceiveMsg为EDIT控件(接收框)的变量。下面的m strEditSendMsg同样处理。3实现串口的初始化,打开/关闭串口按钮的响应函数,最后是发送信息按钮的函数实现void CTestDlg:OnButtonOpen()int nPort=m_ctrlComboComPort.GetCurSel()+1;if(m_

42、SerialPort.lnitPort(this, nPort, 9600;N'J8,1,EV_RXFLAG | EV_RXCHAR,512) m_SerialPort.StartMonitoring();m_bSerialPortOpened=TRUE;)elseAfxMessageBox("没有发现此串口或被占用");m_bSerialPortOpened=FALSE;GetDlgltem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);GetDlgltem(IDC_BUTTON_CLOSE)-&g

43、t;EnableWindow(m_bSerialPortOpened);)void CTestDlg:OnButtonClose()(m_SerialPort.ClosePort();m_bSerialPortOpened=FALSE;GetDlgltem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened);GetDlgltem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);)void CTestDlg:OnButtonSend()if(!m bSerialPortOp

44、ened) return; UpdateData(TRUE); / 读入编辑框中的数据m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/ 发送数据)传感器(c#2.0)serialPort 串口通讯 2007 年 10 月 12 日 星期五 15:44 using System;using System.Collectio ns.Ge neric;using System.Comp onen tModel; using System.Data;using System.Data.SqlClie nt;using System.Drawi n

45、g;using System.Text;using System.Wi ndows.Forms;using System.Configuration;using Syste m.lO;using Syste m.lO .Ports;n amespace Win dowsApplicatio n2public partial class Forml : Form(public Forml ()(In itializeComp onen t();int iCo unt; int nu mbers; byte rlen th; bool bRLe nth; int bRStart; bool bRP

46、aram; byte Rchk; int LParam; byte RParam; bool brcmd; byte RCmd; bool bRchk; bool bfini sh;private void Form 1 _Load(object sender. EventArgs e) / Forml Forml = new Form1(); try (if (this.serialPortl .IsOpe n) else(串口 COM1 设置通信口参数8;/数据位System.IO.Ports.Parity.No ne; /System.IO.Ports.StopBits.O ne; 10

47、24;1024;立rzg+巨1;serialPortl .Close();serialPortl ,PortName= "COM1" / 选择serialPortl .BaudRate= 9600;/serialPortl .DataBits =serialPortl .Parity =校验位无校验serialPortl .StopBits =停止位1位serialPortl .ReadBufferSize =接收缓冲区大小serialPortl .WriteBufferSize =发送缓冲区大小serialPortl .Ope n();serialPortl .ReadE

48、xisti ng();设置In put从接收缓冲读取全serialPortl .ReceivedBytesThreshold =设置引发On Com事件的字节长度 serialPortl .Discardl nBuffer();清除接收缓冲区serialPortl .DiscardOutBuffer();清除发送缓冲区stri ng conn str =System.C on figurati on .C on figurati onMan ager.AppSetti ngsnmyCo nn ectio nSt rin g"SqlC onnection conn = newSqlCo

49、 nn ectio n(co nn str);conn. Ope n(); string sql = "selectn ame as时间,price,card from testOI',;SqlDataAdapter da = new SqlDataAdapter(sql, conn);DataSet ds = new DataSet(); da.Fill(ds, "baomi nH);ultraChartl .DataSource =ds.TablesO.DefaultView;dataGridViewl .DataSource =ds.TablesO. Defa

50、ultView;ultraChartl .Axis.Y Log Base = 1000;ultraChartl .Axis.Y.Ra ngeMax = 30000;ultraChartl .Axis.Y.Ra ngeMin = 0; Applicatio n.E nableVisualStyles(); Applicatio n.DoEve nts();)catch (Exceptio n ex) MessageBox.Show("ddM,ex.Message,Mess ageBoxButt on s.OK,MessageBoxlc on .Error);/ ultraChartl.

51、)/<summary>III取前后存储器两个值对比,应付电脑异常退出III </summary>III <param name=',senderH>XOR 异域校验 v/param>III <param n ame=,'e',x/param>private void serialPort1_DataReceived(object sen der, SerialDataReceivedEve ntArgs e)(try(/Byte dataread = new Byte8;/serialPortl .Read(data

52、read, 0,dataread _L en gth);Hint productline=dataread0; / 接口/iCoun t=dataread5;stri ng conn str =System.C on figurati on .C on figurati onMan ager.AppSetti ngsnmyCo nn ectio nSt rin g"SqlC onnection conn = newSqlCo nn ecti on(conn str);conn. Ope n();/if (datareadO = OxAA)/ IIIIMessageBox.Show(p

53、roductli ne.ToStri ng(), “ddd”,MessageBoxButt on s.OK, MessageBoxIc on .Error);/nu mbers= 0;/nu mbers=Con vert.Tol nt32(dataread4) * 256 A 1 + Con vert.Tol nt32(dataread 5);/nu mbers=Con vert.Tol nt32(dataread4) * Con vert.Tol nt32(System.Math.Pow(256,1) + Co nvert.Tol nt32(dataread 5);/SqlComma nd

54、cmd = newSqlComma nd(,'SP_SCJN_AUTONUMBERn, conn);/cmd.Comma ndType =Comma ndType.StoredProcedure;/cmd.Parameters.Add(nqua ntity1', SqlDbType.l nt);/cmd.Parameters"qua ntityn.Value = nu mbers;/cmd.Parameters.Add("portsH, SqlDbType.l nt);/cmd.Parameters"ports".Value = data

55、read3;/cmd.ExecuteN on Query();/)byte DataRead;int bytData ;int byt num;/byt num = serialPortl.ReadByte;/TODO: Notlmpleme nted stateme nt:ICSharpCode.SharpRefactory.Parser.AST.VB.O nErrorStateme ntif(serialPortl .ReceivedBytesThreshold = serialPortl .ReceivedBytesThreshold)(byt num = serialPortl .By

56、tesToRead;DataRead = new bytebyt nu m;/TODO: Notlmpleme nted statement: ICSharpCode.SharpRefactory.Parser.AST.VB. ReDimStateme ntfor (int k = 0; k <= (byt num -1);k+) bytData= serialPortl .ReadByte();DataReadk =(byte)byt Data;bfinish =RFJ(DataReadk);if (bfi nish)(/System.C onvert.Tolnt32(RCmd)为端口号iCou nt = 0;for (int j =0; j <= 1 ; j+)(iCount += System.Co nvert.Tol nt32(RParamj) * Con vert.Tol nt32(Math.Pow(256, j);SqlComma ndcmd = new SqlComma nd("

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论