📄 说明.txt
字号:
函数说明:
InitCom是打开串口并进行初始化,在对串口进行其他操作前必须执行它(本例子在
OnInitDialog中调用它)。
InitCom的参数1是串口号,参数2表示波特率,例如:InitCom(1,CBR_9600)表示用COM1,9600波特率
ReadData是对串口进行读操作
WriteData是对串口进行写操作
WriteData的参数1是要发送的数据的指针,参数2是要发送的数据的长度。
这是串口编程的三个基本函数,具体什么时候调用ReadData,什么时候调用WriteData,由你自己决定,可以在ReadData中对所读的数据进行分析。
在本例子中采用定时放式,每隔100毫秒对串口进行一次操作。
记得程序退出前要关闭串口。
/////////////////////////////////////////////////////////////
//打开并初始化串口
//参数com为串口号,baud为波特率。
BOOL CComRhDlg::InitCom(int com, DWORD baud)
{
COMMTIMEOUTS timeout;
DCB dcb;
BOOL result;
int temp=0;
char strCom[20] = "\\\\.\\com";
char buffer[20];
_itoa(com , buffer , 10);
strcat( strCom , buffer );
m_hCom = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, NULL , NULL);
if( m_hCom == INVALID_HANDLE_VALUE )
{
DWORD dwError = GetLastError();
if (dwError == ERROR_ACCESS_DENIED)//已经打开
{
AfxMessageBox( "端口已被占用!请退出程序" , MB_OK , 0 );
return FALSE;
}
AfxMessageBox( "端口不存在或已坏!请退出程序" , MB_OK , 0 );
return FALSE;
}
result=SetupComm( m_hCom , 512 , 512 );
ASSERT(result);
if(!result) return FALSE;
result = PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
ASSERT( result );
if( !result ) return FALSE;
result = GetCommState( m_hCom , &dcb );
ASSERT(result);
if(!result) return FALSE;
dcb.Parity = NOPARITY;
dcb.BaudRate = baud;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
result = SetCommState( m_hCom , &dcb );
ASSERT(result);
if(!result) return FALSE;
result=GetCommTimeouts( m_hCom , &timeout );
ASSERT(result);
if(!result) return FALSE;
timeout.ReadIntervalTimeout=MAXDWORD;
timeout.ReadTotalTimeoutMultiplier=0;
timeout.ReadTotalTimeoutConstant=0;
timeout.WriteTotalTimeoutMultiplier=0;
timeout.WriteTotalTimeoutConstant=0;
result=SetCommTimeouts( m_hCom , &timeout );
ASSERT(result);
if(!result) return FALSE;
return TRUE;
}
//////////////////////////////////////////////
//读取串口数据,并判断所读的数据
//然后调用WriteData函数,将数据发送到串口。
void CComRhDlg::ReadData()
{
if(m_hCom == INVALID_HANDLE_VALUE)
return;
DWORD nRead = 0;
BYTE recBuf[512];//接收数据缓冲区
memset(recBuf, 0, sizeof(recBuf));
BYTE sendBuf[512];//发送数据缓冲区
memset(sendBuf, 0, sizeof(sendBuf));
PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
ReadFile( m_hCom , (char *)recBuf , 512 ,&nRead , NULL);//读串口
if(nRead != 0)
{
///////////////////////////////////////////////////////////
//下面是对收到的数据进行分析,然后确定发送的内容
//发送内容放到sendBuf中,
if(recBuf[0] == 0x06)
{
sendBuf[0] = 0x15;
WriteData((char *)sendBuf, 1);
}
// else if( (recBuf[0] == 0x53)
// && (recBuf[1] = 0x55)
// .... )
// {
// ....
// ....
// }
///////////////////////////////////////////////////////////
}
}
/////////////////////////////////////////////////////////////
//串口写操作
//将长度为len的tmpStr发到串口上。
void CComRhDlg::WriteData(char *tmpStr, int len)
{
if(m_hCom == INVALID_HANDLE_VALUE)
return;
DWORD nWrite = 0;
PurgeComm( m_hCom , PURGE_TXCLEAR|PURGE_RXCLEAR );
Sleep(100);
WriteFile(m_hCom, tmpStr, len , &nWrite, NULL);//写串口
if(nWrite != len)
{
AfxMessageBox("写数据失败!");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -