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

📄 rs485读写源程序 vc++代码 .cpp

📁 === === === ===== RS485读写源程序 VC++代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
													pRoadSvrDlg->e_pImage[1 + i * 2] = 0;
											}
											pSerial->m_pEye->nImageOdd = len - 1; //nLength;
											SetEvent(pSerial->m_pEye->m_hImageReceivedOdd);
										}
										break;
									default:
										bError = true;
									}
								}
							}
							pSerial->m_pEye->QueryReceiveImage();
							break;
						case 0x21:
						case 0x22:
							nLength = pSerial->Read(pSerial->pReceive + 5, len);
							pSerial->nReceive += nLength;
						case 0x23:
							pRoadSvrDlg->OnReceiveMeMatch(pSerial->pReceive, pSerial->nReceive);
							pRoadSvrDlg->m_dwMatchStatus |= MAT_BYIMAGE; //仅图像匹配有该报文,车牌号码匹配不在该报文的管辖范围之内(新的修改,2001年11月15日)
							break;
						case 0xF1:
							nLength = pSerial->Read(pSerial->pReceive + 5, 5);
							pSerial->nReceive += nLength;
							if (nLength == 5)
							{
								DWORD dwImageSize = *((DWORD*)(pSerial->pReceive+6));

								switch(pSerial->pReceive[5])
								{
								case 0x00:
								case 0x01:
									{
										nLength = pSerial->ReadByBlock(pSerial->m_pEye->pImage, dwImageSize, dwBlockSize);
										if (nLength < dwImageSize)
											memset(pSerial->m_pEye->pImage + nLength, 0xFF, dwImageSize - nLength);

										pSerial->m_pEye->nImageEven = dwImageSize;
										pSerial->m_pEye->nImageOdd = 0;
										pSerial->m_pEye->nImage = dwImageSize;
										ResetEvent(pSerial->m_pEye->m_hImageReceivedEven);
										ResetEvent(pSerial->m_pEye->m_hImageReceivedOdd);
										pRoadSvrDlg->OnReceiveDebugImage(pSerial->m_pEye->pImage, pSerial->m_pEye->nImage, len);
									}
									break;
								case 0x02://模拟收费计算机接收第一个车牌图片报文
									{
										nLength = pSerial->ReadByBlock(pSerial->pReceive + 10, dwImageSize, dwBlockSize);
										for (DWORD i = 0 ; i < dwImageSize ; i ++)
										{
											if (i < nLength)
												pSerial->m_pEye->pImage[i * 2] = pSerial->pReceive[10 + i];
											else
												pSerial->m_pEye->pImage[i * 2] = 0xFF;
										}
										pSerial->m_pEye->nImageEven = dwImageSize;
										SetEvent(pSerial->m_pEye->m_hImageReceivedEven);
									}
									break;
								case 0x12:
									{
										nLength = pSerial->ReadByBlock(pSerial->pReceive + 10, dwImageSize, dwBlockSize);
										for (DWORD i = 0 ; i < dwImageSize ; i ++)
										{
											if (i < nLength)
												pSerial->m_pEye->pImage[1 + i * 2] = pSerial->pReceive[10 + i];
											else
												pSerial->m_pEye->pImage[1 + i * 2] = 0xFF;
										}
										pSerial->m_pEye->nImageOdd = dwImageSize;
										SetEvent(pSerial->m_pEye->m_hImageReceivedOdd);
									}
									break;
								default:
									bError = true;
								}
							}
							else
								bError = true;

							pSerial->m_blIdle = true; //正常来说,过了这个报文就没有报文了,而下一个触发是很难预料什么时候的

							pSerial->m_pEye->QueryReceiveDebugImage(len);
							break;
						case 0x31:
#ifdef LPR_DOHERELARGE
							if (pRoadSvrDlg->m_nTriggerMethod == 1)
							{
								if (pRoadSvrDlg->m_pCaptureDlg != NULL)
								{
#ifdef CAP_DAHENG
									((CDHCaptureDlg*)(pRoadSvrDlg->m_pCaptureDlg))->Capture("", true);
#endif
								}
							}
							//else
							//if (pRoadSvrDlg->m_pCaptureDlg != NULL)
							// pRoadSvrDlg->m_pCaptureDlg->PostMessage(WM_NOTIFYCAPTURENOW, 0, 0);
