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

钦州建设银行社招聘网站十堰微网站建设

钦州建设银行社招聘网站,十堰微网站建设,同仁行业网站建设报价,广州站是广州火车站吗目录 1、SerialPort类的介绍和使用#xff1a; #xff08;1#xff09;、SerialPort类的功能介绍 #xff08;2#xff09;、SerialPort类提供接口函数的介绍 1#xff09;、InitPort函数 2#xff09;、控制串口监视线程函数 3#xff09;、获取事件#xff0c… 目录 1、SerialPort类的介绍和使用 1、SerialPort类的功能介绍 2、SerialPort类提供接口函数的介绍 1、InitPort函数 2、控制串口监视线程函数 3、获取事件写缓冲大小获取DCB的接口函数 4、写数据到串口接口函数 5、错误处理接口函数 6、线程接口函数 7、接收字符和字符串接口函数 8、对接手的数据进行处理函数 3、对于这些接口函数的使用 2、设计串口通信 1、UI设计 2、添加变量 3、程序设计 1、初始化下拉框 2、打开串口点击事件 3、发送信息点击事件 4、发送清空显示功能实现 5、勾选框功能的添加 6、保存文件功能实现 7、实现饮水机的读取温度功能 1、SerialPort类的介绍和使用 1、SerialPort类的功能介绍 SerialPort类封装了串口的基本上操作包括打开串口传递串口参数控制串口监视线程获取写缓冲事件获取事件获取DCB写数据到串口从串口读数据判断串口是否打开关闭串口线程处理等功能 2、SerialPort类提供接口函数的介绍 1、InitPort函数 串口连接首先要打开串口建立串口通讯协议也就是确定串口号波特率数据位校验位和停止位。InitPort函数实现的就是串口的打开和串口设置的初始化。 函数原型 BOOL        InitPort(HWND pPortOwner, UINT portnr 1, UINT baud 9600,             TCHAR parity _T(N), UINT databits 8, UINT stopsbits ONESTOPBIT,             DWORD dwCommEvents EV_RXCHAR | EV_CTS, UINT nBufferSize 512,             DWORD ReadIntervalTimeout 1000,             DWORD ReadTotalTimeoutMultiplier 1000,             DWORD ReadTotalTimeoutConstant 1000,             DWORD WriteTotalTimeoutMultiplier 1000,             DWORD WriteTotalTimeoutConstant 1000); BOOL CSerialPort::InitPort(HWND pPortOwner,    // 接收消息的当前对话框默认只有一个句柄     UINT  portnr,        // portnumber (串口号可以有1-100个串口号这里数字不代表串口号)     UINT  baud,            // baudrate波特率数据每秒传输的位数波特率大不代表准确     TCHAR  parity,        // parity 校验位用于错误检查的一种数据通常与数据位和停止位一起传输表示一个完整的数据块     UINT  databits,        // databits 二进制位用于表示传输的原始数据     UINT  stopbits,        // stopbits 数据传输结束后发送的最后一位数通常位1或者0     DWORD dwCommEvents,    // EV_RXCHAR有字符可读取, EV_CTS etc清除发送这俩标志位按照按位与和或可以检测多种事件。串口通信时需要监测的事件类型     UINT  writebuffersize,// size to the writebuffern表示缓冲区的大小不能太小防止数据丢失     DWORD   ReadIntervalTimeout,DWORD4个字节的无符号整数     DWORD   ReadTotalTimeoutMultiplier,     DWORD   ReadTotalTimeoutConstant,上面三个DWORD值代表读操作的超时时间     DWORD   WriteTotalTimeoutMultiplier,     DWORD   WriteTotalTimeoutConstant)上面俩个DWORD值代表写操作的超时时间 2、控制串口监视线程函数 BOOL         StartMonitoring();//开始监听         BOOL         ResumeMonitoring();//恢复监听         BOOL         SuspendMonitoring();//挂起监听         BOOL         IsThreadSuspend(HANDLE hThread);//判断线程是否挂起 //add by itas109 2016-06-29 3、获取事件写缓冲大小获取DCB的接口函数 DWORD         GetWriteBufferSize();///获取写缓冲大小         DWORD         GetCommEvents();///获取事件         DCB             GetDCB();///获取DCB 4、写数据到串口接口函数 void        WriteToPort(char* string, size_t n); //重载写字符串二进制         void        WriteToPort(PBYTE Buffer, size_t n);// 重载写16进制         void        ClosePort();              //关闭串口         BOOL        IsOpened();          //判断串口是否打开 5、错误处理接口函数 void        ProcessErrorMessage(TCHAR* ErrorText);///错误处理 6、线程接口函数 static DWORD WINAPI CommThread(LPVOID pParam);///线程函数 LPVOID相当于是一个VOID传递一个VOID类型的指针在线程中不断的读取串口数据 7、接收字符和字符串接口函数 static void ReceiveStr(CSerialPort* port); //接收单个字符。 WriteChar(CSerialPort* port);//接收字符串\0结尾。 8、对接手的数据进行处理函数 virtual int HandleReadData(uint8_t *pMsgBuf, uint32_t iSize) 0;// 对接收到的数据进行响应处理 重写纯虚函数来实现数据处理 3、对于这些接口函数的使用 由于SerialPort以及封装好了底层操作首先InItPort函数也就是传递串口设置和对话框的句柄其次就可以进行写入串口操作WriteToPort和数据处理重写纯虚函数HandleReadData。 2、设计串口通信 1、UI设计 创建工程选择MFC对话框然后添加控件 2、添加变量 3、程序设计 1、初始化下拉框 在框架类的CPP中自定义函数MycommInit来初始化下拉列表 在OnInitDialog中被调用初始化。这个初始化仅仅是一个UI上的初始化。 2、打开串口点击事件 打开串口的点击事件首先需要根据SerialPort的打开串口接口函数进行串口属性的初始化真正的属性初始化和打开串口操作同时设置了一个picture control更改属性加载BTM的图片根据串口打开和关闭改变颜色。 先判断什么时候需要进行串口的初始化 UpdateData(TRUE);  //将控件中的内容同步到变量中我们操作控件就相当于操作变量。     CString strOpen; //strOpen来获得按钮上面的文字内容。     GetDlgItemText(IDC_BUTTON_OPEN, strOpen);        if (strOpen 打开串口) //点击按钮事件点击的是打开串口     {         进行一些操作     } 波特率 /*增加波特率的代码复用性*/             const TCHAR* buffer1 m_strbaut.GetBuffer();  // 获取 CString 对象内部字符数组的指针             UINT m_mystrbaut _ttoi(buffer1);  // 使用 _ttoi() 或其他适当的转换函数将字符串转换为 UINT 类型             m_strbaut.ReleaseBuffer();  // 释放 CString 对象的缓冲区 串口号 /*增加串口号的代码复用性*/             const TCHAR* buffer2 m_strcomm.GetBuffer();  // 获取 CString 对象内部字符数组的指针             int index m_strcomm.FindOneOf(_T(0123456789));  // 查找第一个数字字符的索引             CString numericPart m_strcomm.Mid(index);  // 提取从第一个数字字符开始的子字符串             unsigned long ulValue _tcstoul(numericPart, nullptr, 10);  // 将提取的子字符串转换为 unsigned long 类型             UINT m_mystrcomm static_castUINT(ulValue);  // 将 unsigned long 类型的值转换为 UINT 类型             m_strcomm.ReleaseBuffer(); // 释放 CString 对象的缓冲区 // 现在m_mystrcomm 变量中存储了转换后的 UINT 数值 校验位 /*增加校验位的代码复用性*/             CString strcheck getCheck();             const TCHAR* buffer strcheck.GetBuffer(); // 获取 CString 对象内部字符数组的指针             TCHAR m_mycbcheck buffer[0]; // 获取第一个字符             strcheck.ReleaseBuffer(); // 释放 CString 对象的缓冲区 停止位 /*/*增加停止位的代码复用性*/             const TCHAR* buffer3 m_strstop.GetBuffer(); // 获取 CString 对象内部字符数组的指针             UINT m_mystrstop _ttoi(buffer3); // 使用 _ttoi() 或其他适当的转换函数将字符串转换为 UINT 类型             if (m_mystrstop 1)                 m_mystrstop 0;             m_strstop.ReleaseBuffer(); // 释放 CString 对象的缓冲区 真正打开串口 //初始化串口    m_myserialport.InitPort ( m_hWnd, m_mystrcomm, m_mystrbaut, m_mycbcheck, 8, m_mystrstop );   m_myserialport.StartMonitoring();//开始监听 异常捕获上面的打开串口 try{打开串口操作} catch (CException* e)         {             MessageBox(L端口不存在, L打开串口, MB_ICONERROR);             return;         } 加载自己的位图 CBitmap bitmap;  // CBitmap对象用于加载位图             HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄            bitmap.LoadBitmap(IDB_BITMAP_GREEN);  // 将位图IDB_BITMAP1加载到bitmap            hBmp (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄            m_PictureContol.SetBitmap(hBmp);    // 设置图片控件m_picIndicator的位图图片为IDB_BITMAP_GREEN  打开串口操作之后打开串口变成关闭串口并且位图也要变化 else // 4、此时串口已经处于打开状态 执行关闭串口     {             m_myserialport.SuspendMonitoring();         m_myserialport.ClosePort();                  SetDlgItemText(IDC_BUTTON_OPEN, _T(打开串口)); //串口打开之后设置按钮为“关闭”         CBitmap bitmap;  // CBitmap对象用于加载位图             HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄            bitmap.LoadBitmap(IDB_BITMAP_RED);  // 将位图IDB_BITMAP1加载到bitmap            hBmp (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄            m_PictureContol.SetBitmap(hBmp);    // 设置图片控件m_picIndicator的位图图片为IDB_BITMAP_RED      } 3、发送信息点击事件 点击发送按钮在EDIT中发送信息 先进性一个判断如果串口没有打开就提示弹框获取我们打开串口上面的文字内容进行判断。 CString strOpen;//strOpen来获得按钮上面的文字内容。 GetDlgItemText(IDC_BUTTON_OPEN, strOpen); if (strOpen 打开串口)     {         MessageBox(L串口未打开, L串口问题, MB_ICONERROR);         return;     } 然后就可以进行发送消息的处理首先是发送二十六进制数据 首先定义一个BYTE类型的数组存放数据把EDIT上的内容同步到str上 BYTE *data new BYTE[m_strReceive.GetLength()];//自定义接收十六进制的数组                 int rlen 0;                 CString str;                 str m_strReceive; 自定以一个处理函数来处理数据先转成十进制再利用十进制转成16进制的整形存放再数组中 rlen Str2Hex(str, data); //自定义函数Str2Hex函数处理十进制转换成16进制存放在data数组中 int Str2Hex(CString str, BYTE *data) {     int t, t1;     int rlen 0, len str.GetLength();     if (len 1)     {         char h str[0];         t HexChar(h);         data[0] (BYTE)t;         rlen;     }     for (int i 0; i len;)     {         char l, h str[i];         if (h )         {             i;             continue;         }         i;         if (i len)             break;         l str[i];         t HexChar(h);         t1 HexChar(l);         if ((t 16) || (t1 16))         break;         else         t t * 16 t1;         i;         data[rlen] (BYTE)t;         rlen;     }     return rlen; } rlen Str2Hex(str, data); 上面的函数需要先调用HexChar把字符数字转成十进制对应的数字 //自定义函数HexChar处理十六进制十六进制转成10进制 char HexChar(char c) {     if ((c 0) (c 9))         return c - 0;//16进制中的字符0-9转化成10进制还是0-9     else if ((c A) (c F))         return c - A 10;//16进制中的A-F分别对应着11-16     else if ((c a) (c f))         return c - a 10;//16进制中的a-f分别对应也是11-16不区分大小写     else         return 0x10;   // 其他返回0x10 } 利用WriteToPort函数接口第二个重载可以发送十六进制直接传递参数 m_myserialport.WriteToPort(data, rlen);       delete[]data;       data NULL;//释放空间 如果发送的是二进制数据可以直接调用WriteToPort函数 else             {                 CString cstr;                 cstr m_strReceive;                 CStringA cstrA;                 cstrA cstr; //CString类型转成char *类型才能传入参数                 m_myserialport.WriteToPort(cstrA.GetBuffer(), cstr.GetLength());             } 4、发送清空显示功能实现 void CMyChillerDlg::OnBnClickedButtonReceiveclear() {     // TODO: 在此添加控件通知处理程序代码     SetDlgItemText(IDC_EDIT1, L );     UpdateData(TRUE); } 5、勾选框功能的添加 当选中十六进制发送的时候把原来EDIT上的文本直接转成十六进制 获取EDIT中的内容然后格式化内容 wchar_t *p m_strReceive.GetBuffer(m_strReceive.GetLength());  m_strReceive.ReleaseBuffer(); 遍历每一个字符都格式化成16进制 CString str L;         int length m_strSend.GetLength();         for (int i 0; i length; i)         {             CStringW strTemp;             strTemp.Format(L%02X, p[i]);             str str strTemp L ;         }         m_strSend str.TrimRight(L ); 没有勾选勾选框的情况下默认二进制 else    //此时要把十六进制转换成字符格式     {         int length m_strSend.GetLength();         CString str;         for (int i 0; i length; i 3)         {             CStringW strTemp m_strSend.Mid(i, 2);             wchar_t *p strTemp.GetBuffer(2);             int num wcstol(p, NULL, 16);             strTemp.Format(L%c, num);             str str strTemp;         }         m_strSend str;     }     UpdateData(FALSE); 6、保存文件功能实现 UpdateData(TRUE); TCHAR szFilter[] _T(文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||); // 设置过滤器       CFileDialog fileDlg(FALSE, _T(doc), _T(InitFileName), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);// 构造保存文件对话框        CString strFilePath;     // 显示保存文件对话框        if (IDOK fileDlg.DoModal())     {         strFilePath fileDlg.GetPathName();         //MessageBox(strFilePath);            CFile file;      // CFile对象         if (file.Open(strFilePath, CFile::modeCreate | CFile::modeReadWrite))         {             TCHAR *p m_strreceive.GetBuffer(m_strreceive.GetLength());             file.Write(p, m_strreceive.GetLength());             file.Close();         }     } 7、打开文件功能实现 m_strSend L;     TCHAR szFilter[] _T(文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||);// 设置过滤器        CFileDialog fileDlg(TRUE, _T(txt), NULL, 0, szFilter, this);// 构造打开文件对话框        CString strFilePath;     if (IDOK fileDlg.DoModal())// 显示打开文件对话框       {         strFilePath fileDlg.GetPathName();   // 如果点击了文件对话框上的“打开”按钮则将选择的文件路径显示到编辑框里                                                //MessageBox(strFilePath);           CFile file;      // CFile对象         char readBuffer[2048];         if (file.Open(strFilePath, CFile::modeRead))         {             int nRet file.Read(readBuffer, 2048);             for (int i 0; i nRet; i)             {                 CString str;                 str.Format(L%c, readBuffer[i]);                 m_strSend str;             }         }         UpdateData(FALSE);     } 7、实现饮水机的读取温度功能 对话框中的通信类的实例化对象调用通讯类的函数自动发送读取温度的十六进制 UpdateData(TRUE);     CString strOpen;//strOpen来获得按钮上面的文字内容。     GetDlgItemText(IDC_BUTTON_OPEN, strOpen);     if (strOpen 打开串口)     {         MessageBox(L串口未打开, L串口问题, MB_ICONERROR);         return;     }     else     {         double temp 0.0;         m_myserialport.ReadTemp(temp);//调用读取温度的函数发送特定的十六进制。     } 通讯类发送温度ReadTemp函数 m_bReciveFlag false;     //发送读取指令     BYTE buffer[] {0XFE,0X03,0X00,0X2D,0X00,0X01,0X00,0X0C};     int lenth 8;     WriteToPort(buffer,lenth);          // 等待水冷机返回内容     int iTimeOut 5000;   // 5s超时     while (iTimeOut 0)     {         if (m_bReciveFlag)         {             drefTemp m_dTemp;             return true;         }         iTimeOut - 50;         Sleep(50);     } 通过勾选框十六进制读取温度的勾选来解析收到的十六进制 bool m_bReciveFlag true;  // 接收到内容标志                       CString strHex;         for (uint32_t i 0; i iSize; i)         {             CString hexValue;             hexValue.Format(_T(%02X ), pMsgBuf[i]); // 将每个字节转换为两位十六进制数             strHex hexValue;         }                  // 获取第5和第6个字节的十六进制字符串         // 获取第 4 和第 5 个字节的十六进制字符串         CString hexSubstring2 strHex.Mid(9, 5); // 假设第 4 和第 5 个字节对应的十六进制数在字符串中的位置为 6~9         hexSubstring2.Remove( );//去掉空格否则是1遇到空格之间阻断。         // 将十六进制字符串转换为十进制数         unsigned long decimalNumber _tcstoul(hexSubstring2, NULL, 16);          decimalFloat static_castdouble(decimalNumber) / 10.0;         CString decimalString;         decimalString.Format(_T(%.1f), decimalFloat);                  // 将十进制数转换为字符串         // 使用 运算符         decimalString _T(℃);         // 将结果输出到EDIT控件上         // 假设EDIT控件的ID为IDC_EDIT_RESULT          pEdit GetDlgItem(IDC_EDIT1);         if (pEdit ! NULL)         {             pEdit-SetWindowText(decimalString);                      }         return m_bReciveFlag;
文章转载自:
http://www.morning.gygfx.cn.gov.cn.gygfx.cn
http://www.morning.rnwt.cn.gov.cn.rnwt.cn
http://www.morning.tdscl.cn.gov.cn.tdscl.cn
http://www.morning.kjrlp.cn.gov.cn.kjrlp.cn
http://www.morning.rmfw.cn.gov.cn.rmfw.cn
http://www.morning.rszbj.cn.gov.cn.rszbj.cn
http://www.morning.dbrdg.cn.gov.cn.dbrdg.cn
http://www.morning.glncb.cn.gov.cn.glncb.cn
http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn
http://www.morning.qyjqj.cn.gov.cn.qyjqj.cn
http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn
http://www.morning.qyxnf.cn.gov.cn.qyxnf.cn
http://www.morning.tqpds.cn.gov.cn.tqpds.cn
http://www.morning.lzqxb.cn.gov.cn.lzqxb.cn
http://www.morning.cgmzt.cn.gov.cn.cgmzt.cn
http://www.morning.yksf.cn.gov.cn.yksf.cn
http://www.morning.gpnfg.cn.gov.cn.gpnfg.cn
http://www.morning.wjlkz.cn.gov.cn.wjlkz.cn
http://www.morning.qgmwt.cn.gov.cn.qgmwt.cn
http://www.morning.xldpm.cn.gov.cn.xldpm.cn
http://www.morning.mjbjq.cn.gov.cn.mjbjq.cn
http://www.morning.bloao.com.gov.cn.bloao.com
http://www.morning.fgkrh.cn.gov.cn.fgkrh.cn
http://www.morning.bpmfr.cn.gov.cn.bpmfr.cn
http://www.morning.xwlhc.cn.gov.cn.xwlhc.cn
http://www.morning.zrpbf.cn.gov.cn.zrpbf.cn
http://www.morning.dsncg.cn.gov.cn.dsncg.cn
http://www.morning.kyfrl.cn.gov.cn.kyfrl.cn
http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn
http://www.morning.qphgp.cn.gov.cn.qphgp.cn
http://www.morning.jjrsk.cn.gov.cn.jjrsk.cn
http://www.morning.xqjh.cn.gov.cn.xqjh.cn
http://www.morning.wztnh.cn.gov.cn.wztnh.cn
http://www.morning.khpgd.cn.gov.cn.khpgd.cn
http://www.morning.fzwf.cn.gov.cn.fzwf.cn
http://www.morning.rgnp.cn.gov.cn.rgnp.cn
http://www.morning.wcjgg.cn.gov.cn.wcjgg.cn
http://www.morning.mqbdb.cn.gov.cn.mqbdb.cn
http://www.morning.dkslm.cn.gov.cn.dkslm.cn
http://www.morning.xnzmc.cn.gov.cn.xnzmc.cn
http://www.morning.lkxzb.cn.gov.cn.lkxzb.cn
http://www.morning.pghfy.cn.gov.cn.pghfy.cn
http://www.morning.lkfhk.cn.gov.cn.lkfhk.cn
http://www.morning.jyknk.cn.gov.cn.jyknk.cn
http://www.morning.wdskl.cn.gov.cn.wdskl.cn
http://www.morning.gpxbc.cn.gov.cn.gpxbc.cn
http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn
http://www.morning.xkjrq.cn.gov.cn.xkjrq.cn
http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn
http://www.morning.kxymr.cn.gov.cn.kxymr.cn
http://www.morning.mmsf.cn.gov.cn.mmsf.cn
http://www.morning.rrwft.cn.gov.cn.rrwft.cn
http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn
http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn
http://www.morning.mymz.cn.gov.cn.mymz.cn
http://www.morning.ftmly.cn.gov.cn.ftmly.cn
http://www.morning.wjfzp.cn.gov.cn.wjfzp.cn
http://www.morning.yfstt.cn.gov.cn.yfstt.cn
http://www.morning.c7630.cn.gov.cn.c7630.cn
http://www.morning.krrjb.cn.gov.cn.krrjb.cn
http://www.morning.mbdbe.cn.gov.cn.mbdbe.cn
http://www.morning.mqxzh.cn.gov.cn.mqxzh.cn
http://www.morning.wcft.cn.gov.cn.wcft.cn
http://www.morning.kdjtt.cn.gov.cn.kdjtt.cn
http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn
http://www.morning.bprsd.cn.gov.cn.bprsd.cn
http://www.morning.qlhwy.cn.gov.cn.qlhwy.cn
http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn
http://www.morning.trnl.cn.gov.cn.trnl.cn
http://www.morning.wrcgy.cn.gov.cn.wrcgy.cn
http://www.morning.sgwr.cn.gov.cn.sgwr.cn
http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn
http://www.morning.ldsgm.cn.gov.cn.ldsgm.cn
http://www.morning.bgdk.cn.gov.cn.bgdk.cn
http://www.morning.jhwqp.cn.gov.cn.jhwqp.cn
http://www.morning.lgqdl.cn.gov.cn.lgqdl.cn
http://www.morning.ymqrc.cn.gov.cn.ymqrc.cn
http://www.morning.blznh.cn.gov.cn.blznh.cn
http://www.morning.jzlfq.cn.gov.cn.jzlfq.cn
http://www.morning.xlyt.cn.gov.cn.xlyt.cn
http://www.tj-hxxt.cn/news/273840.html

