界面设计(为鸟达到窗口翻页效果,我把标题栏去掉鸟) HANDLE m_hComm; //串口读写处理 CEdit * g_receive; //接收数据 文本框指针(主要用在线程里面) CEdit * g_send; //同理 bool Mouse_down = false; //鼠标是否点击鸟 DDX_CBString(pDX, IDC_cbPort, m_port); DDX_CBString(pDX, IDC_cbWave, m_wave); DDX_CBString(pDX, IDC_cbCheck, m_check); DDX_CBString(pDX, IDC_cbData, m_data); DDX_CBString(pDX, IDC_cbStop, m_stop); DDX_Text(pDX, IDC_edSendData, m_sendData); DDX_Text(pDX, IDC_edReceive, m_receive); DDX_Control(pDX, IDC_cbPort, m_con_port); DDX_Control(pDX, IDC_cbWave, m_con_wave); DDX_Control(pDX, IDC_cbCheck, m_com_check); DDX_Control(pDX, IDC_cbData, m_con_data); DDX_Control(pDX, IDC_cbStop, m_con_stop); DDX_Control(pDX, IDC_isOpen, p_open); DDX_Control(pDX, IDC_isClose, p_close); DDX_Control(pDX, IDC_edReceive, e_receive); DDX_Control(pDX, IDC_CHECK1, m_send_16); DDX_Control(pDX, IDC_edSendData, e_send); DDX_Control(pDX, IDC_CHECK2, m_receive16); 这是控件所要添加的变量,都是在对话框里面右键添加变量,至于哪个是值变量,哪个是控件变量,就要自己 额,太多鸟!(- -!)别怪我`我不是老师额! BOOL CSerialPortDlg::OnInitDialog()在这加载函数里面我们需要添加 this->SetWindowPos(this,0,0,480,320,SWP_SHOWWINDOW);//移动窗口 m_con_port.SetCurSel(0); m_con_wave.SetCurSel(5); m_com_check.SetCurSel(0); m_con_data.SetCurSel(0); m_con_stop.SetCurSel(0); g_receive = &e_receive; g_send = &e_send; if (!SetCommMask (m_hComm, EV_RXCHAR)) //检测端口 { if (this->MessageBox(L"串口没有打开!")) this->SetWindowPos(this,0,0,480,320,SWP_SHOWWINDOW);//重移窗口(狠重要)<-因为Wince开发板``屏幕为240*320 额``为什么设定成480*320``就为鸟达到窗口翻页效果,分半变成两页 //MessageBox(L"串口没有打开!"); GetDlgItem(IDC_OpenPort)->EnableWindow(TRUE); //打开打开串口按钮 GetDlgItem(IDC_ClosePort)->EnableWindow(FALSE); //禁止关闭串口按钮 p_close.ShowWindow(FALSE); p_open.ShowWindow(TRUE); } else { GetDlgItem(IDC_ClosePort)->EnableWindow(TRUE); //打开关闭串口按钮 GetDlgItem(IDC_OpenPort)->EnableWindow(FALSE); //禁止打开串口按钮 p_close.ShowWindow(TRUE); p_open.ShowWindow(FALSE); } 打开串口代码 void CSerialPortDlg::OnBnClickedOpenport() { // TODO: 在此添加控件通知处理程序代码 GetDlgItemText(IDC_cbPort,m_port); //读取串口号 GetDlgItemText(IDC_cbWave,m_wave); //读取波特率 GetDlgItemText(IDC_cbCheck,m_check);//读取校检位 GetDlgItemText(IDC_cbData,m_data); //读取数据位 GetDlgItemText(IDC_cbStop,m_stop); //读取停止位 m_hComm=NULL; m_hComm = CreateFile( m_port, GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //独占方式(共享模式) NULL, OPEN_EXISTING, //打开而不是创建(创建方式) 0, NULL ); DCB commParam; GetCommState(m_hComm,&commParam); //得到串口状态 commParam.BaudRate = _wtoi(m_wave); // 设置波特率 commParam.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE commParam.fParity = FALSE; // 支持奇偶校验 commParam.ByteSize = _wtoi(m_stop); // 数据位,范围:4-8 commParam.Parity = _wtoi(m_check); // 校验模式 commParam.StopBits = _wtoi(m_wave); // 停止位 commParam.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写 SetCommState(m_hComm,&commParam); //保存设置 if (!SetCommMask (m_hComm, EV_RXCHAR)) //检测端口 { if (MessageBox(L"串口没有打开!")) this->SetWindowPos(this,0,0,480,320,SWP_SHOWWINDOW);//重移窗口(狠重要) //MessageBox(L"串口没有打开!"); GetDlgItem(IDC_OpenPort)->EnableWindow(TRUE); //打开打开串口按钮 GetDlgItem(IDC_ClosePort)->EnableWindow(FALSE); //禁止关闭串口按钮 p_close.ShowWindow(FALSE); p_open.ShowWindow(TRUE); } else { GetDlgItem(IDC_ClosePort)->EnableWindow(TRUE); //打开关闭串口按钮 GetDlgItem(IDC_OpenPort)->EnableWindow(FALSE); //禁止打开串口按钮 p_close.ShowWindow(TRUE); p_open.ShowWindow(FALSE); W_file = CreateFile(L"./Save.txt", GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //独占方式(共享模式) NULL, OPEN_ALWAYS, //无论什么情况都直接创建 0, NULL );//创建文本保存信息 CString TimeNow; DWORD write = 0; SYSTEMTIME st; GetSystemTime(&st); TimeNow.Format(L"%d"L"|"L"%d"L"|"L"%d"L"|"L"%d"L"|"L"%d"L"|"L"%d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); WriteFile(W_file,TimeNow,TimeNow.GetLength()*2,&write,NULL); CloseHandle(W_file); } CreateThread(NULL,NULL,ReceiveThread,NULL,NULL,NULL); //启动接收数据线程 } (SAVE.txt时间保存信息没有转成二进制类型保存,额!``建议``还是不要用额``有bug) 发送数据代码 void CSerialPortDlg::OnBnClickedbtnsend() { // TODO: 在此添加控件通知处理程序代码 int willReadLen = (m_sendData.GetLength()*2); GetDlgItemText(IDC_edSendData,m_sendData); //读取发送数据 DWORD actualLength=0; //函数执行成功后,返回实际向串口写的个数 WriteFile(m_hComm,m_sendData,willReadLen,&actualLength,NULL); return; } 关闭串口代码 void CSerialPortDlg::OnBnClickedCloseport() { // TODO: 在此添加控件通知处理程序代码 if (!CloseHandle (m_hComm)) { m_hComm = INVALID_HANDLE_VALUE; } GetDlgItem(IDC_OpenPort)->EnableWindow(TRUE); //打开打开串口按钮 GetDlgItem(IDC_ClosePort)->EnableWindow(FALSE); //禁止关闭串口按钮 p_close.ShowWindow(FALSE); p_open.ShowWindow(TRUE); W_file = CreateFile(L"./Save.txt", GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //独占方式(共享模式) NULL, OPEN_ALWAYS, //无论什么情况都直接创建 0, NULL );//创建文本保存信息 CString TimeNow; DWORD write = 0; SYSTEMTIME st; GetSystemTime(&st); TimeNow.Format(L"%d"L"|"L"%d"L"|"L"%d"L"|"L"%d"L"|"L"%d"L"|"L"%d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); WriteFile(W_file,TimeNow,TimeNow.GetLength()*2,&write,NULL); CloseHandle(W_file); } 接收数据线程代码(这是重点与-à打开串口函数的那个--- ---à CreateThread(NULL,NULL,ReceiveThread,NULL,NULL,NULL);//启动接收数据线程)对应的哦. DWORD CSerialPortDlg::ReceiveThread(PVOID arg) { DWORD actualReadLen=0; //实际读取的字节数 DWORD evtMask; char buf[4096]; DWORD willReadLen=0; //将要读取的字节数 DWORD dwReadErrors=0; COMSTAT cmState; CString str=L""; CString temp=L""; int len=0; while (1) { WaitCommEvent(m_hComm,&evtMask,0); //检测串口 ClearCommError(m_hComm,&dwReadErrors,&cmState); willReadLen = cmState.cbInQue ; memset(buf,0x00,100); //清理内存 ReadFile(m_hComm, buf, willReadLen, &actualReadLen,0); //读取文件 temp.Format(L"%s",(CString)buf); str=str+temp; if(str.GetLength()>20) { temp=L"/r/n"; str=str+temp; } g_receive->SetWindowTextW(str); } return 0; } 随便给个按钮给他 if (R_send == true) { SetDlgItemText(IDC_edSendData,L""); } else if (R_receive == true) { SetDlgItemText(IDC_edReceive,L""); } return; 十六进制转换(接收,发送同理啦``我只写发送) GetDlgItemText(IDC_edSendData,m_sendData); //读取发送数据 int willReadLen=(m_sendData.GetLength()*3); char buf16[4096]={0x00}; char *buf = (LPSTR)(LPCTSTR)m_sendData; CString temp = L""; CString str = L""; CString S=L""; if (m_send_16.GetCheck()==BST_CHECKED) //如果进制发送被选中,则转换进制 { int i=0; int j=0; while(i<willReadLen) //逐字符转换 { j=j+sprintf(&buf16[j]," 0X%x",buf[i]); i++; } temp.Format(L"%s",(CString)buf16); str=str+temp; if(str.GetLength()>20) { temp=L"/r/n"; str=str+temp; } g_send->SetWindowTextW(str); //g_send就是刚刚说狠重要的指针?为什么要这样做,你自己写一条``` GetDlgItemText(控件ID,str) 编译一下就知道啦 return; } 发送文本代码 void CSerialPortDlg::OnBnClickedSendfile() { // TODO: 在此添加控件通知处理程序代码 CString str; CFileDialog fileDlg(TRUE); //打开文件控件启动 CString path; //文件路径 if(fileDlg.DoModal()!=IDOK) //检测是否选取鸟文本 { return; } path=fileDlg.GetPathName();//获取文件名 char buf[4096]={0x00}; HANDLE file = CreateFile( path,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, 0,NULL ); DWORD actualRead=0; DWORD dwNumBytesWritten=0; ReadFile(file,buf,4096,&actualRead,0); str.Format(L"%s",(CString)buf); CloseHandle(file); g_send->SetWindowTextW(str);//显示文本内容 } 最后就是那些翻页按钮和关闭程序按钮咯 name:5+x