久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2936|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MFC串口的編程 mscomm控件與SerialPort類

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104287 發(fā)表于 2016-1-31 00:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    MFC制作上位機(jī),首先需要了解的是串口的編程,一般有兩種方法,一個(gè)是使用ActiveX控件,例如mscomm串口控件,還有一個(gè)是用SerialPort類或者一些其他的串口類,這兩個(gè)的區(qū)別是使用SerialPort類不需要注冊(cè)控件,在其他沒(méi)有安裝控件的電腦上也能夠用。
一·使用mscomm串口控件
使用mscomm串口控件的方法網(wǎng)上一大堆,大致說(shuō)一些方法和一些需要注意的地方。如果是使用VC6.0在WIN7上來(lái)編寫就會(huì)有個(gè)問(wèn)題會(huì)通常說(shuō)添加控件的方法為選中項(xiàng)目à“工程”à“添加到工程”à“Components and Controls”à“Microsoft Communications Control”這樣添加會(huì)出錯(cuò),提示為不支持此接口,這是因?yàn)榇塑浖赪in7上面不兼容,解決辦法是直接在工程界面上右擊à“插入ActiveX控件”然后選擇相關(guān)的控件,然后給用建立類向?qū)Вo控件添加變量名,控件相關(guān)的類會(huì)自動(dòng)添加,然后就可以用了。這個(gè)控件類在但是這個(gè)在VS2008以上版本也是一樣的,對(duì)于有多種類的控件就不一樣了。
然后右擊控件添加事件,這是事件就是收到串口數(shù)據(jù)的處理函數(shù),接下來(lái)就初始化串口就可。
二·使用SerialPort
         SerialPort類是開(kāi)源的,使用起來(lái)也方便,下面是復(fù)制的其他人的教程:
1       建立程序框架工程
1、在VC6.0開(kāi)發(fā)環(huán)境中,新建基于對(duì)話框的MFC應(yīng)用程序名為exp,并添加主要控件,更改控件ID。
2、用Class Wizard為相應(yīng)控件添加變量。主要添加的變量為顯示類型的,如編輯框、組合框等。
3.添加類文件。下載或者拷貝類文件serialport.h和serialport.cpp復(fù)制到工程所在的文件夾下,然后點(diǎn)擊VC6.0菜單Project->Add to Project->Files…,選擇serialport.h和serialport.cpp點(diǎn)擊OK,就把類文件加入了當(dāng)前工程。
4.在FileView中打開(kāi)expDlg.h,將頭文件說(shuō)明,即加入#include "SerialPort.h",這樣就加入了CSerialPort類。通過(guò)CSerialPort類完成串口操作。
5. 在主對(duì)話框頭文件expDlg.h中定義CserialPort類對(duì)象,如果只操作一個(gè)類對(duì)象,就只定義一個(gè)類對(duì)象。
public:
         CSerialPort m_SerialPort; //CSerailPort類對(duì)象
         BOOL  m_bSerialPortOpened; //標(biāo)志串口是否打開(kāi)
         若要操作多個(gè)串口則要為每個(gè)串口定義一個(gè)類對(duì)象,這個(gè)可以通過(guò)數(shù)組方式來(lái)定義,這里定義的類對(duì)象為m_SerialPort,再定義一個(gè)布爾變量用來(lái)標(biāo)志串口是否打開(kāi),如上。
2       添加消息響應(yīng)(添加3處地方)
2.1   在頭文件expDlg.h中添加消息響應(yīng)函數(shù)的聲明
在CSerialPort類中有多個(gè)串口事件可以響應(yīng),在一般串口編程中,只需要處理WM_COMM_RXCHAR消息就可以了,該類所有的消息均需要人工添加消息處理函數(shù)。將處理函數(shù)名定義為OnComm(),首先在expDlg.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收緩沖區(qū)內(nèi)有一個(gè)字符)的響應(yīng)函數(shù)聲明:
protected:
         HICON m_hIcon;
         // Generated message map functions
         //{{AFX_MSG(CExp2Dlg)
…… ……
         afx_msg LONG OnComm(WPARAM ch, LPARAM port); //只需添加這一行
         //}}AFX_MSG
2.2   在expDlg.cpp文件中進(jìn)行WM_COMM_RXCHAR消息映射:
BEGIN_MESSAGE_MAP(CExp2Dlg, CDialog)
         //{{AFX_MSG_MAP(CExp2Dlg)
…… ……
         ON_MESSAGE(WM_COMM_RXCHAR, OnComm) //只需添加這一行
         //}}AFX_MSG_MAP
END_MESSAGE_MAP()
2.3   接收數(shù)據(jù)  的消息處理函數(shù)。手動(dòng)輸入:接著在expDlg.cpp文件中手動(dòng)輸入函數(shù)OnComm()的實(shí)現(xiàn)(注意:這里不添加按鈕,而是直接  手動(dòng)輸入  整個(gè)函數(shù)體。。。。
并在其中完成對(duì)接收到的字符的處理,將接收到的字符顯示在接收編輯框中:
LONG CExp2Dlg::OnComm(WPARAM ch, LPARAM port)
{
         m_strEditReceiveMsg += ch;
         UpdateData(FALSE);  //將接收到的字符顯示在接收編輯框中
         return 0;
}
3       串口操作函數(shù)
3.1   打開(kāi)串口和關(guān)閉串口(必須先打開(kāi)串口,才能發(fā)送數(shù)據(jù),否則發(fā)生內(nèi)存地址寫的錯(cuò)誤。
為按鈕添加單擊響應(yīng)函數(shù),分別為“打開(kāi)串口”按鈕添加OnButtonOpen(),為“關(guān)閉串口”按鈕添加OnButtonClose(),并在OnButtonOpen()中進(jìn)行初始設(shè)置:
void CExp2Dlg::OnButtonOpen()
{
         // TODO: Add your control notification handler code here
         int nPort=1; //選擇串口COM1
         if(ChuankouDX.InitPort(this, nPort, 9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512))
         {
                   ChuankouDX.StartMonitoring();
                   m_bSerialPortOpened=TRUE;
         }
         else
         {
                   AfxMessageBox("沒(méi)有發(fā)現(xiàn)此串口或被占用");
                   m_bSerialPortOpened=FALSE;
         }}
void CExp2Dlg::OnButtonClose()
{
       // TODO: Add your control notification handler code here
         ChuankouDX.ClosePort();//關(guān)閉串口  
    m_bSerialPortOpened=FALSE;
3.2   發(fā)送數(shù)據(jù)
為“發(fā)送”按鈕添加OnButtonSend()。
void CExp2Dlg::OnButtonSend()
{
         // TODO: Add your control notification handler code here
         if(!m_bSerialPortOpened)
         return; //檢查串口是否打開(kāi)
         char buf[100];
         memset(&buf, 0, sizeof(buf));
         GetDlgItemText(IDC_send, buf, sizeof(buf));
         if (strcmp("NOT FOUND", buf) == 0)
                   return;
         ChuankouDX.WriteToPort(buf);       //發(fā)送數(shù)據(jù)
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线国产视频 | 成人在线一区二区 | 亚洲一区中文字幕 | 超碰操| 国产精品福利久久久 | 久久aⅴ乱码一区二区三区 91综合网 | 成人污污视频 | 国产精品一区二区三区在线 | 黄色片网此| 欧美成人第一页 | 亚洲一区有码 | 久久精品一区二区三区四区 | 久久合久久 | 天堂一区在线 | 日韩一区二区三区在线 | 五月槐花香 | 亚洲狠狠丁香婷婷综合久久久 | 51ⅴ精品国产91久久久久久 | 亚洲 欧美 日韩 精品 | 青青草网站在线观看 | 伦理一区二区 | 精品视频一二区 | 欧美极品在线观看 | 国产精品久久久久久久久久久久冷 | 亚洲视频免费一区 | 国产激情网 | 亚洲欧美视频在线观看 | 亚洲免费影院 | 一级做a爰片性色毛片16 | 久久久久久久久久久久91 | 亚洲一区二区在线播放 | 亚洲精品欧美精品 | 七七婷婷婷婷精品国产 | 久久国产精品久久久久久 | 亚洲天堂一区二区 | 亚洲 欧美 另类 综合 偷拍 | 亚洲先锋影音 | 久久国产婷婷国产香蕉 | 久久久一区二区三区 | 日本午夜精品一区二区三区 | 久久精品小短片 |