可以在:http://download.csdn.net/detail/plutus_lee/4525446 下載詳細文檔。
首先感謝網絡資源吧,作爲一個自動化專業出身的,不懂串口實在讓我有點無奈,本文參考xinzrjay原創的在VC++6.0下編寫串口調試助手,雖然比較詳細,但難免有錯誤,感謝xinzrjay吧,提供了較好的模板。
首先啓動VS2008,文件——新建——項目(快捷鍵Ctrl+Shift+N),
項目類型——Visual C++——MFC——模板——MFC應用程序,
l 名稱(如port1)。
l 位置(如桌面下的文件夾‘配置軟件’)。
l 解決方案名稱(會隨着名稱自動生成,建議不要修改)
點擊確定,進入MFC應用程序嚮導。
選擇下一步,不要直接點完成。選擇——基於對話框,把使用Unicode庫(N)點掉。
然後下一步,把“關於”框(B)點掉,可以點完成了。
進入界面
把對話框窗口中的靜態文本控件,兩個按鈕控件都刪掉,(選中後按Delete鍵即可),修改後的界面如下圖。
在對話框中添加兩個組框(Group Box),組框中分別添加一個文本編輯控件(Edit Control),另外加入一個按鈕控件(Button)這些都在工具箱中,選中後在對話框窗口中調節控件大小。
1. 需要修改所添加的控件一些屬性,如鼠標左鍵選中上面的組框,單擊鼠標右鍵選屬性——Caption——改爲:顯示區。
2. 修改下面的組框:屬性——Caption——發送區。
3. 修改上面的示例編輯框屬性:
l ID——IDC_EDIT_RECV;
l Multiline——True;
l Want Return——True;
l Vertical Scroll——True;
l Auto VScroll——True;
4. 修改下面的示例編輯框屬性:
l ID——IDC_EDIT_SEND;
l Multiline——True;
l Vertical Scroll——True;
5. 修改按鈕控件的屬性:
l ID——IDC_BUTTON_SEND;
l Caption——發送
修改好屬性後的窗口如下圖:
接下來添加關鍵的控件,選擇工具——選擇工具箱項——COM組件——MicrosoftCommunications Control,version 6.0——確定,這時在工具箱下就有了該控件,小電話標誌。
在工具箱中選中,然後把該控件拖到對話框中,如下圖:
界面完成後可以添加代碼了,要在類中添加變量和函數,先添加變量
在類視圖下,選中Cport1Dlg,單擊鼠標右鍵——添加——添加變量——控件變量(O)
控件ID(I)——IDC_EDIT_RECV;類別(T)——Value;變量名——m_strRecvData,完成。如下圖:
同理添加另外控件變量控件ID(I)——IDC_EDIT_SEND;類別(T)——Value;變量名——m_strSendData。如下圖:
同理添加另外控件變量控件ID(I)——IDC_MSCOMM1;類別(T)——Control;變量名——m_cComm,完成。如下圖:
接下來添加函數(事件處理程序):
選中MSComm控件,單擊鼠標右鍵,選擇——添加事件處理程序(A),彈出窗口,把函數處理程序名稱修改爲OnComm,點擊添加編輯,跳轉到程序部分,先不要添加。
同理,爲按鈕控件添加事件處理程序,函數處理程序名稱:OnButtonSend。
代碼部分是重點,(我電腦設置的是打開串口2,),實際上VS2008與VC++6.0中相對應的函數(類的方法)名發生了一些變化,這就需要一些修改要把在VC++6.0中的某些函數中的Get改爲get_ ,要把Set改爲put_ 。
1. 我們在OnInitDialog()中添加初始化語句,用於設置串口通信的屬性和打開串口。
BOOL Cport1Dlg::OnInitDialog()
{
。。。。。。。。。。
//添加的對串口的初始化語句
if(m_cComm.get_PortOpen()) //如果發現串口本來是打開的,則關閉串口
m_cComm.put_PortOpen(FALSE);
m_cComm.put_CommPort(1); //選擇COM1端口
m_cComm.put_InputMode(1); //輸入方式爲二進制方式
m_cComm.put_InBufferSize(1024); //設置輸入緩衝區
m_cComm.put_OutBufferSize(512); //設置輸出緩衝區
m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,無校驗,個數據位,個停止位
if(!m_cComm.get_PortOpen())
{
m_cComm.put_PortOpen(TRUE); //打開串口
m_cComm.put_RThreshold(1); //每當接收緩衝區有個字符則接收串口數據
m_cComm.put_InputLen(0); //設置當前緩衝區長度爲
m_cComm.get_Input(); //預讀緩衝區以清除殘留數據
}
else
AfxMessageBox("打開端口失敗!",MB_ICONSTOP,0);
2.我們在OnComm()函數中添加對串口發送過來的數據處理過程
void Cport1Dlg::OnComm()
{
//從串口接收數據並顯示在編輯框中
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
byte rxdata[512]; //設置BYTE數組
CString strtemp;
if(m_cComm.get_CommEvent()==2) //值爲表示接收緩衝區內有字符
{
variant_inp=m_cComm.get_Input(); //讀緩衝區消息
safearray_inp=variant_inp; ///變量轉換
len=safearray_inp.GetOneDimSize(); //得到有效的數據長度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);
for(k=0;k<len;k++) //將數組轉換爲CString型變量
{
char bt=*(char*)(rxdata+k);//字符型
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
m_strRecvData+=strtemp; //加入接收編輯框對應字符串
}
}
CString temp=("\r\n"); //顯示完成後要自動換行
m_strRecvData+=temp;
UpdateData(FALSE); //更新編輯框內容
3.我們添加發送按鈕OnButtonSend()發送數據的過程
{
//單擊發送按鈕的操作
UpdateData(true); //讀取編輯框內容
m_cComm.put_Output(COleVariant(m_strSendData));//發送數據
m_strSendData.Empty(); //發送後清空輸入框
UpdateData(false); //更新編輯框內容
//對發送的數據進行強制類型轉換,由CString字符串數據轉換爲VARIANT 類型。
串口現在在筆記本電腦上已經不多見了,USB口已經大行其道,另外VS2008下有serialport類,雖然還不瞭解,但是確實新趨勢,總之,這個就算作最基礎的練習吧。