⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sercomm.cs

📁 本代码为用VS2003中开发基于Pocket PC设备串口通信而设计的一个单独的类。 考虑到系统运行稳定
💻 CS
📖 第 1 页 / 共 2 页
字号:
			get
			{
				String retval = "";
				switch (mbytParity)
				{
					case EVENPARITY:
						retval = "E";
						break;
					case MARKPARITY:
						retval = "M";
						break;
					case NOPARITY:
						retval = "N";
						break;
					case ODDPARITY:
						retval = "O";
						break;
					case SPACEPARITY:
						retval = "S";
						break;
				}
				return retval;
			}
			set
			{
				if (value.Length > 1)
					value = value.Substring(0,1);
				switch (value)
				{
					case "E":
						mbytParity = EVENPARITY;
						break;
					case "M":
						mbytParity = MARKPARITY;
						break;
					case "N":
						mbytParity = NOPARITY;
						break;
					case "O":
						mbytParity = ODDPARITY;
						break;
					case "S":
						mbytParity = SPACEPARITY;
						break;
					default:
						throw new Exception("无效的奇偶属性!");
				}
			}
		}
		#endregion       

		#region "PortOpen"
		public bool PortOpen
		{
			get
			{
				if (mintHandle == INVALID_HANDLE_VALUE)
					return false;
				else
					return true;
			}
			set
			{
				if (value)
					mintHandle = Open(mintPort, mintBaudRate, mbytParity, mbytDataBits, mbytStopBits, mintTXBufferSize, mintRXBufferSize, mintTimeout);
				else
					mintHandle = Close(mintHandle);
			}
		}
		#endregion   

		#region "StopBits"
		public int StopBits
		{
			get 
			{
				int retval = 0;
				switch (mbytStopBits)
				{
					case STOPBITS_10:
						retval = 1;
						break;
					case STOPBITS_15:
						retval = 2;
						break;
					case STOPBITS_20:
						retval = 3;
						break;
				}
				return retval;
			}
			set 
			{
				switch (value)
				{
					case 1:
						mbytStopBits = STOPBITS_10;
						break;
					case 2:
						mbytStopBits = STOPBITS_15;
						break;
					case 3:
						mbytStopBits = STOPBITS_20;
						break;
					
					default:
						throw new Exception("无效的停止位!");
				}
			}
		}
		#endregion        
		#region "Timeout"
		public int Timeout
		{
			get
			{
				return mintTimeout;
			}
			set
			{
				mintTimeout = value;
			}
		}
		#endregion     

		#endregion

		#region "public instance methods"

		#region "Input"

		public String Input()
		{
			return Input(0);
		}

		public string Input(int BytesToRead)
		{
			string result = "";
			int intResult;
			ASCIIEncoding objEncoder = new ASCIIEncoding();
			int lpNumberOfBytesRead = 0;
			OVERLAPPED lpOverlapped;

			if (BytesToRead == 0)
				BytesToRead = mintRXBufferSize;
			if (mintHandle != INVALID_HANDLE_VALUE)
			{
				mbytRxBuffer = new byte[BytesToRead];
				lpOverlapped = new OVERLAPPED();
				intResult = ReadFile(mintHandle, mbytRxBuffer, BytesToRead, ref lpNumberOfBytesRead, ref lpOverlapped);
				if (intResult == 0)
				{
					mintHandle = INVALID_HANDLE_VALUE;
					throw new Exception("读COM:" + mintPort.ToString() +"时发生错误!");
				}
				else
				{
					result = objEncoder.GetString(mbytRxBuffer, 0, BytesToRead);
				}
			}

			return result;
		}
		#endregion         

		#region "Constructors"

		public Comm()
		{
		}

		public Comm(int port, int baudrate, String parity, int databits, int stopbits)
		{
			mintPort = port;
			mintBaudRate = baudrate;
			switch (parity)
			{
				case "E":
					mbytParity = EVENPARITY;
					break;
				case "M":
					mbytParity = MARKPARITY;
					break;
				case "O":
					mbytParity = ODDPARITY;
					break;
				case "S":
					mbytParity = SPACEPARITY;
					break;
				default:
					mbytParity = NOPARITY;
					break;
			}

			switch (databits)
			{
				case 7:
					mbytDataBits = DATABITS_7;
					break;
				default:
					mbytDataBits = DATABITS_8;
					break;
			}

			switch (stopbits)
			{
				case 2:
					mbytStopBits = STOPBITS_15;
					break;
				default:
					mbytStopBits = STOPBITS_10;
					break;
			}
		}
		#endregion      

		#region "Output"
		public void Output(String Value)
		{
			int intResult;
			int lpNumberOfBytesWritten = 0;
			OVERLAPPED lpOverlapped = new OVERLAPPED();
			ASCIIEncoding objEncoder = new ASCIIEncoding();

			if (mintHandle != INVALID_HANDLE_VALUE)
			{
				mbytTxBuffer = new byte[Value.Length];
				mbytTxBuffer = objEncoder.GetBytes(Value);
				intResult = WriteFile(mintHandle, mbytTxBuffer, mbytTxBuffer.Length, ref lpNumberOfBytesWritten, ref lpOverlapped);
			}
		}
		#endregion 

		#endregion

		#region "private instance methods"

		#region "Open"
		private int Open(int port, int baudrate, byte parity, byte databits, byte stopbits, int txbuffersize, int rxbuffersize,int timeout )
		{
			int intResult;
			int intHandle = INVALID_HANDLE_VALUE;
			COMMTIMEOUTS lpCommTimeouts;
			DCB lpDCB;

			if (port > 0)
			{
				if (intHandle == INVALID_HANDLE_VALUE)
				{
					Close(intHandle);
				}
				else
				{
					return INVALID_HANDLE_VALUE;
				}

				intHandle = CreateFile("COM" + port.ToString() + ":", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

				if (intHandle != INVALID_HANDLE_VALUE)
				{
					//清除端口 rx 和tx 缓冲器
					intResult = PurgeComm(intHandle, PURGE_RXCLEAR | PURGE_TXCLEAR);

					//获得已存在端口的定义
					intResult = GetCommState(intHandle, out lpDCB);
					//设置必要的端口定义
					lpDCB.fBinary = 1;               //二进制模式,没有文件结束的检校
					lpDCB.fParity = 1;               // 启动奇偶检校
					lpDCB.fOutxCtsFlow = 0;          // 没有 CTS 输出流控制 
					lpDCB.fOutxDsrFlow = 0;          // 没有 DSR 输出流控制
					lpDCB.fDtrControl = 1;           // DTR 流控制类型
					lpDCB.fDsrSensitivity = 0;       // DSR 感应
					lpDCB.fTXContinueOnXoff = 1; 
					lpDCB.fOutX = 0;                 // 没有 XON/XOFF 输出流控制
					lpDCB.fInX = 0;                  // 没有 XON/XOFF 输入流控制
					lpDCB.fErrorChar = 0;            // 关闭错误替换 
					lpDCB.fNull = 0;                 // 关闭 null 拆卸
					lpDCB.fRtsControl = 1;           //  RTS 流控制 
					lpDCB.fAbortOnError = 0;         // 不中止读写异常错误
					lpDCB.StopBits = stopbits;       // 0, 1, 2 = 1, 1.5, 2
					lpDCB.ByteSize = databits;     
					lpDCB.Parity = parity;           // 0-4 = no, odd, even, mark, space 
					lpDCB.BaudRate = baudrate;    

					
					lpDCB.XonChar = '1';

					intResult = SetCommState(intHandle, ref lpDCB);

					//设置端口缓冲区大小(单位为字节)
					intResult = SetupComm(intHandle, rxbuffersize, txbuffersize);

					//设置端口超时值(单位为毫秒)
					lpCommTimeouts.ReadIntervalTimeout = 0;
					lpCommTimeouts.ReadTotalTimeoutMultiplier = 0;
					lpCommTimeouts.ReadTotalTimeoutconstant = timeout;
					lpCommTimeouts.WriteTotalTimeoutMultiplier = 10;
					lpCommTimeouts.WriteTotalTimeoutconstant = 100;

					//intResult = SetCommTimeouts(intHandle, lpCommTimeouts);
				}
				else   
				{
					intHandle = INVALID_HANDLE_VALUE;
				}
			}
			else    
			{
				intHandle = INVALID_HANDLE_VALUE;
			}

            return intHandle;
		}
		#endregion             

		#region "Close"
		private int Close(int handle)
		{
			int intResult;
			if (handle != INVALID_HANDLE_VALUE)
			{
				intResult = CloseHandle(handle);
				if (intResult < 0)
				{
					throw new Exception("不能关闭端口!");
				}
			}

			return INVALID_HANDLE_VALUE;
		}
		#endregion         

		#endregion

	}																																																																																																																																																																																																																																																																																																																																																		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -