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);
}
}