串列埠程式設計(VS2010)
阿新 • • 發佈:2019-02-11
解壓後拷貝到:
C:\Windows\System32(WIN7系統);
C:\WINDOWS\system32(XP系統)。
注意:64位win7系統還需要將mscomm32.ocx檔案複製到C:\Windows\SysWOW64\目錄下,否則後面註冊會出錯。在C:\Windows\System32裡找到cmd.exe以管理員身份執行:
Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX修改登錄檔:
win+R組合鍵開啟“執行”或者直接在開始選單裡找到“執行”;輸入regedit後回車,開啟登錄檔管理器,在其中找到HKEY_CLASSES_ROOT項下的Licenses項,新增主項命名為“4250E830-6AC2-11cf-8ADB-00AA00C00905”,並將鍵值修改為“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”
2.進入正題
一、開啟VS2010軟體,繪製介面;
- 我們要用到就是對話方塊模組,所以選擇如下圖所示
- 點選下一步至完成。
我們可以看到就緒之後的介面如下圖所示,按照步驟把原來的靜態文字框和確定按鈕、取消按鈕刪掉;
二、為我們的對話方塊新增控制元件
- 新增兩個組合邊框,並放置好位置;
- 修改組合邊框顯示的名稱;
- 在組合邊框裡面新增編輯文字框;
在這一步一定要小心選擇右邊的屬性;
二、新增控制元件和變數
- 這一步是把串列埠控制元件新增到對話方塊中來;
- 給四個控制元件(兩個輸入區域,一個選擇串列埠,一個波特率)新增變數 控制元件處右鍵,新增變數
- 接受區域,變數名最好和例項一樣,否則後面程式也需要修改
- 其他三個區域相同方法
- 選擇串列埠和波特率為control
串列埠控制元件為public
三、為按鈕和串列埠控制元件新增程式函式
- 雙擊開啟串列埠按鈕,進入相應的程式設計部分
void C串列埠v2Dlg::OnBnClickedButtonOpen()
{
CString str, str1, n;
GetDlgItemText(IDC_BUTTON_OPEN, str); //str獲得與對話方塊中的控制元件相關的標題或文字
CWnd *h1; //視窗類的基類
h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控制元件的caption
//串列埠為關閉狀態
if(!m_mscom.get_PortOpen())
{
m_comb2.GetLBText(m_comb2.GetCurSel(), str1); //取得所選的字串,並存放在str1裡面
str1 = str1+','+'n'+','+'8'+','+'1';
m_mscom.put_CommPort(m_comb1.GetCurSel()+1); //選擇串列埠
m_mscom.put_InputMode(1); //設定輸入方式為二進位制方式
m_mscom.put_Settings(str1); //comb2選擇的波特率,無校驗,8資料位,1個停止位
m_mscom.put_InputLen(1024); //設定當前接收區資料長度為1024
m_mscom.put_RThreshold(1); //緩衝區一個字元引發事件
m_mscom.put_RTSEnable(1); //設定RT允許
m_mscom.put_PortOpen(true); //開啟串列埠
//開啟成功
if(m_mscom.get_PortOpen())
{
str = _T("關閉串列埠");
UpdateData(true); //把控制元件中的值和變數進行交換
h1->SetWindowText(str); //改變按鈕名稱為‘’關閉串列埠”,提供關閉操作
}
}
//串列埠為開啟狀態
else
{
m_mscom.put_PortOpen(false); //關閉串列埠
//關閉成功
if(str != _T("開啟串列埠"))
{
str = _T("開啟串列埠");
UpdateData(true);
h1->SetWindowText(str); //更新資料後,提供開啟操作
}
}
}
- 其餘三個按鈕同法:
void C串列埠v2Dlg::OnBnClickedButtonSend()
{
UpdateData(true); //更新控制元件資料
m_mscom.put_Output(COleVariant(m_EditSend));//把傳送編輯框的資料傳送出去
}
void C串列埠v2Dlg::OnBnClickedButtonClean()
{
m_EditReceive = _T(""); //給接收編輯框傳送空格符
UpdateData(false); //根據資料狀態反饋給控制元件
}
void C串列埠v2Dlg::OnBnClickedButtonClose()
{
//若當前串列埠為開啟
if(m_mscom.get_PortOpen())
m_mscom.put_PortOpen(false); //置為關閉
CDialogEx::OnCancel();
}
- 新增事件處理程式
void C串列埠v2Dlg::OnCommMscomm1()
{
//接收緩衝區有資料
if(m_mscom.get_CommEvent() == 2)
{
char str[1024] = {0}; //緩衝區最大為1024
long k;
VARIANT InputData = m_mscom.get_Input(); //讀入緩衝區
COleSafeArray fs;
fs = InputData; //VARIANT型變À量轉換為COleSafeArray型變數
for(k = 0; k < fs.GetOneDimSize(); k++)
{
fs.GetElement(&k, str+k); //轉換為BYTE型陣列
}
m_EditReceive += str; //接收到編輯框裡面
//SetTimer(1, 10, NULL); //延時10ms
UpdateData(false); //將資料在螢幕中對應控制元件中顯示出來。
}
}
- 最後
在對話方塊初始部分BOOL C串列埠v2Dlg::OnInitDialog(),將對話方塊程式碼完善,新增程式碼的作用是增加串列埠選擇,和波特率選擇:
// 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示
// TODO: 在此新增額外的初始化程式碼
// 串列埠選擇組合框
CString str;
int i;
for(i = 0; i < 15; i++)
{
str.Format(_T("COM %d"), i+1);
m_comb1.InsertString(i, str); //將COM 1-15填入comb1
}
m_comb1.SetCurSel(0); //預置為COM 1
//波特率選擇組合框
CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"),
_T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};
for(i = 0; i < 12; i++)
{
int judge_tf = m_comb2.AddString(str1[i]);
if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE))
MessageBox(_T("Build baud error!"));
}
m_comb2.SetCurSel(5); //預置波特率為9600
return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE
- 程式完畢
編譯成功後,在儲存目錄下的Debug目錄下,找到可執行檔案。進入測試。
效果圖
四、測試
- 下載虛擬串列埠工具Virtual Serial Port Driver(VSPD)
- 新增兩個匹配的虛擬串列埠:
- 開啟兩個串列埠程式
在同波特率下,一個選擇串列埠1, 一個選擇串列埠2, 測試結果如下。