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

📄 serialportdlg.cpp

📁 wince的串口和PC机通讯程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/*******************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描    述: "打开端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnOpenCom() 
{
	DWORD IDThread;
	HANDLE hRecvThread;												/* 接收线程句柄 */
	UpdateData(TRUE);

	CString strPort = PorTbl[m_ComboPort.GetCurSel()];				/* 查表获取参数值 */
	DWORD baud		= BaudTbl[m_ComboBaud.GetCurSel()];
	DWORD databit   = DataBitTbl[m_ComboData.GetCurSel()];
	BYTE stopbit    = StopBitTbl[m_ComboStop.GetCurSel()];
	BYTE parity		= ParityTbl[m_ComboParity.GetCurSel()];

	BOOL ret = OpenPort(strPort, baud, databit, stopbit, parity);	/* 打开串口 */
	if (ret == FALSE)
		return;

	m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);		/* 创建串口接收线程退出事件*/

	// 创建串口接收线程
	hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);
	if (hRecvThread == NULL) 
	{
		MessageBox(_T("创建接收线程失败!"));
		return;
	}	
	CloseHandle(hRecvThread);

	m_ButOpen.EnableWindow(FALSE);									/* 打开端口按键禁止 */				
	m_ButClose.EnableWindow(TRUE);									/* 关闭端口按键使能 */	
	MessageBox(_T("打开") + strPort + _T("成功!"));
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描    述: "关闭端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnCloseCom() 
{
	if (m_ExitThreadEvent != NULL)
	{
		SetEvent(m_ExitThreadEvent);					/* 通知线程退出 */
		Sleep(1000);
		CloseHandle(m_ExitThreadEvent);
		m_ExitThreadEvent = NULL;
	}

	m_ButOpen.EnableWindow(TRUE);						/* 打开端口按键禁止 */				
	m_ButClose.EnableWindow(FALSE);						/* 关闭端口按键使能 */	
	ClosePort();
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnOpenCom
描    述: "关闭端口" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnSend() 
{
	DWORD dwactlen;

	if (m_hComm == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("串口未打开!"));
		return;
	}

	UpdateData(TRUE);
	int len = m_strSendEdit.GetLength();				 /* 取得输入字符串长度 */
	char *psendbuf = new char[len];

	for(int i = 0; i < len;i++)
		psendbuf[i] = (char)m_strSendEdit.GetAt(i);		 /* 转换为单字节字符 */

	WriteFile(m_hComm, psendbuf, len, &dwactlen, NULL);	 /* 从串口发送数据 */
	
	delete[] psendbuf;
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnClearSend
描    述: "清除发送缓冲区" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnClearSend() 
{
	m_strSendEdit = _T("");							/* 清除发送区的字符 */
	UpdateData(FALSE);
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnClearRec
描    述: "清除接收缓冲区" 按键单击事件代码
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnClearRec() 
{
	m_strRecDisp = _T("");					
	SetDlgItemText(IDC_REC_DISP,m_strRecDisp);		/* 清除接收区的字符 */
}


/*******************************************************************************************
函数名称: CSerialPortDlg::OnDestroy
描    述: 窗口销毁事件处理函数
输入参数: 无
输出参数: 无
返    回: 无
********************************************************************************************/
void CSerialPortDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if (m_ExitThreadEvent != NULL)
	{
		SetEvent(m_ExitThreadEvent);				/* 通知串口接收线程退出 */
		Sleep(1000);
		CloseHandle(m_ExitThreadEvent);				/* 关闭接收线程退出事件句柄 */
		m_ExitThreadEvent = NULL;
	}

	ClosePort();									/* 关闭串口 */
}

void CSerialPortDlg::OnCreateFile() 
{
	// TODO: Add your control notification handler code here
CString filename = "";
	UpdateData(TRUE);

	if (m_strFileName == "")
	{
		MessageBox(_T("请输入文件名!"));
		return;
	}
	
	// 取得文件名及路径
	filename = _T("\\Flash Disk\\") + m_strFileName;

	// 创建一个文件或打开一个文件
	hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, 
					   NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("在SD/MMC卡上创建文件失败!"));
		return;
	}

	MessageBox(_T("成功创建/打开文件:") + filename);
//写文件//
	DWORD len,actlen;
	char *pcharbuff;

	if (hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("文件未打开!"));
		return;	
	}

	UpdateData(TRUE);
	len = m_strRecDisp.GetLength();							/* 取得输入字符串的长度 */

	pcharbuff = new char[len];
	LPTSTR pStr = m_strRecDisp.GetBuffer(len);					/* 取得输入字符串的缓冲区指针 */

	// 将 Unicode 的 CString 转换为 char 型
	WideCharToMultiByte(CP_ACP, 0, pStr, len, pcharbuff, len, NULL, NULL);
	m_strRecDisp.ReleaseBuffer();

	BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN);	/* 移动文件指针到文件开头 */
	if (ret == 0xFFFFFFFF)
	{
		MessageBox(_T("将文件指针移至文件开头失败!"));
		delete[] pcharbuff;
		return;	
	}

	ret = WriteFile(hFile, pcharbuff, len, &actlen, NULL);	/* 将数据写入文件中 */
	if (ret == TRUE)
		MessageBox(_T("写文件成功!"));	
	else
		MessageBox(_T("写文件失败!"));	
	
	if (pcharbuff != NULL) 
		delete[] pcharbuff;
}

void CSerialPortDlg::OnReadFile() 
{
	// TODO: Add your control notification handler code here
DWORD filelen,actlen;
	char *pcharbuff;

	if (hFile == INVALID_HANDLE_VALUE)
	{
		MessageBox(_T("文件未打开!"));
		return;	
	}
	
	filelen = GetFileSize(hFile, NULL);							/* 获取文件大小 */
	if (filelen == 0xFFFFFFFF)
	{
		MessageBox(_T("获取文件大小失败!"));
		return;	
	}

	BOOL ret = SetFilePointer(hFile, 0, NULL, FILE_BEGIN);		/* 移动文件指针到文件开头 */	
	if (ret == 0xFFFFFFFF)
	{
		MessageBox(_T("将文件指针移至文件开头失败!"));
		return;	
	}

	pcharbuff = new char[filelen];
	ret = ReadFile(hFile, pcharbuff, filelen, &actlen, NULL);	/* 从文件中读出数据 */
	if (ret == TRUE)
	{
		LPTSTR pStr = m_strRecDisp.GetBuffer(filelen);	
		// 将字节转化为 Unicode 字符串
		MultiByteToWideChar(CP_ACP, 0, pcharbuff, filelen, pStr, filelen);
		m_strRecDisp.ReleaseBuffer();
		UpdateData(FALSE);										/* 将读出的数据显示出来 */
		MessageBox(_T("读文件成功!"));	
	}
	else
	{
		UpdateData(FALSE);
		MessageBox(_T("读文件失败!"));	
	}

	if (pcharbuff != NULL) 
		delete[] pcharbuff;		
}

⌨️ 快捷键说明

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