相关文章:

  • 邵阳做网站的公司建设银行网站打不开 显示停止工作
  • 建设信用卡积分商城网站next wordpress
  • 泉州建设局网站可作外链的网站
  • 网站建设没有业务怎么办长春微信网站建设
  • 网站建设淄博佳铉网络宝安网站建设公司968
  • 怎么做像表白墙的网站微信官方网站服务中心
  • 建站之星快速建站价格建造师注册信息查询网
  • 做公司网站首页上海网站搭建公司
  • 网站设计 工作浪尖工业设计公司
  • 一个vps建两个网站怎么弄数据库wordpress说明类主题
  • 网站底部导航栏怎么做做外贸哪个网站最好
  • 六安做网站视频素材网免费
  • 网站关键词排名外包docker wordpress 80
  • 建立自己的网站平台须多少钱网站建设网站软件
  • 张家口网站设计网站 设计 案例 简单
  • 网站的信息管理建设的必要性重庆建设工程信息网官网官方
  • 站长数据男女做污污的网站
  • 移动网上长沙关键词优化服务
  • 网站优化包括整站优化吗渠道网络推广
  • 北京网站制作官网如何做好seo基础优化
  • wordpress博客怎么设置主题专业seo优化公司
  • 网站被入侵外贸推广平台有哪几个
  • 马鞍山建设局网站公司企业宣传片
  • 网站建设规划书有哪些内容17.zwd一起做网站池尾站
  • 物流公司网站建设 能跟踪物流线上投票链接制作
  • 灰色网站怎么做seo微信网站建设教程
  • 阿里巴巴的网站应该怎么做广东网站建设968
  • 网站开发结语建设工程现行标准查询网站
  • 工作一般做网站视频的工作叫做什么自己做的小网站分享
  • 苍南网站制作黑河做网站公司