51單片機是對所有兼容Intel 8031指令系統(tǒng)的單片機的統(tǒng)稱。該系列單片機的始祖是Intel的8004單片機,后來隨著Flash rom技術的發(fā)展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用于工業(yè)測控系統(tǒng)之中。很多公司都有51系列的兼容機型推出,今后很長的一段時間內(nèi)將占有大量市場。51單片機是基礎入門的一個單片機,還是應用最廣泛的一種。需要注意的是51系列的單片機一般不具備自編程能力。
一、 pc機上的 串口通信編程過程如下:
1.建立項目
打開VC++6.0,建立一個基于對話框的MFC應用程序SCommTest(與我源代碼一致,等會你會方便一點);
2.在項目中插入MSComm控件
選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話框中雙擊Registered ActiveX Controls項(稍等一會,這個過程較慢),則所有注冊過的ActiveX控件出現(xiàn)在列表框中。 選擇Microsoft Communications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受缺省的選項。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安裝VC6時沒有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),
這時在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構clw文件也一樣),并且在控件工具欄Controls中出現(xiàn)了電話圖標(如圖1所示),現(xiàn)在要做的是用鼠標將此圖標拖到對話框中,程序運行后,這個圖標是看不到的。
3.利用ClassWizard定義CMSComm類控制對象
打開ClassWizard-》Member Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了//{{AFX_INCLUDES() #include “mscomm.h” //}}AFX_INCLUDES (這時運行程序,如果有錯,那就再從頭開始)。
4.在對話框中添加控件
向主對話框中添加兩個編輯框,一個用于接收顯示數(shù)據(jù)ID為IDC_EDIT_RXDATA,另一個用于輸入發(fā)送數(shù)據(jù),ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發(fā)送編輯框中的內(nèi)容發(fā)送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties-》Styles中把Miltiline和Vertical Scroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltiline。
再打開ClassWizard-》Member Viariables選項卡,選擇CSCommTestDlg類, 為IDC_EDIT_RXDATA添加CString變量m_strRXData, 為IDC_EDIT_TXDATA添加CString變量m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發(fā)送的字符數(shù)據(jù)。
5.添加串口事件消息處理函數(shù)OnComm()
打開ClassWizard-》Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數(shù)名改為OnComm,(好記而已)OK。
這個函數(shù)是用來處理串口消息事件的,如每當串口接收到數(shù)據(jù),就會產(chǎn)生一個串口接收數(shù)據(jù)緩沖區(qū)中有字符的消息事件,我們剛才添加的函數(shù)就會執(zhí)行,我們在OnComm()函數(shù)加入相應的處理代碼就能實現(xiàn)自已想要的功能了。請你在函數(shù)中加入如下代碼:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數(shù)組 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2)//事件值為2表示接收緩沖區(qū)內(nèi)有字符
{////////以下你可以根據(jù)自己的通信協(xié)議加入處理代碼
variant_inp=m_ctrlComm.GetInput();//讀緩沖區(qū)
safearray_inp=variant_inp;//VARIANT型變量轉換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize();//得到有效數(shù)據(jù)長度
for(k=0;k《len;k++) 《/len;k++)
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數(shù)組
for(k=0;k《len;k++) p=“” 將數(shù)組轉換為cstring型變量
{
BYTE bt=*(char*)(rxdata+k);//字符型
strtemp.Format(“%c”,bt);//將字符送入臨時變量strtemp存放
m_strRXData+=strtemp;//加入接收編輯框對應字符串
}
m_strRXData+=“rn”; //換行
}
UpdateData(FALSE);//更新編輯框內(nèi)容
}
-
單片機
+關注
關注
6043文章
44617瀏覽量
638225 -
51單片機
+關注
關注
274文章
5705瀏覽量
124231 -
串口通信
+關注
關注
34文章
1627瀏覽量
55706
發(fā)布評論請先 登錄
相關推薦
評論