三、基于串口通信的控制LED灯的程序
1、在SerialDlg.h加入LED灯控制成员函数
static void LedControl(DWORD opretion );
2、在SerialDlg.cpp实现LedControl函数
在最后加入如下代码
void CSerialDlg::LedControl(DWORD opretion )
{
HANDLE hdDevice;
DWORD error;
char *buffToOpen="open"; //控制打开led灯的缓冲区
char *buffToClose="close"; //控制关闭led灯的缓冲区
DWORD ret;
hdDevice=CreateFile(_T("LED1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //打开led设备
if (hdDevice== INVALID_HANDLE_VALUE)
{
return;
}
if(opretion==1)
{
if(!WriteFile(hdDevice,buffToOpen,0,&ret,NULL)) //控制灯亮
{
error=GetLastError();
return;
}
}
else
{
if(!WriteFile(hdDevice,buffToClose,0,&ret,NULL)) //控制灯灭
{
error=GetLastError();
return;
}
}
2、 增加支持中文传输和控制led灯功能
在SerialDlg.cpp里面把void CALLBACK CSerialDlg::OnComRecv(CWnd* pWnd, char *buf, int buflen)修改如下:
void CALLBACK CSerialDlg::OnComRecv(CWnd* pWnd, char *buf, int buflen)
{
CSerialDlg *pDlg = (CSerialDlg*)pWnd;
CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_REV);
// MultiByteToWideChar函数的作用是把多字节转换成字符,由于一个中文字符由两个字节组成,
//所以要使用此函数来进行多字节到字符的转换
// CP_ACP表示ANSI编码
// buf 表示要转换的字符缓冲区
DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
WCHAR *pwText;
pwText = new WCHAR[dwNum]; /*存放宽字符的缓冲区*/
MultiByteToWideChar(CP_ACP,0,buf,-1,pwText,dwNum); /*把多字节转换成字符,转换的结果放在pwText缓冲*/
CString str(pwText);
if (str.Find(L"打开")!=-1) //如果接收到“打开”命令则打开灯
{
LedControl(1);
}
if (str.Find(L"关闭")!=-1) //如果接收到“关闭”命令则关闭灯
{
LedControl(0);
}
pDlg->strRecDisp+=str;
pRecvStrEdit->SetWindowText(pDlg->strRecDisp); //显示字符
delete []pwText;
}
3、 修改led灯驱动
在wyleddrvr.cpp修改LED_Write()函数
修改如下


