高手来!!!c#串口打开/关闭问题
sense 2005-09-20 12:10:45 不知道为什么我每次开关几次串口后就再也无法打开了,用GetLastError()查一下都是等于55。
查了一下错误列表是:The specified network resource or device is no longer available.
注:我的程序在PPC下没任何问题,在WINCE 5.0下就一直有这个问题。
还有我用EVC也做了一个版本,没有任何问题的。
public bool OpenPort(string lpFileName,int baudRate,byte parity, byte byteSize, byte stopBits)
{
// OPEN THE COMM PORT.
hComm = CreateFile(lpFileName ,GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
// IF THE PORT CANNOT BE OPENED, BAIL OUT.
if(hComm == INVALID_HANDLE_VALUE)
{
return false;
}
//SetupComm(hComm, MAXBLOCK, MAXBLOCK);
// SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
// THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST.
// IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER
// THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING.
// ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING.
DCB dcbCommPort = new DCB();
dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort);
GetCommState(hComm, ref dcbCommPort);
dcbCommPort.BaudRate = baudRate;
dcbCommPort.Parity = parity;
dcbCommPort.ByteSize = byteSize;
dcbCommPort.StopBits = stopBits;
dcbCommPort.fOutX=dcbCommPort.fInX=dcbCommPort.fTXContinueOnXoff=0;
SetCommMask(hComm,EV_RXCHAR);
PurgeComm(hComm, PURGE_RXCLEAR | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_TXABORT);
if(!SetCommState(hComm, ref dcbCommPort))
{
CloseHandle(hComm);
hComm=INVALID_HANDLE_VALUE;
return false;
}
// SET THE COMM TIMEOUTS.
COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
GetCommTimeouts(hComm,ref ctoCommPort);
ctoCommPort.ReadIntervalTimeout = Int32.MaxValue;
ctoCommPort.ReadTotalTimeoutConstant = 10;
ctoCommPort.ReadTotalTimeoutMultiplier = 10;
ctoCommPort.WriteTotalTimeoutMultiplier = 50;
ctoCommPort.WriteTotalTimeoutConstant = 100;
if(!SetCommTimeouts(hComm,ref ctoCommPort))
{
CloseHandle(hComm);
hComm=INVALID_HANDLE_VALUE;
return false;
}
bOpened = true;
return true;
}
public bool ClosePort()
{
if (hComm == INVALID_HANDLE_VALUE)
{
return false;
}
if (CloseHandle(hComm))
{
hComm = INVALID_HANDLE_VALUE;
bOpened = false;
return true;
}
else
{
return false;
}
}