#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;
}
如上代码,线程没有收到数据是没有什么问题,只要收到数据后,就不能退出程序了!!!
帮忙看看!!