版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本例程主要讲解使用 C# ,实现与 232 串口通信。达到采集串口数据,监控, 可视化处理等。一 概述在 Visual Studio 6.0 中编写串口通讯程序,一般都使用Microsoft Communication Control(简称 MSComm )的通讯控件,只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在 Microsoft.Net 技术广泛应用的今天, Visual Studio.Net 没有将此控件加入控 件库,所以人们采用了许多方法在 Visual Studio.Net 来编写串口通讯程序: 第一种方法是通过采用 Visual Studio 6.
2、0 中原来的 MSComm 控件这是最简 单的,最方便的方法,但需要注册;第二种方法是采用微软在 .NET 推出了一个 串口控件,基于 .NET 的 P/Invoke 调用方法实现;第三种方法是自己用 API 写 串口通信,虽然难度高,但可以方便实现自己想要的各种功能。现在微软推出了最新版本的 Visual Studio 2005 开发工具,可以不再采 用第三方控件的方法来设计串口通讯程序。 NET Framework 2.0类库包含了SerialPort 类 , 方便地实现了所需要串口通讯的多种功能, 为了使 MSComm 编 程方法快速转换到以 SerialPort 类为核心的串口通讯的设
3、计方法,本文着重讨 论了 Visual Studio 6.0 的 MSComm 控件和 SerialPort 类设计方法的异同 点。SerialPort 常用属性、方法和事件1命名空间System.IO.Ports 命名空间包含了控制串口重要的 SerialPort 类,该类 提供了同步 I/O 和事件驱动的 I/O 、对管脚和中断状态的访问以及对串行驱动 程序属性的访问,所以在程序代码起始位置需加入 Using System.IO.Ports 。2串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式 ( 波特率、数据位、停止位和校验位 ) ,在 MSComm 中相关的属性是 CommP
4、ort 和 Settings SerialPort 类与 MSComm 有一些区别 :a. 通讯端口号PortName 属性获取或设置通信端口,包括但不限于所有可用的 COM 端口,请注意该属性返回类型为 String ,不是 Mscomm.CommPort 的 short 类型。通常情况下,PortName 正常返回的值为 COM1 、COM2 ,SerialPort 类最大支持的端口数突破了 CommPort 控件中 CommPort 属性不能超过 16 的限止,大大方便了用户串口设备的配置。b. 通讯格式SerialPort 类对分别用 BaudRate 、Parity 、DataBit
5、s 、StopBits 属性设置通讯格式中的波特率、数据位、停止位和校验位,其中 Parity 和 StopBits 分别是枚举类型 Parity 、StopBits ,Parity 类型中枚举了 Odd( 奇) 、 Even( 偶) 、Mark 、None 、Space ,Parity 枚举了 None 、One 、OnePointFive 、 Two 。SerialPort 类提供了七个重载的构造函数,既可以对已经实例化的 SerialPort 对象设置上述相关属性的值,也可以使用指定的端口名称、波特率 和奇偶校验位数据位和停止位直接初始化 SerialPort 类的新实例。3 串口的打开
6、和关闭SerialPort 类没有采用 MSComm.PortOpen=True/False 设置属性值打 开关闭串口,相应的是调用类的 Open() 和 Close() 方法。4. 数据的发送和读取Serial 类调用重载的 Write 和 WriteLine 方法发送数据, 其中 WriteLine 可发送字符串并在字符串末尾加入换行符, 读取串口缓冲区的方法有许多, 其中 除了 ReadExisting 和 ReadTo, 其余的方法都是同步调用,线程被阻塞直到缓 冲区有相应的数据或大于 ReadTimeOut 属性设定的时间值后,引发 ReadExisting 异常。5.DataRec
7、eived 事件该事件类似于 MSComm 控件中的 OnComm 事件,DataReceived 事件 在接收到了 ReceivedBytesThreshold 设置的字符个数或接收到了文件结束 字符并将其放入了输入缓冲区时被触发。其中 ReceivedBytesThreshold 相 当于 MSComm 控件的 Rthreshold 属性,该事件的用法与 MsComm 控件的OnComm 事件在 CommEvent 为 comEvSend 和 comEvEof 时是一致三 SerialPort 的使用对于熟悉 MSComm 控件的程序设计者, SerialPort 类是相当容易上手 的。在
8、进行串口通讯时,一般的流程是设置通讯端口号及波特率、数据位、停止 位和校验位,再打开端口连接,发送数据,接收数据,最后关闭端口连接这样几 个步骤。数据接收的设计方法在这里比较重要,采用轮询的方法比较浪费时间,在 Visual Basic 中的延时方法中一般会调用 API 并用 DOEvents 方法来处理,但 程序不易控制,建议采用 DataReceived 事件触发的方法,合理的设置 ReceivedBytesThreshold 的值,若接收的是定长的数据,则将 ReceivedBytesThreshold 设为接收数据的长度,若接收数据的结尾是固定的 字符或字符串则可采用 ReadTo 的
9、方法或在 DataReceived 事件中判断接收的 字符是否满足条件。SerialPort 类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中 调用,可以使用异步处理或线程间处理调用这些读取数据的方法。由于 DataReceived 事件在辅线程被引发, 当收到完整的一条数据, 返回 主线程处理或在窗体上显示时,请注意跨线程的处理, C# 可采用控件异步委托 的方法 Control.BeginInvoke 及同步委托的方法 Invoke 。四结束语在.NET 平台下熟练使用 SerialPort 类,可以很好地开发出串口通讯类程 序,对于过去使用 MSComm 控件设计了一些通讯程序,也
10、可以将 MSComm控件替换为 SerialPort 类,当然为了避免对以前的项目做大的改动,可以使用 SerialPort 类设计一些与 MSComm 控件具有相同接口的类,在今后工业控制 中,SerialPort 类将广泛地应用于串口通讯程序的设计中, 发挥着与 MSComm 控件一样的作用。C# SerialPort 运行方式SerialPort 中串口数据的读取与写入有较大的不同。由于串口不知道数据何时到达,因此有两种 方法可以实现串口数据的读取。一、线程实时读串口;二、事件触发方式实现。 由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在 SerialPort
11、 类中有 DataReceived 事件,当串口的读缓存有数据到达时则触发 DataReceived 事件,其中 SerialPort.ReceivedBytesThreshold属 性 决 定 了 当 串 口 读 缓 存 中 数 据 多 少 个 时 才 触 发DataReceived 事件,默认为 1。另外, SerialPort.DataReceived 事件运行比较特殊,其运行在辅线程,不能与主线程中的显示 数据控件直接进行数据传输,必须用间接的方式实现。如下:SerialPort spSend; /spSend,spReceive用虚拟串口连接, 它们之间可以相互传输数据。 spSen
12、d发送数据SerialPort spReceive; /spReceive接受数据TextBox txtSend; / 发送区TextBox txtReceive; / 接受区Button btnSend; / 数据发送按钮delegate void HandleInterfaceUpdateDelegate(string text); /委托,此为重点HandleInterfaceUpdateDelegate interfaceUpdateHandle;public void InitClient() /窗体控件已在初始化interfaceUpdateHandle = new HandleI
13、nterfaceUpdateDelegate(UpdateTextBox); /实 例 化委托对象spSend.Open(); /SerialPort 对象在程序结束前必须关闭,在此说明spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceived);spReceive.ReceivedBytesThreshold = 1;spReceive.Open();public void btnSend_Click(object sender,EventArgs e)spSend.WriteLi
14、ne(txtSend.Text);public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e)byte readBuffer = new bytespReceive.ReadBufferSize;spReceive.Read(readBuffer, 0, readBuffer.Length); this.Invoke(interfaceUpdateHandle, new string Encoding.Unicode.GetString(readBuffer);private void
15、 UpdateTextBox(string text)txtReceive.Text = text;点评:这个例子包括了这个控件几乎所有的操作 ,非常有参考价值 .serialPort 是在.net framework2.0中才有的东西 ,感觉这个东西和 MSCOMM 很相似.这里给出的例子是基于 和 CSHAPE 的, 相应的可以在 Cshape 和 c+ 中使用 ,基本上都是一样的 .Imports SystemImports System . IO. PortsImports System . ThreadingPublic Class PortChatShared _continue
16、As BooleanShared _serialPort As SerialPortPublic Shared Sub Main ()Dim name As StringDim message As StringDim sComparer As StringComparer =StringComparer . OrdinalIgnoreCaseDim readThread As Thread = New Thread ( AddressOfRead)' Create a new SerialPort object with default settings ._serialPort =
17、 New SerialPort ()' Allow the user to set the appropriateproperties ._serialPort . PortName =SetPortName( serialPort . PortName)_serialPort . BaudRate =SetPortBaudRate ( _serialPort . BaudRate)_serialPort . Parity =SetPortParity ( _serialPort . Parity )_serialPort . DataBits =SetPortDataBits ( _
18、serialPort . DataBits )_serialPort . StopBits =SetPortStopBits ( _serialPort . StopBits )_serialPort . Handshake =SetPortHandshake ( _serialPort . Handshake)' Set the read / write timeouts_serialPort . ReadTimeout = 500_serialPort . WriteTimeout = 500_serialPort . Open()_continue = TruereadThrea
19、d . Start ()Console. Write ( "Name: " )name = Console . ReadLine()Console. WriteLine ( "Type QUIT to exit" )While ( _continue )message = Console . ReadLine()If sComparer . Equals( "quit" , message) Then_continue = FalseElse_serialPort . WriteLine ( _ String . Format( &q
20、uot;<0>:1" , name, message)End If end whilereadThread . Join () _serialPort . Close () End SubPublic Shared Sub Read() While ( _continue )TryDim message As String = _serialPort . ReadLine()Console. WriteLine ( message) Catch ex As TimeoutException' Do nothingEnd TryEnd WhileEnd SubPub
21、lic Shared Function SetPortName ( ByVal defaultPortName As String ) As StringDim newPortName As StringConsole . WriteLine ( "Available Ports:")Dim s As StringFor Each s In SerialPort . GetPortNames() Console. WriteLine (" 0" , s) Next sConsole. Write ("COM port(0): " ,
22、defaultPortName )newPortName = Console . ReadLine()If newPortName = "" ThennewPortName = defaultPortNameEnd IfReturn newPortNameEnd FunctionPublic Shared Function SetPortBaudRate ( ByVal defaultPortBaudRate As Integer ) As IntegerDim newBaudRate As StringConsole . Write ( "Baud Rate(0
23、): " , defaultPortBaudRate )newBaudRate = Console . ReadLine()If newBaudRate = "" Then newBaudRate = defaultPortBaudRate . ToString ()End IfReturn Integer . Parse( newBaudRate)End FunctionPublic Shared Function SetPortParity ( ByValdefaultPortParityAs Parity ) As Parity Dim newParity
24、As StringConsole . WriteLine ( "Available Parityoptions:" )Dim s As StringFor Eachs In Enum. GetName(sGetType( Parity )Console. WriteLine (" 0" , s)Next sConsole. Write ( "Parity(0):"defaultPortParitydefaultPortParity. ToString ()newparity = Console . ReadLine()If newpa
25、rity = "" Then newparity =. ToString ()End IfReturn CType( Enum. Parse( GetType( Parity ),newParity ), Parity )End FunctionPublic Shared Function SetPortDataBits ( ByVal defaultPortDataBits As Integer ) As IntegerDim newDataBits As StringConsole . Write ( "Data Bits(0): ",default
26、PortDataBits )newDataBits = Console . ReadLine()If newDataBits = "" Then newDataBits = defaultPortDataBits . ToString ()End IfReturn Integer . Parse( newDataBits )End FunctionPublic Shared Function SetPortStopBits ( ByVal defaultPortStopBits As StopBits ) As StopBitsDim newStopBits As Stri
27、ngConsole . WriteLine ( "Available Stop Bits options:" )Dim s As StringFor Each s In Enum. GetNames( GetType( StopBits )Console. WriteLine (" 0" , s)Next sConsole. Write ( "Stop Bits(0):" , defaultPortStopBits . ToString ()newStopBits = Console . ReadLine()If newStopBit
28、s = "" Then newStopBits = defaultPortStopBits . ToString ()End IfReturnCType( Enum. Parse( GetType( StopBits ), newStopBits ), StopBits ) End FunctionPublic Shared Function SetPortHandshake ( ByVal defaultPortHandshake As Handshake) As HandshakeDim newHandshake As StringConsole . WriteLine
29、 ( "Available Handshake options:" )Dim s As StringFor Each s In Enum. GetNames( GetType( Handshake)Console. WriteLine (" 0" , s)Next sConsole. Write ( "Stop Bits(0):",defaultPortHandshake . ToString ()newHandshake = Console . ReadLine()If newHandshake = "" The
30、n newHandshake = defaultPortHandshake . ToString ()End IfReturnCType( Enum. Parse( GetType( Handshake), newHandshake), Handshake) End FunctionEnd Classusing System;using System. IO. Ports ; using System. Threading ;public class PortChat static bool _continue ;static SerialPort _serialPort ;public st
31、atic void Main ()string name; string message;StringComparer stringComparer = StringComparer . OrdinalIgnoreCase ;Thread readThread = new Thread( Read);/ Create a new SerialPort object with default settings._serialPort = new SerialPort ();/ Allow the user to set the appropriate properties._serialPort
32、 . PortName =SetPortName( _serialPort . PortName);_serialPort . BaudRate =SetPortBaudRate ( _serialPort . BaudRate);_serialPort . Parity =SetPortParity ( _serialPort . Parity );_serialPort . DataBits =SetPortDataBits ( _serialPort . DataBits );_serialPort . StopBits =SetPortStopBits ( _serialPort .
33、StopBits );_serialPort . Handshake = SetPortHandshake ( _serialPort . Handshake);/ Set the read/write timeouts_serialPort . ReadTimeout = 500;_serialPort . WriteTimeout = 500;_serialPort . Open();_continue = true ; readThread . Start ();Console. Write ( "Name: " ); name = Console . ReadLin
34、e();Console. WriteLine ( "Type QUIT to exit" );while ( continue )message = Console. ReadLine();if( stringComparer . Equals ( "quit" ,message)_continue = false ;else_serialPort . WriteLine (String . Format( "<0>:1" , name,message) );readThread.Join ();_serialPort .
35、Close ();public staticvoidRead()while (_continue )trystring message =_serialPort .ReadLine();Console. WriteLine ( message); catch ( TimeoutException ) public static string SetPortName ( string defaultPortName )string portName ;Console. WriteLine ( "Available Ports:" ); foreach ( string s i
36、n SerialPort . GetPortNames() Console. WriteLine (" 0" , s);Console. Write ("COM port(0): " , defaultPortName );portName = Console. ReadLine();if ( portName = "" ) portName = defaultPortName ;return portName ;public static int SetPortBaudRate (intdefaultPortBaudRate )st
37、ring baudRate ;Console. Write ( "Baud Rate(0): "defaultPortBaudRate );baudRate = Console. ReadLine();if ( baudRate = "" )baudRate =defaultPortBaudRate . ToString ();return int . Parse( baudRate); public static Parity SetPortParity ( Parity defaultPortParity )string parity ;Consol
38、e. WriteLine ( "Available Parity options:" );foreach ( string s inEnum. GetName(stypeof ( Parity )Console. WriteLine (" 0" , s);Console. Write ( "Parity(0):",defaultPortParityToString ();parity = Console. ReadLine();if ( parity = "" )parity = defaultPortParity
39、 . ToString ();return ( Parity ) Enum. Parse( typeof ( Parity ),parity );publicdefaultPortDataBitsdefaultPortDataBitsdefaultPortDataBitsstatic int SetPortDataBits (int )string dataBits ;Console. Write ( "Data Bits(0): " );dataBits = Console. ReadLine();if ( dataBits = "" )dataBit
40、s =. ToString ();return int . Parse( dataBits );publicstatic StopBits SetPortStopBits( StopBitsdefaultPortStopBitsstring stopBits ;Console. WriteLine ( "Available Stop Bitsoptions:" );foreach ( string s inEnum. GetName(stypeof ( StopBits )Console. WriteLine (" 0" , s);Console. Wr
41、ite ( "Stop Bits(0):"defaultPortStopBits. ToString ();stopBits = Console. ReadLine();if ( stopBits"" )stopBitsdefaultPortStopBits. ToString ();return ( StopBits ) Enum. Parse( typeof ( StopBits ),stopBits );public static Handshake SetPortHandshake ( HandshakedefaultPortHandshake
42、)string handshake ;Console. WriteLine ( "Available Handshake options:" );foreach ( string s inEnum. GetName(stypeof ( Handshake)Console. WriteLine (" 0" , s);Console. Write ( "Stop Bits(0):" defaultPortHandshake . ToString ();handshake = Console. ReadLine();if ( handsha
43、ke = "" ) handshake =defaultPortHandshake. ToString ();return( Handshake) Enum. Parse( typeof ( Handshake), handshake ); SerialPort 类的源代码已经放在下面, SerialPort 类是由 Remon Spekreijse 提供的免费串口类。 CSerialPort 支持线连接的串口编程,而且是基于多线程的,工作流程:1. 设置串口参数。函数原型:BOOL CSerialPort:InitPort(CWnd* pPortOwner, / the
44、owner (CWnd) of the port (receives message)UINT portnr, / portnumber (1.4)UINT baud, / baudratechar parity, / parityUINT databits, / databitsUINT stopbits, / stopbitsDWORD dwCommEvents, / EV_RXCHAR, EV_CTS etcUINT writebuffersize) / size to the writebuffer2. 串口监测线程。BOOL CSerialPort:StartMonitoring()
45、BOOL CSerialPort: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.
46、进行消息的映射;(注意:在 SerialPort 类的头文件中的:#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_MA
47、PEND_MESSAGE_MAP()然后在 CPP 中添加消息处理函数,本例中为 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 c
48、trlComboComPort.GetCurSel()+1;if(m_SerialPort.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512) m_SerialPort.StartMonitoring(); m_bSerialPortOpened=TRUE;elseAfxMessageBox(" 没有发现此串口或被占用 "); m_bSerialPortOpened=FALSE; GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSeria
49、lPortOpened); GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened);void CTestDlg:OnButtonClose()m_SerialPort.ClosePort(); m_bSerialPortOpened=FALSE;GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(!m_bSerialPortOpened); GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(m_bSerialPortOpened); vo
50、id CTestDlg:OnButtonSend()if(!m bSerialPortOpened) return; UpdateData(TRUE); / 读入编辑框中的数据m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/ 发送数据传感器 (c#2.0)serialPort 串口通讯2007年 10月 12日 星期五 15:44 using System;using System.Collections.Generic; using System.ComponentModel; using System.Data;using Syste
51、m.Data.SqlClient;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Configuration;using System.IO;using System.IO.Ports;namespace WindowsApplication2public partial class Form1 : Formpublic Form1()InitializeComponent(); int iCount; int numbers; byte rlenth; bool bRLenth; i
52、nt bRStart; bool bRParam; byte Rchk; int LParam; byte RParam; bool brcmd; byte RCmd; bool bRchk; bool bfinish;private void Form1_Load(object sender, EventArgs e) /Form1 Form1 = new Form1(); tryif (this.serialPort1.IsOpen)else串口 COM1设置通信口参数8; / 数据位System.IO.Ports.Parity.None;/System.IO.Ports.StopBits
53、.One;/1024;1024;部数据serialPort1.Close();serialPort1.PortName = "COM1" / 选择 serialPort1.BaudRate = 9600; / serialPort1.DataBits =serialPort1.Parity =校验位 无校验serialPort1.StopBits =停止位位serialPort1.ReadBufferSize =/ 接收缓冲区大小serialPort1.WriteBufferSize =/ 发送缓冲区大小serialPort1.Open(); serialPort1.Rea
54、dExisting();/ 设置 Input 从接收缓冲读取全1;serialPort1.ReceivedBytesThreshold =/ 设置引发 OnComm事件的字节长度 serialPort1.DiscardInBuffer() ;/ 清除接收缓冲区serialPort1.DiscardOutBuffer() ;/ 清除发送缓冲区string connstr =System.Configuration.ConfigurationManager.AppSettings"myConnectionSt ring"SqlConnection conn = newSqlCo
55、nnection(connstr);conn.Open(); string sql = "selectname asSqlDataAdapter da = new时间,price,card from test01"SqlDataAdapter(sql, conn);DataSet ds = new DataSet(); da.Fill(ds, "baomin");ultraChart1.DataSource = ds.Tables0.DefaultView;dataGridView1.DataSource = ds.Tables0.DefaultView
56、;ultraChart1.Axis.Y.LogBase = 1000; ultraChart1.Axis.Y.RangeMax = 30000; ultraChart1.Axis.Y.RangeMin = 0; Application.EnableVisualStyles(); Application.DoEvents();catch (Exception ex) MessageBox.Show("dd",ex.Message,Mess ageBoxButtons.OK,MessageBoxIcon.Error); /ultraChart1./ <summary>
57、;/ 取前后存储器两个值对比 , 应付电脑异常退出/ </summary>/ <param name="sender">XOR 异域校验 </param>/ <param name="e"></param>private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)try/Byte dataread = new Byte8 ;/serialPort1.Read(dataread, 0,dataread.Length);/int productline=dataread0; / 接口/iCount=dataread5; string connstr = System.Configuration.Co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第6课 工业化国家的社会变化(备课笔记系列讲义)历史统编版九年级下册
- 2025年高职(新能源汽车检测与维修技术)检测技术阶段测试题及答案
- 2025年中职应用马其顿语(日常马语交流)试题及答案
- 2025年大学二年级(管理学)应用管理综合测试题及答案
- 2025年高职高尔夫服务与管理(服务应用)试题及答案
- 2025年大学化工类(化工性能测试)试题及答案
- 2025年大学作物生产与经营管理(作物生产系统)试题及答案
- 2025年中职广播电视编导(广播电视教育心理学)试题及答案
- 2025年高职(生态农业技术)有机农业种植测试题及答案
- 2025年中职幼儿教育学(幼儿教育基础)试题及答案
- 朱子治家格言(朱子家训)课件
- 20S517 排水管道出水口
- vpap iv st说明总体操作界面
- 2023人事年度工作计划七篇
- LY/T 1692-2007转基因森林植物及其产品安全性评价技术规程
- 初中一年级(7年级)上学期生物部分单元知识点
- 长兴中学提前招生试卷
- 2022年基础教育国家级教学成果奖评审工作安排
- 生物统计学(课堂PPT)
- 突发公共卫生事件应急处理
- 肿瘤内科中级分章试题精选
评论
0/150
提交评论