📄 comm.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 + -