#endif
							break;
						default:
							nLength = pSerial->Read(pSerial->pReceive + 5, len);
							pSerial->nReceive += nLength;
							if (nLength != len)
								bError = true;
						}
					}
				}

				if (pRoadSvrDlg->m_pDebugDlg != NULL)
					pRoadSvrDlg->m_pDebugDlg->Message(pSerial->pReceive, pSerial->nReceive, "[->] ");

				if (bError)
				{
					ClearCommError(pSerial->m_hCom, &dwErrorFlags, &ComStat);
					while(ComStat.cbInQue)
					{
						PurgeComm(pSerial->m_hCom, PURGE_RXABORT | PURGE_RXCLEAR);
						CHssApp::Idle(1);
						ClearCommError(pSerial->m_hCom, &dwErrorFlags, &ComStat);
					}
				}
			}
		}
#if 0
		if ((dwEvtMask & EV_CTS) == EV_CTS)
		{
#ifdef LPR_DOHERELARGE
			if (pRoadSvrDlg->m_nTriggerMethod == 0)
			{
				DWORD dwModemStat;
				GetCommModemStatus(pSerial->m_hCom, &dwModemStat);
				if (dwModemStat & MS_CTS_ON)
				{
					if (!blTriggered)
					{
						blTriggered = true;
						if (pRoadSvrDlg->m_pCaptureDlg != NULL)
						{
#ifdef CAP_DAHENG
							((CDHCaptureDlg*)(pRoadSvrDlg->m_pCaptureDlg))->Capture("", true);
#endif
						}
					}
				}
				else
				{
					blTriggered = false;
				}
			}
#endif
		}
#endif
	}
	pSerial->m_dwThreadID = 0;
	pSerial->m_hCommWatchThread = NULL;

	return TRUE;
}

BOOL CSerialPort::GetCommTimeouts(LPCOMMTIMEOUTS lpCommTimeouts)
{
	if (m_hCom == INVALID_HANDLE_VALUE)
		return false;
	return ::GetCommTimeouts(m_hCom, lpCommTimeouts);
}

BOOL CSerialPort::SetCommTimeouts(LPCOMMTIMEOUTS lpCommTimeouts)
{
	if (m_hCom == INVALID_HANDLE_VALUE)
		return false;
	return ::SetCommTimeouts(m_hCom, lpCommTimeouts);
}

BOOL CSerialPort::Disconnect()
{
	if (m_hCom == INVALID_HANDLE_VALUE)
		return true;

	if (!m_fConnected)
		return true;

	m_fConnected = false;

	//SetCommMask(m_hCom, 0);

	int count = 0;
	while(m_dwThreadID != 0 && count < 100)
	{
		Sleep(10);
		count ++;
	}

	EscapeCommFunction(m_hCom, CLRDTR) ;

	PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
	CloseHandle(m_hCom) ;

	m_hCom = INVALID_HANDLE_VALUE;

	return true;
}

BOOL CSerialPort::Write(LPBYTE pData, DWORD dwLength)
{
	if (m_hCom == INVALID_HANDLE_VALUE)
		return false;

	DWORD dwBytesSent = 0;
	DWORD dwBytesWritten ;
	DWORD dwErrorFlags;
	DWORD dwError;
	COMSTAT ComStat;

	BOOL fWriteStat = ::WriteFile(m_hCom, pData, dwLength, &dwBytesWritten, &m_osWrite);
	if (!fWriteStat)
	{
		if(GetLastError() == ERROR_IO_PENDING)
		{
			while(!GetOverlappedResult(m_hCom, &m_osWrite, &dwBytesWritten, false))
			{
				dwError = GetLastError();
				if(dwError == ERROR_IO_INCOMPLETE)
				{
					dwBytesSent += dwBytesWritten;
					continue;
				}
				else
				{
					ClearCommError(m_hCom, &dwErrorFlags, &ComStat ) ;
					break;
				}
			}
			dwBytesSent += dwBytesWritten;
			if( dwBytesSent != dwLength )
				return false;
		}
		else
		{
			ClearCommError( m_hCom, &dwErrorFlags, &ComStat ) ;
			if (pRoadSvrDlg->m_pDebugDlg != NULL)
				pRoadSvrDlg->m_pDebugDlg->Message(pData, dwLength, "[×] ");
			return false;
		}

	}
	if (pRoadSvrDlg->m_pDebugDlg != NULL)
		pRoadSvrDlg->m_pDebugDlg->Message(pData, dwLength, "[√] ");
	return true;
}

