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

📄 comm.cpp

📁 WinCE下的串口收发程序
💻 CPP
字号:
#include "stdafx.h"
#include "CommApp.h"
#include "CommAppDlg.h"
#include "Comm.h"

#include <windows.h>
#include <winbase.h>
#include <winnls.h>

//int nLineCount = 0;
extern PIOREG pIOReg;
extern CEdit *pm_Edit;
extern CEdit *pm_Send;
extern CEdit *pm_Status;
extern HANDLE hPAHandle;
//////////////////////////////////////////////////////////////////////////////////
void CommInit(PCOMOBJ pComObj,unsigned long Baudrate)
{
		DCB dcb;

		pComObj->DeviceHandle = CreateFile( pComObj->DeviceName, GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING, 0, NULL );
		if( pComObj->DeviceHandle == INVALID_HANDLE_VALUE ) 
			{
			pm_Status->SetWindowText(TEXT("Cannot Open ")+pComObj->DeviceName);
			return;
			}
		pm_Status->SetWindowText(TEXT("COM Opened!"));
		//set the DCB structure
		dcb.DCBlength = sizeof( DCB );
		GetCommState( pComObj->DeviceHandle, &dcb );
		dcb.fParity = FALSE;
		dcb.fNull = FALSE;
		dcb.StopBits = ONESTOPBIT;
		dcb.Parity = NOPARITY;
		dcb.BaudRate = Baudrate;
		dcb.ByteSize = 8;
//		BOOL bSetCommStat = 
		SetCommState( pComObj->DeviceHandle, &dcb );

		//Set the timeout
		COMMTIMEOUTS CommTimeOuts;
		CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
		CommTimeOuts.ReadTotalTimeoutMultiplier = 10;
		CommTimeOuts.ReadTotalTimeoutConstant = 10;
		CommTimeOuts.WriteTotalTimeoutMultiplier = 50;
		CommTimeOuts.WriteTotalTimeoutConstant = 100;
		SetCommTimeouts( pComObj->DeviceHandle, &CommTimeOuts );
		return;
}

//Rcv Thread,Read the ComBuffer
void CommRcv(PVOID ra)
{
	BYTE ReadBuffer[2000] = {0};
//	BOOL bReadStatus = FALSE;
	DWORD dwErrorFlags;
	COMSTAT ComStat;
	PCOMOBJ pComObj=(PCOMOBJ)ra;
	DWORD i;
	DWORD dwBytesRead = 0;
	TCHAR TReadBuffer[2000] = {0};
	SetCommMask(pComObj->DeviceHandle,EV_RXCHAR);
	while(1)
		{			
		WaitCommEvent(pComObj->DeviceHandle,NULL,NULL);
		SetCommMask(pComObj->DeviceHandle,EV_RXCHAR);
		ClearCommError( pComObj->DeviceHandle, &dwErrorFlags, &ComStat );
		if( !ComStat.cbInQue )continue;

//		dwBytesToRead = ComStat.cbInQue;

		if( !ReadFile( pComObj->DeviceHandle,ReadBuffer, ComStat.cbInQue, &dwBytesRead, NULL) )
			{	
			pm_Status -> SetWindowText(TEXT("Read COMM Failed!"));
			return;
			}
		else 
			{		
			pm_Status -> SetWindowText(TEXT("Read COM Success!"));

			MultiByteToWideChar(CP_ACP,0,(char *)ReadBuffer,dwBytesRead,TReadBuffer,dwBytesRead);
			if(TReadBuffer[0])lstrcat(TReadBuffer,TEXT("\r\n"));

	//		nLineCount = ;
			if( (pm_Edit->GetLineCount()) > 40)
				{				
				//Clear the Output
				pm_Edit -> SetSel(0,-1);
				pm_Edit -> Clear();
				}
			//Now output		
			int nLen = pm_Edit->GetWindowTextLength(); 
			pm_Edit -> SetFocus(); 
			pm_Edit -> SetSel(nLen, nLen); 
			pm_Edit -> ReplaceSel(TReadBuffer); 
			//Clear the Buffer
			for(i=0;i < dwBytesRead +2;i++)
				{
				ReadBuffer[i] = 0;
				TReadBuffer[i] = 0;
				}
			}	
		}
}

//Trans Thread
void CommTrans(PVOID ra)
{
	DWORD dwBytes;
	PCOMOBJ pComObj=(PCOMOBJ)ra;
	PAI pai;
	pai.PhyAddr=(DWORD)IOP_BASE;
	pai.MemLen=sizeof(IOREG);
	char WBuf[100] = {0};
	TCHAR WriteBuffer[100] = {0};
	PIOREG pIOReg=0;
	while(1)
	{
		if(WaitForSingleObject(pComObj->hevWriteEnable,INFINITE) == WAIT_OBJECT_0)
		{
			//Write to Comm
			switch(pComObj->Mode)
			{
				case COM_MODE_RS232:
				break;
				case COM_MODE_RS485:
				//modify the physical address
					pai.AccessOffset=(DWORD)&(pIOReg->rGPHDAT);
					pai.AccessRange=1;
					pai.BitMask=1ul<<1;
					pai.BitValue=1ul<<1;
					pai.SubCode=PAX_SUBCODE_MODIFY;
					DeviceIoControl(hPAHandle,PAX_CODE_WRITE,(PVOID)&pai,sizeof(PAI),NULL,0,NULL,NULL);
				break;
				case COM_MODE_IRDA:
				break;
				default:
					;
			}
			pm_Send -> GetWindowText(WriteBuffer,100);
			lstrcat(WriteBuffer,TEXT("\r\n"));
			WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK|WC_DEFAULTCHAR,WriteBuffer,lstrlen(WriteBuffer),WBuf,lstrlen(WriteBuffer),NULL,NULL);
			if(WriteFile(pComObj->DeviceHandle, (TCHAR *)WBuf,lstrlen(WriteBuffer)*sizeof(char),&dwBytes, NULL))
				pm_Status -> SetWindowText(TEXT("Write COM Success!"));
			else 
			{
				DWORD i = GetLastError();
				pm_Status -> SetWindowText(TEXT("Write COM Failed!"));
			}
			switch(pComObj->Mode)
			{
				case COM_MODE_RS232:
				break;
				case COM_MODE_RS485:
				//modify the physical address
					pai.AccessOffset=(DWORD)&(pIOReg->rGPHDAT);
					pai.AccessRange=1;
					pai.BitMask=1ul<<1;
					pai.BitValue=0;
					pai.SubCode=PAX_SUBCODE_MODIFY;
					DeviceIoControl(hPAHandle,PAX_CODE_WRITE,(PVOID)&pai,sizeof(PAI),NULL,0,NULL,NULL);
				break;
				case COM_MODE_IRDA:
				break;
				default:
					;
			}

		}
		else 
			break;
	}
	return;
}

⌨️ 快捷键说明

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