您的位置:首页 > 其它

CSerialPort不能连续发送的问题

2013-08-30 18:44 288 查看
1.注释掉发送部份的清空缓冲区语句就行

void CSerialPort::WriteChar(CSerialPort* port)

{

BOOL bWrite = TRUE;

BOOL bResult = TRUE;

DWORD BytesSent = 0;

ResetEvent(port->m_hWriteEvent);

EnterCriticalSection(&port->m_csCommunicationSync);

// Gain ownership of the critical section

if (bWrite)

{

// Initailize variables

port->m_ov.Offset = 0;

port->m_ov.OffsetHigh = 0;

// Clear buffer, 这里注释就好了.

// PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

2.如果想在接受收内容后,连续发送

SendMessage 改为PostMessage就好,

void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)

{

BOOL bRead = TRUE;

BOOL bResult = TRUE;

DWORD dwError = 0;

DWORD BytesRead = 0;

unsigned char RXBuff;

for (;;)

{

//防死锁

if(WaitForSingleObject(port->m_hShutdownEvent, 0) == WAIT_OBJECT_0)

return;

// Gain ownership of the comm port critical section.

// This process guarantees no other part of this program

// is using the port object.

EnterCriticalSection(&port->m_csCommunicationSync);

// ClearCommError() will update the COMSTAT structure and

// clear any other errors.

bResult = ClearCommError(port->m_hComm, &dwError, &comstat);

LeaveCriticalSection(&port->m_csCommunicationSync);

// start forever loop. I use this type of loop because I

// do not know at runtime how many loops this will have to

// run. My solution is to start a forever loop and to

// break out of it when I have processed all of the

// data available. Be careful with this approach and

// be sure your loop will exit.

// My reasons for this are not as clear in this sample

// as it is in my production code, but I have found this

// solutiion to be the most efficient way to do this.

if (comstat.cbInQue == 0)

{

// break out when all bytes have been read

break;

}

EnterCriticalSection(&port->m_csCommunicationSync);

if (bRead)

{

bResult = ReadFile(port->m_hComm,
// Handle to COMM port

&RXBuff,
// RX Buffer Pointer

1, // Read one byte

&BytesRead,
// Stores number of bytes read

&port->m_ov);
// pointer to the m_ov structure

// deal with the error code

if (!bResult)

{

switch (dwError = GetLastError())

{

case ERROR_IO_PENDING:

{

// asynchronous i/o is still in progress

// Proceed on to GetOverlappedResults();

bRead = FALSE;

break;

}

default:

{

// Another error has occured. Process this error.

port->ProcessErrorMessage("ReadFile()");

break;

}

}

}

else

{

// ReadFile() returned complete. It is not necessary to call GetOverlappedResults()

bRead = TRUE;

}

} // close if (bRead)

if (!bRead)

{

bRead = TRUE;

bResult = GetOverlappedResult(port->m_hComm,
// Handle to COMM port

&port->m_ov,
// Overlapped structure

&BytesRead,
// Stores number of bytes read

TRUE); // Wait flag

// deal with the error code

if (!bResult)

{

port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");

}

} // close if (!bRead)

LeaveCriticalSection(&port->m_csCommunicationSync);

// notify parent that a byte was received,改为PostMessage就好

//::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);

::PostMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);

} // end forever loop

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: