emwin 里面集成串口 (转载的)

emwin 里面集成串口 (转载的) 一次读一个字符

#include "GUI.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "DIALOG.h"
// void CRS485CommDlg::OnClose() 
// {
    // TODO: Add your message handler code here and/or call default
      // CloseHandle(hCom); //程序退出时关闭串口
      // CDialog::OnClose();
// }
//******************** var ******************************************************
HANDLE hComm;
OVERLAPPED m_ov;
COMSTAT comstat;
DWORD   m_dwCommEvents;

bool openport(char *portname)//打开串口
{
    hComm = CreateFile(portname, //串口号
                       GENERIC_READ | GENERIC_WRITE, //允许读写
                       0, //通讯设备必须以独占方式打开
                       0, //无安全属性
                       OPEN_EXISTING, //通讯设备已存在
                       FILE_FLAG_OVERLAPPED, //异步I/O
                       0); //通讯设备不能用模板打开

    if (hComm == INVALID_HANDLE_VALUE)
    {
        CloseHandle(hComm);
        return FALSE;
    }
    else
        return true;
}

bool setupdcb(int rate_arg)//设置DCB
{
    DCB  dcb;
    int rate= rate_arg;

    memset(&dcb,0,sizeof(dcb));
    if(!GetCommState(hComm,&dcb))//获取当前DCB配置
        return FALSE;

    // set DCB to configure the serial port
    dcb.DCBlength       = sizeof(dcb);
    /* ---------- Serial Port Config ------- */
        dcb.BaudRate        = rate;
        dcb.Parity      = NOPARITY;
        dcb.fParity     = 0;
        dcb.StopBits        = ONESTOPBIT;
        dcb.ByteSize        = 8;
        dcb.fOutxCtsFlow    = 0;
        dcb.fOutxDsrFlow    = 0;
        dcb.fDtrControl     = DTR_CONTROL_DISABLE;
        dcb.fDsrSensitivity = 0;
        dcb.fRtsControl     = RTS_CONTROL_DISABLE;
        dcb.fOutX           = 0;
        dcb.fInX            = 0;
    /* ----------------- misc parameters ----- */
        dcb.fErrorChar      = 0;
        dcb.fBinary         = 1;
        dcb.fNull           = 0;
        dcb.fAbortOnError   = 0;
        dcb.wReserved       = 0;
        dcb.XonLim          = 2;
        dcb.XoffLim         = 4;
        dcb.XonChar         = 0x13;
        dcb.XoffChar        = 0x19;
        dcb.EvtChar         = 0;
        // set DCB
        if(!SetCommState(hComm,&dcb))
            return false;
        else
            return true;
}

bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant)
{
    COMMTIMEOUTS timeouts;

    timeouts.ReadIntervalTimeout=ReadInterval;
    timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;
    timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;
    timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;
    timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;
    if(!SetCommTimeouts(hComm, &timeouts))
        return false;
    else
        return true;
}
//***********************************************************************
bool WriteChar(BYTE* m_szWriteBuffer,DWORD m_nToSend)
{
    BOOL bWrite = TRUE;
    BOOL bResult = TRUE;
    DWORD BytesSent = 0;
    // HANDLE  m_hWriteEvent;

    // ResetEvent(m_hWriteEvent);

    if (bWrite)
    {
        m_ov.Offset = 0;
        m_ov.OffsetHigh = 0;
        // Clear buffer
        bResult = WriteFile(hComm,  // Handle to COMM Port
        m_szWriteBuffer, // Pointer to message buffer in calling finction
        m_nToSend,       // Length of message to send
        &BytesSent,      // Where to store the number of bytes sent
        &m_ov );         // Overlapped structure
        if (!bResult)
        {
            DWORD dwError = GetLastError();
            switch (dwError)
            {
                case ERROR_IO_PENDING:
                    // continue to GetOverlappedResults()
                    BytesSent = 0;
                    bWrite = FALSE;
                break;

                default:
                // all other error codes
                break;
            }
        }
    } // end if(bWrite)
    if (!bWrite)
    {
        bWrite = TRUE;
        bResult = GetOverlappedResult(hComm,    // Handle to COMM port
        &m_ov,      // Overlapped structure
        &BytesSent,     // Stores number of bytes sent
        TRUE);          // Wait flag
        // deal with the error code
        if (!bResult)
        {
            printf("GetOverlappedResults() in WriteFile()");
        }
    } // end if (!bWrite)

    // Verify that the data size send equals what we tried to send
    if (BytesSent != m_nToSend)
    {
        printf("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSent, strlen((char*)m_szWriteBuffer));
    }
    return true;
}
//****************************************************************************************************************
WM_HWIN  hText;
char buf_recv[100];
void ReceiveChar( void)
{
    BOOL  bRead = TRUE;
    BOOL  bResult = TRUE;
    DWORD dwError = 0;
    DWORD BytesRead = 0;
    char RXBuff;
    int cnt = 0;

    while(1)
    {
        bResult = ClearCommError(hComm, &dwError, &comstat);

        if (comstat.cbInQue == 0)
        {
            GUI_Delay(10);
            continue;
        }

        if (bRead)
        {
            bResult = ReadFile( hComm,       // Handle to COMM port
                                &RXBuff,          // RX Buffer Pointer
                                1,                    // Read one byte
                                &BytesRead,           // Stores number of bytes read
                                &m_ov);           // pointer to the m_ov structure

            if((RXBuff == '\n'))
            {
                cnt = 0;
                TEXT_SetText(hText, buf_recv); 
                break;
            }
            buf_recv[cnt] = RXBuff;
            cnt++;
            if (!bResult)
            {
                switch (dwError = GetLastError())
                {
                    case ERROR_IO_PENDING:
                        bRead = FALSE;
                    break;

                    default:
                        break;
                }
            }
            else
            {
                bRead = TRUE;
            }
        }
        else
        {
            bRead = TRUE;
            bResult = GetOverlappedResult(  hComm,   // Handle to COMM port
                                            &m_ov,   // Overlapped structure
                                            &BytesRead,      // Stores number of bytes read
                                            TRUE);           // Wait flag
            break;
        }
    }

}

char send_buf[] = "HELLO WORLD,USART Test!\n";
//****************************************************************************************************************

#define ID_WINDOW_0     (GUI_ID_USER + 0x00)
#define ID_TEXT_0       (GUI_ID_USER + 0x01)
#define ID_TEXT_1       (GUI_ID_USER + 0x02)

#define ID_BUTTON_0     (GUI_ID_USER + 0xA0)
#define ID_BUTTON_1     (GUI_ID_USER + 0xB0)



void _cbCallback(WM_MESSAGE * pMsg)
{
    WM_HWIN  hWin;
    int NCode, Id;

    hWin  = pMsg->hWin;

    switch (pMsg->MsgId) 
    {
        case WM_PAINT:
            GUI_SetBkColor(GUI_BLACK);
            GUI_Clear();

            GUI_SetFont(GUI_FONT_24_ASCII);
            GUI_SetColor(GUI_RED);
            GUI_DrawRoundedRect(0,12,479,80,5);
            GUI_DispStringAt("RECEIVE",50, 0);

            GUI_SetColor(GUI_GREEN);
            GUI_DrawRoundedRect(0,117,479,200,5);
            GUI_DispStringAt("SEND",50, 110);
        break;

        case WM_INIT_DIALOG:
            hWin = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
            hText = hWin;

            TEXT_SetFont(hWin, &GUI_Font24_ASCII);
            TEXT_SetTextAlign(hWin,TEXT_CF_HCENTER | TEXT_CF_VCENTER);
            TEXT_SetTextColor(hWin, GUI_WHITE); 

            hWin = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
            TEXT_SetFont(hWin, &GUI_Font24_ASCII);
            TEXT_SetTextAlign(hWin,TEXT_CF_HCENTER | TEXT_CF_VCENTER);
            TEXT_SetTextColor(hWin, GUI_WHITE);

            hWin = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
            BUTTON_SetFont(hWin, &GUI_Font24B_ASCII);
        break;

        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc); 
            NCode = pMsg->Data.v;        
            switch (Id) 
            {
                case ID_BUTTON_0:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_RELEASED:
                            hWin = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
                            TEXT_SetText(hWin, send_buf); 

                            WriteChar((BYTE *)send_buf,GUI_COUNTOF(send_buf) - 1);
                        break;
                    }
                break;

            }
            break;

        default:
            WM_DefaultProc(pMsg);
    }
}

static const GUI_WIDGET_CREATE_INFO _aDialog[] = {
    { WINDOW_CreateIndirect,    "",   ID_WINDOW_0,   0,   0, 480,272, 0, 0x0, 0 },

    { TEXT_CreateIndirect,      "",    ID_TEXT_0,    0, 0, 480,100, 0,0},
    { TEXT_CreateIndirect,      "",    ID_TEXT_1,    0, 120, 480,100, 0,0},

    { BUTTON_CreateIndirect,    "SEND",    ID_BUTTON_0,  140,  220, 200,46, 0,0},
};

//****************************************************************************************************************
void MainTask(void) 
{
    bool open;
    //-------------- GUI ----------------------------
    GUI_Init();


    // GUI_SetFont(GUI_FONT_8X16_ASCII);

    GUI_SetColor(GUI_GREEN);
    GUI_SetFont(GUI_FONT_32_ASCII);
    //------------ USRAT ----------------------------
    open = openport("com4");

    if(open)
    {
        // GUI_DispStringAt("1.open comport----------OK", 0, 0);
    }
    if(setupdcb(115200))
    {
        // GUI_DispStringAt("2.setup DCB---------------OK", 0, 40);
    }

    if(setuptimeout(0,0,0,0,0))
    {
        // GUI_DispStringAt("3.setup timeout-----------OK", 0, 80);
    }
    SetCommMask(hComm, EV_RXCHAR); //当有字符在inbuf中时产生这个事件

    //清除串口的所有操作
    PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);

    GUI_SetColor(GUI_CYAN);
    GUI_DrawHLine(150,0,480);
    //----------- IS PAUSE -----------------------------------------------
    // system("pause") ;
    WM_SetCreateFlags(WM_CF_MEMDEV);

    GUI_CreateDialogBox(_aDialog, 
                        GUI_COUNTOF(_aDialog), 
                        &_cbCallback, 
                        WM_HBKWIN,
                        0, 
                        0);

    while(1)
    {
        ReceiveChar( );
        GUI_Delay(10);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值