### Serial C# 驱动类详解 #### 使用 `using System.Runtime.InteropServices` 与 `DllImport` 在本篇文章中,我们将探讨如何使用C#语言通过P/Invoke(Platform Invoke)技术来实现对串口(通常指的是RS232串行通信接口)的操作。此方法涉及到的关键技术包括使用 `System.Runtime.InteropServices` 命名空间中的 `DllImport` 属性来调用底层Windows API。 #### 概述 在C#中,`DllImport` 是一个属性,用于指定需要调用的外部库(通常是Windows DLL)。这种方式允许开发人员直接调用非托管代码(如C/C++编写的DLL)中的函数,从而实现与操作系统或硬件更紧密的交互。例如,在本文档中提到的 `DllImport("kernel32.dll")` 和 `DllImport("coredll")` 就是用来调用Windows内核API和嵌入式系统的API。 #### 基础概念 1. **KERNEL32.DLL**: 这是Windows操作系统的一个核心DLL,提供了大量的系统服务,包括文件管理、进程和线程管理以及输入/输出操作等。 2. **COREDLL**: 这个DLL是针对某些特定平台(如Windows CE)的核心库,提供了一系列基础服务。 #### 关键代码片段解析 在给定的代码片段中,定义了一个名为 `clsCom` 的类,该类包含了对串口进行读写操作所需的多个常量和结构体。这些元素对于理解串口操作至关重要。 - **常量**:定义了多个用于控制串口操作的常量,比如 `GENERIC_READ` 和 `GENERIC_WRITE` 分别表示读取权限和写入权限;`OPEN_EXISTING` 表示打开已存在的设备;`INVALID_HANDLE_VALUE` 定义了一个无效句柄的值。 - **结构体 DCB (Device Control Block)**:这是Windows用于设置串口参数的数据结构。其中包含了很多成员变量,例如: - `BaudRate`:波特率,即每秒传输的位数。 - `ByteSize`:每个数据字符的位数,范围为4到8位。 - `Parity`:校验位,可以是无校验、奇校验、偶校验等。 - `StopBits`:停止位,可以是1位、1.5位或2位。 #### 串口通信基础知识 为了更好地理解这段代码的作用,我们需要了解一些关于串口通信的基础知识: 1. **波特率**:决定了数据传输的速度。 2. **数据位**:每个数据帧中有效数据的位数。 3. **校验位**:用于检测传输错误的一种机制。 4. **停止位**:每个数据帧结束时的位数,用于帧同步。 #### 实际应用 在实际的应用场景中,使用 `DllImport` 调用 Windows API 可以实现对串口的高效控制。例如,可以利用这些API来配置串口的通信参数(如波特率、数据位、校验位等),并进行数据的读写操作。 - **配置串口**:通过调用 `CreateFile` 函数打开串口,并使用 `GetCommState` 和 `SetCommState` 函数来获取和设置串口的配置信息。 - **数据读写**:通过 `ReadFile` 和 `WriteFile` 函数来完成数据的读写。 #### 总结 通过对上述内容的学习,我们可以看到通过使用 `DllImport` 属性结合 Windows API,可以非常灵活地实现对串口的高级控制。这对于开发需要与硬件直接交互的应用程序来说是非常有用的技巧。同时,了解这些基础知识也有助于开发者更好地掌握C#与底层硬件的交互方式。
using System.Runtime.InteropServices;
using System.IO;
using System.Reflection;
namespace testComApp
{
/// <summary>
/// SeriaCls 的摘要说明。
/// </summary>
public class clsCom
{
#region 申明要引用的和串口调用有关的API
//win32 api constants
private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int OPEN_EXISTING = 3;
private const int INVALID_HANDLE_VALUE = -1;
private const int MAXBLOCK = 4096;
private const uint PURGE_TXABORT = 0x0001; // Kill the pending/current writes to the comm port.
private const uint PURGE_RXABORT = 0x0002; // Kill the pending/current reads to the comm port.
private const uint PURGE_TXCLEAR = 0x0004; // Kill the transmit queue if there.
private const uint PURGE_RXCLEAR = 0x0008; // Kill the typeahead buffer if there.
[StructLayout(LayoutKind.Sequential)]
private struct DCB
{
//taken from c struct in platform sdk
public int DCBlength; // sizeof(DCB)
public int BaudRate; // current baud rate
public int fBinary; // binary mode, no EOF check
public int fParity; // enable parity checking
public int fOutxDsrFlow; // DSR output flow control
public int fDtrControl; // DTR flow control type
public int fDsrSensitivity; // DSR sensitivity
public int fTXContinueOnXoff; // XOFF continues Tx
public int fOutX; // XON/XOFF out flow control
public int fInX; // XON/XOFF in flow control
public int fErrorChar; // enable error replacement
public int fNull; // enable null stripping
public int fRtsControl; // RTS flow control
public int fAbortOnError; // abort on error
public int fDummy2; // reserved
public ushort wReserved; // not currently used
public ushort XonLim; // transmit XON threshold
public ushort XoffLim; // transmit XOFF threshold
public byte ByteSize; // number of bits/byte, 4-8
public byte Parity; // 0-4=no,odd,even,mark,space
public byte StopBits; // 0,1,2 = 1, 1.5, 2
public char XonChar; // Tx and Rx XON character
public char XoffChar; // Tx and Rx XOFF character
public char ErrorChar; // error replacement character
public char EofChar; // end of input character
public char EvtChar; // received event character
public ushort wReserved1; // reserved; do not use
}
[StructLayout(LayoutKind.Sequential)]
private struct COMMTIMEOUTS
{
public int ReadIntervalTimeout;
public int ReadTotalTimeoutMultiplier;
剩余14页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- springboot203医疗挂号管理系统.zip
- springboot206基于SpringBoot的农商对接系统的设计与实现.zip
- springboot208基于springboot物流管理系统.zip
- springboot207基于springboot的实习管理系统.zip
- springboot209基于web的大学生一体化服务平台的设计与实现.zip
- springboot211基于springboot医疗报销系统的设计与实现.zip
- springboot210基于Springboot开发的精简博客系统的设计与实现.zip
- 网络安全 - 渗透测试工具 - SecureGen - 参数字典生成(Web应用程序+漏洞扫描+自动化+安全评估)
- springboot213大学生心理健康管理系统的设计与实现.zip
- springboot212球队训练信息管理系统.zip
- springboot214基于springboot的多媒体素材库的开发与应用.zip
- springboot217志同道合交友网站.zip
- springboot216新闻资讯系统.zip
- springboot215基于springboot技术的美食烹饪互动平台的设计与实现.zip
- springboot218基于SpringBoot的医院药品管理系统设计与实现.zip
- springboot220基于SpringBoot+Vue的周边游平台个人管理模块的设计与实现.zip