DWORD CSerialPort::Read(LPBYTE pData, DWORD dwLength)
{
	BOOL fReadStat;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	DWORD dwError;
	DWORD dwBytesReaded, dwBytesReceive = 0;

	fReadStat = ReadFile(m_hCom, pData, dwLength, &dwBytesReaded, &m_osRead);
	if (!fReadStat)
	{
		if (GetLastError() == ERROR_IO_PENDING)
		{
			while(!GetOverlappedResult(m_hCom, &m_osRead, &dwBytesReaded, true))
			{
				dwError = GetLastError();
				if(dwError == ERROR_IO_INCOMPLETE)
				{
					dwBytesReceive += dwBytesReaded;
					continue;
				}
				else
				{
					ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
					return dwBytesReceive;
				}
			}
			dwBytesReceive += dwBytesReaded;
			return dwBytesReceive;
		}
		else
		{
			ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
			return dwBytesReceive;
		}
	}
	return dwBytesReaded;
}

//0 :false 1 : first true 2 : second true 3 two true
int CSerialPort::Write(CSerialPort* pSerial1, LPBYTE pData1, DWORD dwLength1,
					   CSerialPort* pSerial2, LPBYTE pData2, DWORD dwLength2)
{
	BOOL bCom1 = (pSerial1->m_hCom != INVALID_HANDLE_VALUE && pSerial1->m_fConnected);
	BOOL bCom2 = (pSerial2->m_hCom != INVALID_HANDLE_VALUE && pSerial2->m_fConnected);
	if (!bCom1 && !bCom2)
		return 0;

	DWORD dwBytesSent1 = 0, dwBytesSent2 = 0;
	DWORD dwBytesWritten1, dwBytesWritten2 ;
	DWORD dwErrorFlags;
	DWORD dwError;
	COMSTAT ComStat;

	BOOL bFinish1 = false, bFinish2 = false;

	if (bCom1 && !WriteFile(pSerial1->m_hCom, pData1, dwLength1, &dwBytesWritten1, &pSerial1->m_osWrite))
	{
		if (GetLastError() != ERROR_IO_PENDING)
		{
			ClearCommError(pSerial1->m_hCom, &dwErrorFlags, &ComStat ) ;
			bCom1 = false;
		}
	}
	else
	{
		//dwBytesSent1 == dwBytesWritten1;
		bFinish1 = true;
	}

	if (bCom2 && !WriteFile(pSerial2->m_hCom, pData2, dwLength2, &dwBytesWritten2, &pSerial2->m_osWrite))
	{
		if (GetLastError() != ERROR_IO_PENDING)
		{
			ClearCommError(pSerial2->m_hCom, &dwErrorFlags, &ComStat ) ;
			bCom2 = false;
		}
	}
	else
	{
		//dwBytesSent2 == dwBytesWritten2;
		bFinish2 = true;
	}

	while((bCom1 && !bFinish1) || (bCom2 && !bFinish2))
	{
		if (bCom1 && !GetOverlappedResult(pSerial1->m_hCom, &pSerial1->m_osWrite, &dwBytesWritten1, false))
		{
			dwError = GetLastError();
			if(dwError == ERROR_IO_INCOMPLETE)
				;//dwBytesSent1 += dwBytesWritten1;
			else
				bCom1 = false;
		}
		else
			bFinish1 = true;
		if (bCom2 && !GetOverlappedResult(pSerial2->m_hCom, &pSerial2->m_osWrite, &dwBytesWritten2, false))
		{
			dwError = GetLastError();
			if(dwError == ERROR_IO_INCOMPLETE)
				;//dwBytesSent1 += dwBytesWritten1;
			else
				bCom2 = false;
		}
		else
			bFinish2 = true;
	}
	//return (bCom1 ? (dwBytesSent1 == dwLength1 ? 1 : 0) : 0) + (bCom2 ? (dwBytesSent2 == dwLength2 ? 2 : 0) : 0);
	return (bCom1 && bFinish1 ? 1 : 0) + (bCom2 && bFinish2 ? 2 : 0);
}

DWORD CSerialPort::ReadByBlock(LPBYTE pBuffer, DWORD dwWantSize, DWORD dwBlockSize)
{
	DWORD dwReceived = 0;
	DWORD dwReceiving = __min(dwWantSize - dwReceived, dwBlockSize);
	while(dwReceived < dwWantSize)
	{
		DWORD nLength = Read(pBuffer + dwReceived, dwReceiving);
		dwReceived += nLength;
		if (nLength != dwReceiving)
			return dwReceived;
		dwReceiving = __min(dwWantSize - dwReceived, dwBlockSize);
	}
	return dwReceived;
}

⌨️ 快捷键说明

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