当前位置: 首页 > news >正文

工业设计东莞网站建设企业网站优化链接

工业设计东莞网站建设,企业网站优化链接,宁波市房产交易信息服务网,保定网站建设方案报价文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示#xff0c;功… 文章目录1 完整 功能展示2 添加控件变量及声明2.1 添加控件及变量2.2 SerialPortDlg.h: 头文件3 函数实现3.1 数据发送3.1.2 写数据、字符串转3.2 发送文件3.2.1 打开文件3.2.2 发送文件3.3 清空发送区4 完整MFC项目项下载1 完整 功能展示 串口通信助手 页面展示功能齐全 还增加了串口打开/关闭状态变色发送按钮状态变色等功能。 发送/接收时相应按钮功能禁用/可用等保护措施。 2 添加控件变量及声明 串口设置等基本功能实现 教程MFC串口助手(一)—初级版初始化、串口设置、修改参数、打开/关闭、状态显示 本节将接着上一节教程继续实现 发送数据 、发送文件 2.1 添加控件及变量 添加控件 发送数据的编辑框、按钮 打开文件、发送文件 按钮 显示文件路径静态文本框清空发送区 按钮修改ID如下 发送数据 IDC_EDIT_TXDATA IDC_BUTTON_SEND //发送文件 IDC_BUTTON_OPEN_FILE IDC_BUTTON_SEND_FILE IDC_STATIC_FILE_PATH //清空发送区 IDC_BUTTON_CLEAN_SEND添加控件变量 注意下下面 m_sendbutten 控件类型添加为CButton类型就可以了。我这里是自己写的一个可变色CCustomButton类型 方法选中控件右键选择添加变量 //CButton m_sendbutten; CCustomButton m_sendbutten; CButton m_transfile; CButton m_emptySendArea; CStatic m_sfilePath;2.2 SerialPortDlg.h: 头文件 头文件的其他 变量机函数声明 下面是 串口助手 全部功能的头文件内容 // SerialPortDlg.h: 头文件 //#pragma once#include CCustomButton.h//UINT ComProce(LPVOID pParam);// CSerialPortDlg 对话框 class CSerialPortDlg : public CDialogEx { // 构造 public:CSerialPortDlg(CWnd* pParent nullptr); // 标准构造函数//变量 public://自定义变量HANDLE m_hCom; //串口句柄volatile int m_bConnected; //串口连接成功指示BOOL m_COMStatu; //串口状态指示long m_rxlen; //接收数据个数long m_txlen; //发送数据个数//列表框变量CComboBox m_Combo_Com; //列表框串口CComboBox m_Combo_Baud; //列表框波特率CComboBox m_Combo_Check; //列表框校验位CComboBox m_Combo_Data; //列表框数据位CComboBox m_Combo_Stop; //列表框停止位//字符变量CString m_Str_Com; //字符变量串口CString m_Str_Baud; //字符变量波特率CString m_Str_Check; //字符变量校验位CString m_Str_Data; //字符变量数据位CString m_Str_Stop; //字符变量停止位//函数 public://串口相关函数BOOL InitComm(); //打开串口不创建线程BOOL OpenComm(int Num); //打开串口BOOL SetCommParameter(); //设置串口参数void DisplayStatus(); //显示串口状态void CloseConnection(); //关闭串口//按钮函数afx_msg void OnBnClickedOpencomButton(); //串口状态显示//列表框函数afx_msg void OnCbnSelchangeComboCom(); //更改串口afx_msg void OnCbnSelchangeComboBaud(); //更改波特率afx_msg void OnCbnSelchangeComboCheck(); //更改校验位afx_msg void OnCbnSelchangeComboData(); //更改数据位afx_msg void OnCbnSelchangeComboStop(); //更改停止位// 对话框数据 #ifdef AFX_DESIGN_TIMEenum { IDD IDD_SERIALPORT_DIALOG }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持void OnOK();afx_msg LRESULT OnRecvMsg(WPARAM dwEvent, LPARAM dwLen); // 实现 protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()//函数 public://读缓冲区int ReadBlock(BYTE* abIn, int MaxLength);//串口消息处理BOOL ProcessCOMMNotification(UINT wParam, long lParam); //串口消息处理//打开串口创建工作线程失败BOOL OpenComm2(int Num); //打开串口//打开串口创建工作线程监听线程当有数据到达串口时响应BOOL OpenComm3(int Num); //打开串口//写串口int WriteBlock(char* abOut, int MaxLength); //写串口//字符串转十六进制int String2Hex(CString str, char* SendOut);//转十六进制char ConvertHexData(char ch);//显示当前时间int Current_Time();//发送数据afx_msg void OnBnClickedButtonSend();afx_msg void OnTimer(UINT_PTR nIDEvent);//变量 public://根据代码中报错未定义的变量自己补充的有些类型可能错误CString m_savefilename;// _T(D:\\Projects\\MFC\\SerialPort-2\\test.txt);//十六进制显示和保存到文件控件添加控件变量CButton m_writetofile;CButton m_ctrlHexDisplay;//给IDC_EDIT_RXDATA编辑框添加控件变量和值变量CString m_strRXData;CEdit m_EditRXData;CButton m_cHexSend;OVERLAPPED m_osWrite;OVERLAPPED m_osRead;//发送按钮添加控件变量// 发送数据、文件//CButton m_sendbutten;CCustomButton m_sendbutten;CButton m_transfile;CButton m_emptySendArea;CStatic m_sfilePath;CButton m_emptyReceiveArea;CMFCButton m_button_ComOpenStatus;afx_msg void OnBnClickedButtonCleanSend();afx_msg void OnBnClickedButtonCleanReceive();//发送文件afx_msg void OnBnClickedButtonOpenFile();afx_msg void OnBnClickedButtonSendFile();afx_msg void OnBnClickedButtonClearCount();afx_msg void OnBnClickedCheckSvaeFile();afx_msg void OnBnClickedButtonSavePath(); }; 3 函数实现 #define MAXBLOCK 10243.1 数据发送 //数据发送函数 void CSerialPortDlg::OnBnClickedButtonSend() {// TODO: 在此添加控件通知处理程序代码char abOut[MAXBLOCK];int OutNum, length;if (!m_bConnected){AfxMessageBox(_T(串口未打开));return;}//发送触发后发送、清空按钮 禁用等待发送完毕后恢复可用m_sendbutten.EnableWindow(FALSE);m_transfile.EnableWindow(FALSE);m_emptyReceiveArea.EnableWindow(FALSE);m_emptySendArea.EnableWindow(FALSE);memset(abOut, 0, MAXBLOCK);//判断是否文件写,若是则打开文件并写入缓冲区//读文本框内容CString str;CString strtest;GetDlgItem(IDC_EDIT_TXDATA)-GetWindowText(str);char SendOut[MAXBLOCK];int len str.GetLength();for (int i 0; i len; i){abOut[i] str.GetAt(i);//strtest.Format(_T(%c),abOut[i]);//AfxMessageBox(strtest);}if (m_cHexSend.GetCheck()){CString StrHexData;abOut[len] NULL;StrHexData CString(abOut);len String2Hex(StrHexData, SendOut);length WriteBlock(SendOut, len);}elselength WriteBlock(abOut, len);m_txlen length;if(!length)AfxMessageBox(_T(无数据能写入缓冲区));//发送完毕发送、清空按钮 恢复可用m_sendbutten.EnableWindow(TRUE);m_transfile.EnableWindow(TRUE);m_emptyReceiveArea.EnableWindow(TRUE);m_emptySendArea.EnableWindow(TRUE);DisplayStatus();return; }3.1.2 写数据、字符串转 数据发送中涉及两个函数 WriteBlock、WriteBlock //写串口 int CSerialPortDlg::WriteBlock(char* abOut, int MaxLength) {BOOL JudgeWrite;//写入串行端口数据操作的返回值COMSTAT ComStat;//通信状态缓冲区的指针DWORD dwErrorFlags, dwLength, lentest;//接收错误代码变量的指针,要写的字节数,被写入的字节数的变量地址m_osWrite.Offset 0;ClearCommError(m_hCom, dwErrorFlags, ComStat);//清除串行端口错误或读取串行端口现在的状态//串口句柄接收错误代码变量的指针通信状态缓冲区的指针if (dwErrorFlags 0) //如果接收到错误代码{AfxMessageBox(_T(写串口错请检查参数设置。));PurgeComm(m_hCom, PURGE_TXABORT | PURGE_TXCLEAR); //清空缓冲区return 0;}dwLength MaxLength;//要写的字节数lentest 0;//实际字节数的指针置0JudgeWrite WriteFile(m_hCom, abOut, dwLength, lentest, m_osWrite); //写入串行端口数据//句柄预发送的数据写入的字节数被写入的字节数的变量地址OVERLAPPED结构体指针不使用异步传输设为nullif (!JudgeWrite)//写失败{if (GetLastError() ERROR_IO_PENDING) //重叠 I/O 操作在进行中。{GetOverlappedResult(m_hCom, m_osWrite, lentest, TRUE);//返回重叠操作结果//句柄重叠结构的指针实际字节数的指针TRUE那么只有当操作完成才会返回}elselentest 0;//实际字节数的指针置0}return lentest;//返回字节数的指针 }//字符串转十六进制 int CSerialPortDlg::String2Hex(CString str, char* SendOut) {int hexdata, lowhexdata;int hexdatalen 0;int len str.GetLength();//SendOut.SetSize(len/2);for (int i 0; i len;){char lstr, hstr str[i];if (hstr || hstr \r || hstr \n){i;continue;}i;if (i len)break;lstr str[i];hexdata ConvertHexData(hstr);lowhexdata ConvertHexData(lstr);if ((hexdata 16) || (lowhexdata 16))break;elsehexdata hexdata * 16 lowhexdata;i;SendOut[hexdatalen] (char)hexdata;hexdatalen;}//senddata.SetSize(hexdatalen);return hexdatalen; } 3.2 发送文件 3.2.1 打开文件 //打开文件 void CSerialPortDlg::OnBnClickedButtonOpenFile() {// TODO: 在此添加控件通知处理程序代码// 设置过滤器TCHAR szFilter[] _T(文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||);// 构造打开文件对话框 TRUE创建打开文件对话框CFileDialog fileDlg(TRUE, _T(txt), NULL, 0, szFilter, this);CString strFilePath;// 显示打开文件对话框if (IDOK fileDlg.DoModal()){// 如果点击了文件对话框上的“打开”按钮则将选择的文件路径显示到编辑框里strFilePath fileDlg.GetPathName();SetDlgItemText(IDC_STATIC_FILE_PATH, strFilePath);} }3.2.2 发送文件 //发送文件 void CSerialPortDlg::OnBnClickedButtonSendFile() {// TODO: 在此添加控件通知处理程序代码CString filepath _T(); //文件路径char abOut[MAXBLOCK];int OutNum, length;if (!m_bConnected){AfxMessageBox(_T(串口未打开));return;}else {// 如果串口连接成功串口打开按钮 显示绿色关闭串口m_button_ComOpenStatus.m_bTransparent FALSE;m_button_ComOpenStatus.m_bDontUseWinXPTheme TRUE;//消除黑圈//m_button_ComOpenStatus.m_bDrawFocus FALSE;//消除边框m_button_ComOpenStatus.m_nFlatStyle CMFCButton::BUTTONSTYLE_NOBORDERS;//设置颜色m_button_ComOpenStatus.SetFaceColor(RGB(0, 255, 0), true);//串口打开状态下显示绿色关闭串口m_button_ComOpenStatus.SetWindowTextW(_T(关闭串口));}//发送触发后发送、清空按钮 禁用等待发送完毕后恢复可用m_sendbutten.EnableWindow(FALSE);m_transfile.EnableWindow(FALSE);m_emptyReceiveArea.EnableWindow(FALSE);m_emptySendArea.EnableWindow(FALSE);m_sfilePath.GetWindowText(filepath);memset(abOut, 0, MAXBLOCK);//判断是否文件写,若是则打开文件并写入缓冲区if (!filepath.IsEmpty()){CFile fsendout;CFileException e;fsendout.Open(filepath, CFile::modeRead, e);OutNum fsendout.Read(abOut, MAXBLOCK);while (OutNum)//执行循环后文件已读完。{//如果选择了十六进制发送则转换为字符形式发送出去,否则直接发送字符数组if (m_cHexSend.GetCheck())//十六进制发送复选框选中时{//如果读到的字符中最后有个单独的数据则将读取长度退回一if (abOut[OutNum - 1] || abOut[OutNum - 1] \r\n)OutNum--;if (!OutNum){AfxMessageBox(_T(读十六进制文件出错请检查格式));return;}//将十六进制字符串转换为CString类,为十六进制转换成字符的函数作准备CString StrHexData;abOut[OutNum] NULL;StrHexData CString(abOut);char SendOut[MAXBLOCK];int len String2Hex(StrHexData, SendOut);length WriteBlock(SendOut, len);}elselength WriteBlock(abOut, OutNum);m_txlen OutNum;OutNum fsendout.Read(abOut, MAXBLOCK);//准备下一次循环//continue;}//while(OutNum)fsendout.Close();if (!length){AfxMessageBox(_T(已写完));m_sendbutten.EnableWindow(TRUE);//发送完毕发送、清空按钮 恢复可用m_sendbutten.EnableWindow(TRUE);m_transfile.EnableWindow(TRUE);m_emptyReceiveArea.EnableWindow(TRUE);m_emptySendArea.EnableWindow(TRUE);DisplayStatus();return;}}//发送完毕发送、清空按钮 恢复可用m_sendbutten.EnableWindow(TRUE);m_transfile.EnableWindow(TRUE);m_emptyReceiveArea.EnableWindow(TRUE);m_emptySendArea.EnableWindow(TRUE);DisplayStatus();return; } 3.3 清空发送区 最简单的方法直接让你编辑框里的内容置为空 void CSerialPortDlg::OnBnClickedButtonCleanSend() {// TODO: 在此添加控件通知处理程序代码//GetDlgItem(IDC_EDIT_TXDATA)-SetWindowText(_T()); //获取端口对话框的句柄并清除SetDlgItemText(IDC_EDIT_TXDATA,_T()); //获取端口对话框的句柄并清除 }或者给编辑框添加一个控件变量 m_strTXData.Empty();m_EditTXData.SetWindowText(m_strRXData);4 完整MFC项目项下载
http://www.zqtcl.cn/news/235461/

相关文章:

  • 上海闸北城市建设有限公司网站想学设计没有基础怎么办
  • 免费微网站哪个好用在线网页代理浏览免费
  • 广州建设专业网站寻找做项目的网站
  • 湛江网站建设方案服务卖wordpress主题
  • 扬州做网站的网络公司wordpress设置登录背景图片
  • 有哪些好的网站建设移动网站建设解决方案
  • 江苏网站建设公司排名高校门户网站建设问题
  • 网站怎么加关键词视频网站程序
  • 建设网站需要的人员及资金建设一个网站的具体流程
  • 北京长空建设有限公司网站网站开发制作培训学校
  • 哪些网站可以免费做推广呢o2o营销模式
  • 注册网站的流程南京今天的最新消息
  • 做网站的没有进项票怎么办张家口市一建公司官网
  • 建设网站的本质智慧团建手机版
  • 嘉兴网站建设有前途吗沈阳男科医院排名10强名单公布
  • 手机网站变灰17种新型商业模式
  • 图书网站开发需求文档模板做网站现在用什么语言
  • 创建网站主题在哪里接单赚钱平台
  • 企业做网站的流程权威发布新闻的含义
  • 国外大型购物网站桂林视频网站制作
  • 平度那里有做网站的网站设计技术入股
  • 张家港专业做网站网站设计与建设ppt
  • 香奈儿网站设计分析网站建设新闻发布注意事项
  • 建设网站策划南京网站开发建设
  • 哪些网站可以做任务挣钱如何查询企业电话号码
  • 福田网站 建设深圳信科手机 网站制作
  • 网站站内优化方案佛山外贸网站建设哪家好
  • 厦门市网站建设局平台网站如何优化
  • 电子书网站用dz还是wordpresswordpress搭建购物网站
  • 广西住房和城乡建设培训中心网站吴江住房和城乡建设部网站