📄 serialportdlg.cpp
字号:
/*******************************************************************************************
函数名称: 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 + -