#include "Windows.h"
#include "winbase.h"
#include "resource.h"
#include "Main.h"
#include "define.h"int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nCmdShow)
{ MSG msg;
hInst = hInstance; CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN_DIALOG),0,(DLGPROC)MainDlg); //显示对话框
ShowWindow(gMainHwnd, nCmdShow);
//消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}BOOL APIENTRY MainDlg(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam)
{ PAINTSTRUCT ps;
int i = 0;
switch(message)
{
case WM_INITDIALOG:
isexit = FALSE;
hCom = NULL;
break;
case WM_PAINT:
BeginPaint(hDlg,&ps);
EndPaint(hDlg,&ps);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_OPEN :
OpenCom(hDlg);
break;
case IDC_SEND:
SendData(hDlg);
break;
case IDC_CLOSE :
CloseCom();
break;
case IDC_CANCEL:
PostMessage(hDlg, WM_DESTROY, 0, 0);
break;
}
break;
case WM_DESTROY:
CloseCom();
PostQuitMessage(0); break;
default:return(DefWindowProc(hDlg, message, wParam, lParam));
}
return 0;
}BOOL OpenCom(HWND hDlg)
{
if(hCom != NULL)
return 0;
hCom =CreateFile("COM1", //COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED;
NULL);
if(hCom ==INVALID_HANDLE_VALUE)
{
return FALSE;
} SetupComm(hCom,1024,1024); COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
TimeOuts.WriteTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutConstant=0;
SetCommTimeouts(hCom,&TimeOuts); DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //一个停止位
SetCommState(hCom,&dcb);
isexit = FALSE;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvData, (LPVOID)hDlg, 0, &Tid1);
return TRUE;}BOOL SendData(HWND hDlg)
{
HWND hEdit;
DWORD dwBytesWrite;
DWORD dwBytesWritten;
BOOL bWriteStat;
OVERLAPPED m_osWrite;
int i = 0;
unsigned char CHKSum = 0;
hEdit = GetDlgItem(hDlg, IDC_SEND_EDIT);
dwBytesWrite = GetWindowText(hEdit, (char *)&SendBuff[0], 1024);
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
bWriteStat=WriteFile(hCom,SendBuff,dwBytesWrite, &dwBytesWritten,&m_osWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
if(WaitForSingleObject(m_osWrite.hEvent,10000) == WAIT_TIMEOUT)
return 0;
}
}
return dwBytesWritten;
}
BOOL RecvData(LPVOID param)
{
DWORD wCount;//读取的字节数
DWORD num = 1024;
BOOL bReadStat;
HWND hDlg = (HWND)param;
OVERLAPPED m_osRead;
COMSTAT ComStat;
DWORD dwErrorFlags; memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); while(1)
{
{
ClearCommError(hCom,&dwErrorFlags,&ComStat);
memset(RecvBuff, 0, 1024);
bReadStat=ReadFile(hCom,RecvBuff,num,&wCount,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
if(WaitForSingleObject(m_osRead.hEvent,2000) != WAIT_TIMEOUT)
{
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
UpdataListbox(hDlg);
}
}
}
}
if(isexit)
return TRUE;
}
return TRUE;
}BOOL CloseCom()
{
BOOL result = FALSE;
if(hCom != NULL)
{
isexit = TRUE;
Sleep(2500);
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
result = CloseHandle(hCom);
hCom = NULL;
}
return TRUE;
}BOOL UpdataListbox(HWND hDlg)
{
HWND hListbox;
int num = 0; hListbox = GetDlgItem(hDlg, IDC_RECV_LIST);
num = SendMessage(hListbox, LB_GETCOUNT, 0, 0);
SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)(LPCSTR)RecvBuff);
return TRUE;
}
如上代码,线程没有收到数据是没有什么问题,只要收到数据后,就不能退出程序了!!!
帮忙看看!!
#include "winbase.h"
#include "resource.h"
#include "Main.h"
#include "define.h"int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nCmdShow)
{ MSG msg;
hInst = hInstance; CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN_DIALOG),0,(DLGPROC)MainDlg); //显示对话框
ShowWindow(gMainHwnd, nCmdShow);
//消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}BOOL APIENTRY MainDlg(HWND hDlg,UINT message, WPARAM wParam,LPARAM lParam)
{ PAINTSTRUCT ps;
int i = 0;
switch(message)
{
case WM_INITDIALOG:
isexit = FALSE;
hCom = NULL;
break;
case WM_PAINT:
BeginPaint(hDlg,&ps);
EndPaint(hDlg,&ps);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_OPEN :
OpenCom(hDlg);
break;
case IDC_SEND:
SendData(hDlg);
break;
case IDC_CLOSE :
CloseCom();
break;
case IDC_CANCEL:
PostMessage(hDlg, WM_DESTROY, 0, 0);
break;
}
break;
case WM_DESTROY:
CloseCom();
PostQuitMessage(0); break;
default:return(DefWindowProc(hDlg, message, wParam, lParam));
}
return 0;
}BOOL OpenCom(HWND hDlg)
{
if(hCom != NULL)
return 0;
hCom =CreateFile("COM1", //COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED;
NULL);
if(hCom ==INVALID_HANDLE_VALUE)
{
return FALSE;
} SetupComm(hCom,1024,1024); COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
TimeOuts.WriteTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutConstant=0;
SetCommTimeouts(hCom,&TimeOuts); DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //一个停止位
SetCommState(hCom,&dcb);
isexit = FALSE;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvData, (LPVOID)hDlg, 0, &Tid1);
return TRUE;}BOOL SendData(HWND hDlg)
{
HWND hEdit;
DWORD dwBytesWrite;
DWORD dwBytesWritten;
BOOL bWriteStat;
OVERLAPPED m_osWrite;
int i = 0;
unsigned char CHKSum = 0;
hEdit = GetDlgItem(hDlg, IDC_SEND_EDIT);
dwBytesWrite = GetWindowText(hEdit, (char *)&SendBuff[0], 1024);
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
bWriteStat=WriteFile(hCom,SendBuff,dwBytesWrite, &dwBytesWritten,&m_osWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
if(WaitForSingleObject(m_osWrite.hEvent,10000) == WAIT_TIMEOUT)
return 0;
}
}
return dwBytesWritten;
}
BOOL RecvData(LPVOID param)
{
DWORD wCount;//读取的字节数
DWORD num = 1024;
BOOL bReadStat;
HWND hDlg = (HWND)param;
OVERLAPPED m_osRead;
COMSTAT ComStat;
DWORD dwErrorFlags; memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); while(1)
{
{
ClearCommError(hCom,&dwErrorFlags,&ComStat);
memset(RecvBuff, 0, 1024);
bReadStat=ReadFile(hCom,RecvBuff,num,&wCount,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
if(WaitForSingleObject(m_osRead.hEvent,2000) != WAIT_TIMEOUT)
{
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
UpdataListbox(hDlg);
}
}
}
}
if(isexit)
return TRUE;
}
return TRUE;
}BOOL CloseCom()
{
BOOL result = FALSE;
if(hCom != NULL)
{
isexit = TRUE;
Sleep(2500);
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
result = CloseHandle(hCom);
hCom = NULL;
}
return TRUE;
}BOOL UpdataListbox(HWND hDlg)
{
HWND hListbox;
int num = 0; hListbox = GetDlgItem(hDlg, IDC_RECV_LIST);
num = SendMessage(hListbox, LB_GETCOUNT, 0, 0);
SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)(LPCSTR)RecvBuff);
return TRUE;
}
如上代码,线程没有收到数据是没有什么问题,只要收到数据后,就不能退出程序了!!!
帮忙看看!!
case WM_DESTROY:
CloseCom();//应该是卡这函数里了 debug吧
PostQuitMessage(0); break;
没有,CloseCom没有问题,debug的时候执行完成了
CloseCom();
DestroyWindow(hDlg);
break;