?? 串口調(diào)試助手源程序1.htm
字號:
align=left><B><A style="COLOR: #006666; TEXT-DECORATION: none"
href="http://www.gjwtech.com/vcandc/scommassistantcode.htm#7.發(fā)送數(shù)據(jù)">7.發(fā)送數(shù)據(jù)</A></B></P>
<P style="MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px"
align=left> </P>
<P style="MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px"
align=left> </P>
<P align=left>
在眾多網(wǎng)友的支持下,串口調(diào)試助手從2001年5月21日發(fā)布至今,短短一個月,在全國各地累計下載量近5000人次,在近200多個電子郵件中,20多人提供了使用測試意見,更有50多位朋友提出要串口調(diào)試助手的源代碼,為了答謝謝朋友們的支持,公開推出我最初用VC控件MSComm編寫串口通信程序的源代碼,并寫出詳細的編程過程,姑且叫<FONT
color=#0000ff>串口調(diào)試助手源程序V1.0</FONT>或<FONT
color=#0000ff>VC串口通訊源程序</FONT>吧,我相信,如果你用VC編程,那么有了這個代碼,就可以輕而易舉地完成串口編程任務(wù)了。(也許本文過于詳細,高手就不用看)</P>
<P align=left>開始吧:</P>
<P align=left><B><A
name=1.建立項目>1.建立項目</A></B>:打開VC++6.0,建立一個基于對話框的MFC應(yīng)用程序SCommTest(與我源代碼一致,等會你會方便一點);</P>
<P align=left><B><A
name=2.在項目中插入MSComm控件>2.在項目中插入MSComm控件</A></B>
選擇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就可以了),</P>
<P
align=left>這時在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構(gòu)clw文件也一樣),并且在控件工具欄Controls中出現(xiàn)了電話圖標(biāo)(如圖1所示),現(xiàn)在要做的是用鼠標(biāo)將此圖標(biāo)拖到對話框中,程序運行后,這個圖標(biāo)是看不到的。</P>
<P align=left><IMG height=224
src="串口調(diào)試助手源程序1.files/scomm01.jpg" width=172 border=0></P>
<P align=left><A
name=3.利用ClassWizard定義CMSComm類對象><B>3.利用ClassWizard定義CMSComm類控制對象</B></A>
打開ClassWizard->Member
Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變量:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了//{{AFX_INCLUDES()
#include "mscomm.h" //}}AFX_INCLUDES
(這時運行程序,如果有錯,那就再從頭開始)。</P>
<P align=left><A name=4.在對話框中添加控件><B>4.在對話框中添加控件</B></A>
向主對話框中添加兩個編輯框,一個用于接收顯示數(shù)據(jù)ID為IDC_EDIT_RXDATA,另一個用于輸入發(fā)送數(shù)據(jù),ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發(fā)送編輯框中的內(nèi)容發(fā)送一次,將其ID設(shè)為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties->Styles中把Miltiline和Vertical
Scroll屬性選上,發(fā)送編輯框若你想輸入多行文字,也可選上Miltiline。</P>
<P align=left>再打開ClassWizard->Member
Viariables選項卡,選擇CSCommTestDlg類,
為IDC_EDIT_RXDATA添加CString變量m_strRXData,
為IDC_EDIT_TXDATA添加CString變量m_strTXData。說明:
m_strRXData和m_strTXData分別用來放入接收和發(fā)送的字符數(shù)據(jù)。</P>
<P align=left> <FONT
color=#999999>
休息一會吧?我們天天與電腦打交道,要注意保重,我現(xiàn)在在單杠上做引體向上可以來40次,可我都32了,佩服嗎?<IMG
height=65 src="串口調(diào)試助手源程序1.files/jumpsmile1.gif" width=56
border=0>。。。。。。好了,再接著來,下面是關(guān)鍵了:</FONT></P>
<P align=left><B><A
name=5.添加串口事件消息處理函數(shù)OnComm()>5.添加串口事件消息處理函數(shù)OnComm()</A></B>
打開ClassWizard->Message
Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數(shù)名改為OnComm,(好記而已)OK。</P>
<P
align=left> 這個函數(shù)是用來處理串口消息事件的,如每當(dāng)串口接收到數(shù)據(jù),就會產(chǎn)生一個串口接收數(shù)據(jù)緩沖區(qū)中有字符的消息事件,我們剛才添加的函數(shù)就會執(zhí)行,我們在OnComm()函數(shù)加入相應(yīng)的處理代碼就能實現(xiàn)自已想要的功能了。請你在函數(shù)中加入如下代碼:</P>
<BLOCKQUOTE>
<P align=left><FONT color=#999999>void
CSCommTestDlg::OnComm() <BR>{<BR> //
TODO: Add your control notification handler code
here<BR></FONT> VARIANT
variant_inp;<BR> COleSafeArray
safearray_inp;<BR> LONG
len,k;<BR> BYTE rxdata[2048]; //設(shè)置BYTE數(shù)組
An 8-bit integerthat is not signed.<BR>
CString strtemp;<BR>
if(m_ctrlComm.GetCommEvent()==2)
//事件值為2表示接收緩沖區(qū)內(nèi)有字符<BR>
{
////////以下你可以根據(jù)自己的通信協(xié)議加入處理代碼<BR>
variant_inp=m_ctrlComm.GetInput();
//讀緩沖區(qū)<BR>
safearray_inp=variant_inp;
//VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量<BR>
len=safearray_inp.GetOneDimSize();
//得到有效數(shù)據(jù)長度<BR>
for(k=0;k<len;k++)<BR>
safearray_inp.GetElement(&k,rxdata+k);//轉(zhuǎn)換為BYTE型數(shù)組<BR>
for(k=0;k<len;k++)
//將數(shù)組轉(zhuǎn)換為Cstring型變量<BR>
{<BR>
BYTE bt=*(char*)(rxdata+k);
//字符型<BR>
strtemp.Format("%c",bt);
//將字符送入臨時變量strtemp存放<BR>
m_strRXData+=strtemp;
//加入接收編輯框?qū)?yīng)字符串 <BR>
}<BR> }<BR>
UpdateData(FALSE); //更新編輯框內(nèi)容<BR><FONT
color=#999999>}<BR></FONT></P></BLOCKQUOTE>
<P
align=left>到目前為止還不能在接收編輯框中看到數(shù)據(jù),因為我們還沒有打開串口,但運行程序不應(yīng)該有任何錯誤,不然,你肯定哪兒沒看仔細,因為我是打開VC6對照著做一步寫一行的,運行試試。沒錯吧?那么做下一步:</P>
<P align=left><B><A
name=6.打開串口和設(shè)置串口參數(shù)>6.打開串口和設(shè)置串口參數(shù)</A></B>
你可以在你需要的時候打開串口,例如在程序中做一個開始按鈕,在該按鈕的處理函數(shù)中打開串口。現(xiàn)在我們在主對話框的CSCommTestDlg::OnInitDialog()打開串口,加入如下代碼:</P>
<P align=left><FONT color=#999999>// TODO: Add extra
initialization
here</FONT><BR>if(m_ctrlComm.GetPortOpen())<BR>m_ctrlComm.SetPortOpen(FALSE);<BR><BR>m_ctrlComm.SetCommPort(1);
//選擇com1<BR>if(
!m_ctrlComm.GetPortOpen())<BR>m_ctrlComm.SetPortOpen(TRUE);//打開串口<BR>else<BR>AfxMessageBox("cannot
open serial
port");<BR><BR>m_ctrlComm.SetSettings("9600,n,8,1");
//波特率9600,無校驗,8個數(shù)據(jù)位,1個停止位 </P>
<P align=left>m_ctrlComm.SetInputModel(1);
//1:表示以二進制方式檢取數(shù)據(jù)<BR>m_ctrlComm.SetRThreshold(1); <BR>//參數(shù)1表示每當(dāng)串口接收緩沖區(qū)中有多于或等于1個字符時將引發(fā)一個接收數(shù)據(jù)的OnComm事件<BR>m_ctrlComm.SetInputLen(0);
//設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0<BR>m_ctrlComm.GetInput();//先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)<BR></P>
<P align=left>現(xiàn)在你可以試試程序了,將串口線接好后(<FONT
color=#999999>不會接?去看看我寫的<A
style="COLOR: #006666; TEXT-DECORATION: none"
href="http://www.gjwtech.com/scomm/scconnectmethod.htm">串口接線基本方法</A></FONT>),打開<A
style="COLOR: #006666; TEXT-DECORATION: none"
href="http://www.gjwtech.com/myownprogram/comdebugassistant.htm">串口調(diào)試助手</A>,并將串口設(shè)在com2,選上自動發(fā)送,也可以等會手動發(fā)送。再執(zhí)行你編寫的程序,接收框里應(yīng)該有數(shù)據(jù)顯示了。</P>
<P align=left><B><A name=7.發(fā)送數(shù)據(jù)>7.發(fā)送數(shù)據(jù)</A></B>
先為發(fā)送按鈕添加一個單擊消息即BN_CLICKED處理函數(shù),打開ClassWizard->Message
Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數(shù),并在函數(shù)中添加如下代碼:</P>
<P align=left><FONT color=#999999>void
CSCommTestDlg::OnButtonManualsend() <BR>{<BR>// TODO: Add
your control notification handler code
here<BR></FONT>UpdateData(TRUE);
//讀取編輯框內(nèi)容<BR>m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發(fā)送數(shù)據(jù)<BR><FONT
color=#999999>}</FONT></P>
<P align=left>運行程序,在發(fā)送編輯框中隨意輸入點什么,單擊發(fā)送按鈕,啊!看看,在另一端的<A
style="COLOR: #006666; TEXT-DECORATION: none"
href="http://www.gjwtech.com/myownprogram/comdebugassistant.htm">串口調(diào)試助手</A>(或別的調(diào)試工具)接收框里出現(xiàn)了什么。</P>
<P
align=left>如果你真是初次涉獵串口編程,又一次成功,那該說聲謝謝我了,因為我第一次做串口程序時可費勁了,那時網(wǎng)上的資料也不好找。開開玩笑,謝謝你的支持,有什么好東西別忘了給我寄一份。</P>
<P
align=left>最后說明一下,由于用到VC控件,在沒有安裝VC的計算機上運行時要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)并再進行注冊設(shè)置,請參考</P>
<P align=left><A
href="http://www.gjwtech.com/scomm/manaualregistermscomm.htm"><FONT
color=#008000>如何手工注冊MSComm控件。</FONT></A></P>
<P align=left>龔建偉 2001.6.20</P>
<P align=left><BR><FONT
color=#999999>什么是VARIANT數(shù)據(jù)類型?如何使用VARIANT數(shù)據(jù)類型?
怎么以十六進制或二進制發(fā)送和接收?</FONT></P>
<P align=left> 如果還想再深入了解,請看:</P>
<P align=center><A
style="COLOR: #006666; TEXT-DECORATION: none"
href="http://www.gjwtech.com/vcandc/scommassistantcode02.htm">串口調(diào)試助手源程序及編程詳細過程(二)2001.8.26</A></P> </TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=2> </TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=2> </TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=2> </TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=2> </TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=2> </TD></TR></TBODY></TABLE></TD>
<TD vAlign=top align=middle width=155 bgColor=#ffffff>
<P align=left><EMBED src=../ads/sidead01.swf width=155 height=400
type=application/x-shockwave-flash><NOEMBED>新書:串口通信編程實踐</NOEMBED></P></TD></TR>
<TR>
<TD vAlign=top align=middle width=155 bgColor=#ffffff><IMG height=15
src="串口調(diào)試助手源程序1.files/dot_short_line.jpg" width=155 border=0></TD></TR>
<TR>
<TD vAlign=top align=middle width=155 bgColor=#ffffff><EMBED
src=../ads/sidead02.swf width=155 height=400
type=application/x-shockwave-flash></TD></TR>
<TR>
<TD vAlign=top align=middle width=155 bgColor=#ffffff> </TD></TR>
<TR>
<TD vAlign=top align=middle width=155 bgColor=#ffffff> </TD></TR>
<TR align=middle>
<TD vAlign=bottom bgColor=#808080 colSpan=2>
<TABLE id=table1 width="100%" border=1>
<TBODY>
<TR>
<TD>
<P align=center><FONT color=#000080><A
href="http://www.gjwtech.com/thesis/symmetricalaxis.htm"
target=_blank><FONT
color=#ffffff>轉(zhuǎn)載本站原版內(nèi)容,請注明作者并說明來自http://www.gjwtech.com
龔建偉技術(shù)主頁</FONT></A></FONT></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></FORM>
<TABLE id=table6 cellSpacing=0 cellPadding=0 width="100%"><!-- MSTableType="layout" -->
<TBODY>
<TR>
<TD vAlign=top height=79>
<DIV align=center>
<TABLE id=table7 height=126 width=771 border=0><!-- MSTableType="nolayout" -->
<TBODY>
<TR>
<TD>
<P align=center><B><FONT color=#008000><U><A
href="mailto:webmaster@gjwtech.com">EMAIL</A></U></FONT></B> </P>
<TABLE id=table8 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#018cd2 colSpan=2>
<P align=center> </P></TD></TR>
<TR>
<TD width="16%"> </TD>
<TD width="82%"><EMBED src=../ads/bottomad01.swf width=550
height=100
type=application/x-shockwave-flash></TD></TR></TBODY></TABLE>
<P> </P></TD></TR></TBODY></TABLE></DIV></TD></TR></TBODY></TABLE></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -