ftrans.c

来自「pcom 非常好用的一个串口编程库」· C语言 代码 · 共 508 行 · 第 1/2 页

C
508
字号
/************************************************************************
    FTrans.c
     -- Main module for file transfer example program.

    Description:
      1.Select "setting..." menu item to set com port option.
      2.Select "Open" menu item to open com port.
        After selected "Open" from menu,you can select
        "File Transfer" form menu to test file transfer function.
        Program will pop up a dialog to display status.
      3.When transferring file,you can push "Cancel" button to
        abort.
      4.Select "Close" menu item to close com port.

    This program demo:
        How to use file transfer function(sio_FtxxxTx,sio_FtxxxRx);
        How to use callback function to display file transfer status;
        How to process file transfer function return code;
        How to abort file transfer process in callback function;


    Use function:
        sio_open,       sio_close,         sio_ioctl,
        sio_flowctrl,   sio_DTR,           sio_RTS,
        sio_FtASCIITx,                     sio_FtASCIIRx,
        sio_FtXmodemCheckSumTx,            sio_FtXmodemCheckSumRx,
        sio_FtXmodemCRCTx,                 sio_FtXmodemCRCRx,
        sio_FtXmodem1KCRCTx,               sio_FtXmodem1KCRCRx,
        sio_FtYmodemTx,                    sio_FtYmodemRx,
        sio_FtZmodemTx,                    sio_FtZmodemRx,
        sio_FtKermitTx,                    sio_FtKermitRx.

    History:   Date       Author         Comment
               3/1/98     Casper         Wrote it.

*************************************************************************/

#include <windows.h>
#include <commdlg.h>
#include <windowsx.h>
#include <dlgs.h>
#include "PComm.h"
#include "mxtool.h"
#include "resource.h"
#include "comm.h"
#include "FTrans.h"


HINSTANCE       GhInst;
COMMDATA        GCommData;
BOOL            GbOpen;

char            GszAppName[] = "File Transfer";

char		GxFname[_MAX_PATH];
char		GrFname[_MAX_PATH];
char		GrPath[_MAX_PATH];

HWND	GhWnd;
HWND	GStatWnd;
HANDLE	GftStop;

LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
BOOL	CALLBACK PortDlgProc(HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam);
BOOL	CALLBACK FtDlgProc(HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam);
BOOL	CALLBACK FtStatProc(HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam);
BOOL	CALLBACK AboutDlgProc(HWND hDlg,UINT iMsg,WPARAM wParam,LPARAM lParam);

UINT	FtProc( LPVOID pParam );
BOOL	XmitFile(HWND hwnd);
BOOL	RecvFile(HWND hwnd);

static	void	SwitchMenu(HWND	hwnd);
static	BOOL	OpenPort(void);
static	BOOL	ClosePort(void);
static	BOOL	PortSet(void);
static	void 	ShowStatus(void);
static	HANDLE  hExit;
static  HANDLE  hFtThread;
static  BOOL    b_busy;


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   PSTR szCmdLine,int iCmdShow)
{

        WNDCLASSEX      wndclass;
        HWND            hwnd;
        MSG             msg;

        GhInst = hInstance;

        wndclass.cbSize		= sizeof(WNDCLASSEX);
        wndclass.style 		= CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc= WndProc;
        wndclass.cbClsExtra	= 0;
        wndclass.cbWndExtra	= 0;
        wndclass.hInstance 	= hInstance;
        wndclass.hIcon	   	= LoadIcon(NULL,IDI_APPLICATION);
        wndclass.hCursor   	= LoadCursor(NULL,IDC_ARROW);
        wndclass.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);
        wndclass.lpszMenuName	= MAKEINTRESOURCE(IDM_FTRANS);
        wndclass.lpszClassName	= GszAppName;
        wndclass.hIconSm   	= LoadIcon(NULL,IDI_APPLICATION);

        RegisterClassEx(&wndclass);

        hwnd = CreateWindow(GszAppName,
             GszAppName,
             WS_OVERLAPPEDWINDOW ,
             CW_USEDEFAULT,	CW_USEDEFAULT,
             CW_USEDEFAULT,	CW_USEDEFAULT,
             NULL,NULL,
             hInstance,
             NULL);

        GhWnd = hwnd;
        ShowWindow(hwnd,iCmdShow);
        UpdateWindow(hwnd);

        while(GetMessage(&msg,NULL,0,0)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
        switch(iMsg){
        case WM_COMMAND:
            switch(LOWORD(wParam)){
            case IDM_PORT_OPEN:
                OpenPort();
                return 0;
            case IDM_PORT_CLOSE:
                ClosePort();
                return 0;
            case IDM_PORT_SETTING:{
                COMMDATA bakdata = GCommData;
                if(b_busy)
                    return 0;
                if(DialogBox(GhInst,MAKEINTRESOURCE(IDD_OPEN),hwnd,PortDlgProc)==IDCANCEL)
                    return 0;
                if(GbOpen)
                    if (!PortSet())
                        GCommData = bakdata;
                return 0;
                }
            case IDM_FILE_TRANS:
                if(b_busy)
                    return 0;
                if(DialogBox(GhInst,MAKEINTRESOURCE(IDD_FILETRANS),hwnd,FtDlgProc)==IDCANCEL)
                    return 0;
                if(GDirection==FT_XMIT)
                    XmitFile(hwnd);
                else if(GDirection==FT_RECV)
                    RecvFile(hwnd);
                return 0;
            case IDM_HELP_ABOUT:
                DialogBox(GhInst,MAKEINTRESOURCE(IDD_ABOUT),hwnd,AboutDlgProc);
                return 0;
            case IDM_PORT_EXIT:
                SendMessage(hwnd,WM_CLOSE,0,0L);
                return 0;
            }
            break;
        case WM_CREATE:
            GCommData.Port = 1;
            GCommData.ibaudrate  = 14;
            GCommData.iparity = 0;
            GCommData.ibytesize = 3;
            GCommData.istopbits = 0;
            GCommData.BaudRate  = B38400;
            GCommData.Parity = P_NONE;
            GCommData.ByteSize = BIT_8;
            GCommData.StopBits = STOP_1;
            GCommData.Hw = FALSE;
            GCommData.Sw = FALSE;
            GCommData.Dtr = TRUE;
            GCommData.Rts = TRUE;
            GbOpen = FALSE;
            b_busy = FALSE;

            SwitchMenu(hwnd);
            return 0;
        case WM_CLOSE:
            if(GbOpen)
                SendMessage(hwnd,WM_COMMAND,IDM_PORT_CLOSE,0);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_STCLOSE:
            DestroyWindow(GStatWnd);
            return 0;	 
        case WM_FTEND:
            WaitForSingleObject(hFtThread,INFINITE);
            CloseHandle(GftStop);
            CloseHandle(hFtThread);
            b_busy = FALSE;
            return 0;
        }

        return DefWindowProc(hwnd,iMsg,wParam,lParam);
}


static void SwitchMenu(HWND hwnd)
{
        HMENU	hMenu;

        hMenu = GetMenu(hwnd) ;

        if(GbOpen){
            EnableMenuItem( hMenu, IDM_PORT_OPEN,
            	MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
            EnableMenuItem( hMenu, IDM_PORT_CLOSE, MF_ENABLED | MF_BYCOMMAND ) ;
            EnableMenuItem( hMenu, IDM_FILE_TRANS, MF_ENABLED | MF_BYCOMMAND ) ;
        }else{
            EnableMenuItem( hMenu, IDM_PORT_OPEN,MF_ENABLED | MF_BYCOMMAND);
            EnableMenuItem( hMenu, IDM_PORT_CLOSE,
            	MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
            EnableMenuItem( hMenu, IDM_FILE_TRANS,
            	MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
        }

        DrawMenuBar(hwnd);
}

BOOL OpenPort(void)
{
        int		ret;


        if((ret=sio_open(GCommData.Port))!=SIO_OK){
            MxShowError("sio_open",ret);
            return FALSE;
        }

        if(!PortSet()){
            sio_close(GCommData.Port);
            return FALSE;
        }

        GbOpen = TRUE;
        ShowStatus();
        SwitchMenu(GhWnd);

        return TRUE;
}

⌨️ 快捷键说明

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