📄 form1.designer.cs
字号:
/*用VS2005建立Goex.SerialCom项目Windows应用程序,
* 注释掉Program.cs中Main入口点
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
namespace PCSerialCom
{
/// <summary>
/// 串行通信PC端
/// </summary>
public class PCSerialCom
{
public PCSerialCom()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public int PortNum; //串口1, 2, 3, 4
public int BaudRate; //波特率1200, 2400, 4800, 9600
public byte ByteSize; //数据位8 bits
public byte Parity; // 奇偶校验0~4 = no(无校验), odd(奇校验), even(偶校验), mark(校验位总为0), space(校验位总为1)
public byte StopBits; // 停止位0, 1, 2 = 1, 1.5, 2 (“1”电平宽度所保持单位时间长,该单位时间为波特率倒数)
public int ReadTimeout; //当读操作没有完成时的停止时间,单位毫秒,10
//以下定义了Win32中串口操作涉及的基本变量
// Win32中的串口文件句柄,被用来存取的串口对象句柄
private int hComm = -1;
//串口是否已经打开,设置Opened属性为false,默认串口关闭。
public bool Opened = false;
//win32 API常量
//访问模式读写属性标志
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;
//定义以下各结构
//定义指定串口设备的当前配置填充设备控制块(DCB)结构信息
[StructLayout(LayoutKind.Sequential)] //指定属性,声明程序中所用到的API函数,已将声明信息与C#代码相关联,即可在运行时使用反射查询属性。
private struct DCB
{
//taken from c struct in platform sdk
public int DCBlength; // DCB结构长度,单位字节
public int BaudRate; // 当前波特率
public int fBinary; // 二进制模式, 无EOF校验,Win下恒为真
public int fParity; // 打开奇偶校验检查,为真
public int fOutxCtsFlow; // 输出控制流监视Clear-To-Send信号,为真。
public int fOutxDsrFlow; // 输出控制流监视Data-Set-Ready信号,为真。
public int fDtrControl; // Data-Terminal-Ready流控制类型
public int fDsrSensitivity; // 串行通信设备对DSR信号敏感
public int fTXContinueOnXoff; // 输入缓冲器满XoffLim字节后仍继续传输,为真
public int fOutX; // 在发送中用于指示XON/XOFF 控制流,当收到XoffChar个字符后停止发送,且当收到XonChar个字符后开始传输,为真。
public int fInX; //在接收中用于指示XON/XOFF 控制流。
public int fErrorChar; // 允许该字符替代带有奇偶校验误差的字符,为真。
public int fNull; //不丢弃任何所接收的字节数,为真。
public int fRtsControl; // Request-To-Send流控制类型
public int fAbortOnError; // 有错误发生时
public int fDummy2; // 暂未使用的保留位
public ushort wReserved; //暂未使用的保留位,恒为0
public ushort XonLim; // 指定在XON字符发送之前接收缓冲区中可允许的最小字节数
public ushort XoffLim; //指定在XOFF字符发送之前接收缓冲区中可允许的最小字节数
public byte ByteSize; // 所收发字节的位数, 4-8
public byte Parity; // 奇偶校验0-4=无,奇,偶,校验位总为0, 校验位总为1
public byte StopBits; // 停止位0,1,2 = 1, 1.5, 2
public char XonChar; //指定用于发送和接收字符XON的值
public char XoffChar; //指定用于发送和接收字符XOFF值
public char ErrorChar; //本字符用来代替接收到的奇偶校验发生错误时的值
public char EofChar; //当没有使用二进制模式时,本字符可用来指示数据的结束
public char EvtChar; //当接收到此字符时,会产生一个事件
public ushort wReserved1; // 保留,未使用
}
///<summary>
///串口超时时间结构体类型
///</summary>
[StructLayout(LayoutKind.Sequential)]
private struct COMMTIMEOUTS
{
public int ReadIntervalTimeout;
public int ReadTotalTimeoutMultiplier;
public int ReadTotalTimeoutConstant;
public int WriteTotalTimeoutMultiplier;
public int WriteTotalTimeoutConstant;
}
///<summary>
///溢出缓冲区结构体类型
///</summary>
[StructLayout(LayoutKind.Sequential)]
private struct OVERLAPPED
{
public int Internal;
public int InternalHigh;
public int Offset;
public int OffsetHigh;
public int hEvent;
}
///<summary>
///打开串口
///</summary>
///<param name="lpFileName">要打开的串口名称</param>
///<param name="dwDesiredAccess">指定串口的访问方式,一般设置为可读可写方式</param>
///<param name="dwShareMode">指定串口的共享模式,串口不能共享,所以设置为0</param>
///<param name="lpSecurityAttributes">设置串口的安全属性,WIN9X下不支持,应设为NULL</param>
///<param name="dwCreationDisposition">对于串口通信,创建方式只能为OPEN_EXISTING</param>
///<param name="dwFlagsAndAttributes">指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信</param>
///<param name="hTemplateFile">对于串口通信必须设置为NULL</param>
[DllImport("kernel32.dll")]
private static extern int CreateFile(
string lpFileName, // file name
uint dwDesiredAccess, // access mode
int dwShareMode, // share mode
int lpSecurityAttributes, // SD
int dwCreationDisposition, // how to create
int dwFlagsAndAttributes, // file attributes
int hTemplateFile // handle to template file
);
///<summary>
///得到串口状态
///</summary>
///<param name="hFile">通信设备句柄</param>
///<param name="lpDCB">设备控制块DCB</param>
[DllImport("kernel32.dll")]
private static extern bool GetCommState(
int hFile, // handle to communications device
ref DCB lpDCB // device-control block
);
///<summary>
///建立串口设备控制块(嵌入版没有)
///</summary>
///<param name="lpDef">设备控制字符串</param>
///<param name="lpDCB">设备控制块</param>
[DllImport("kernel32.dll")]
private static extern bool BuildCommDCB(
string lpDef, // device-control string
ref DCB lpDCB // device-control block
);
///<summary>
///设置串口状态
///</summary>
///<param name="hFile">通信设备句柄</param>
///<param name="lpDCB">设备控制块</param>
[DllImport("kernel32.dll")]
private static extern bool SetCommState(
int hFile, // handle to communications device
ref DCB lpDCB // device-control block
);
///<summary>
///读取串口超时时间
///</summary>
///<param name="hFile">通信设备句柄</param>
///<param name="lpCommTimeouts">超时时间</param>
[DllImport("kernel32.dll")]
private static extern bool GetCommTimeouts(
int hFile, // handle to comm device
ref COMMTIMEOUTS lpCommTimeouts // time-out values
);
///<summary>
///设置串口超时时间
///</summary>
///<param name="hFile">通信设备句柄</param>
///<param name="lpCommTimeouts">超时时间</param>
[DllImport("kernel32.dll")]
private static extern bool SetCommTimeouts(
int hFile, // handle to comm device
ref COMMTIMEOUTS lpCommTimeouts // time-out values
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -