VC串列埠程式設計的例項1
本例程採用同步串列埠操作,我們只介紹軟體部分,RS485介面接線方法不作介紹,感興趣的讀者可以查閱相關資料。
開啟VC++6.0,新建基於對話方塊的工程RS485Comm,在主對話方塊視窗IDD_RS485COMM_DIALOG上新增兩個按鈕,ID分別為IDC_SEND和IDC_RECEIVE,標題分別為“傳送”和“接收”;新增一個靜態文字框IDC_DISP,用於顯示串列埠接收到的內容。
1. 新增全域性變數
在RS485CommDlg.cpp檔案中新增全域性變數
HANDLE hCom; //全域性變數,串列埠控制代碼
2. 初始化串列埠引數
在RS485CommDlg.cpp檔案中的OnInitDialog()函式新增如下程式碼
// TODO: Add extra initialization here
hCom=CreateFile("COM1",//COM1口
GENERIC_READ|GENERIC_WRITE, //允許讀和寫
0, //獨佔方式
NULL,
OPEN_EXISTING, //開啟而不是建立
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("開啟COM失敗!");
return FALSE;
}
COMMTIMEOUTS TimeOuts;
//設定讀超時
TimeOuts.ReadIntervalTimeout= MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在讀一次輸入緩衝區的內容後讀操作就立即返回,
//而不管是否讀入了要求的字元。
//設定寫超時
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //設定超時
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate= 9600; //波特率為9600
dcb.ByteSize=8; //每個位元組有8位
dcb.Parity=NOPARITY; //無奇偶校驗位
dcb.StopBits=TWOSTOPBITS; //兩個停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
3. 添加發送和接收函式
分別雙擊IDC_SEND按鈕和IDC_RECEIVE按鈕,新增兩個按鈕的響應函式
//傳送串列埠資訊
void CRS485CommDlg::OnSend()
{
// TODO: Add your control notification handler code here
// 在此需要簡單介紹百特公司XMA5000的通訊協議:
//該儀表RS485通訊採用主機廣播方式通訊。
//序列半雙工,幀11位,1個起始位(0),8個數據位,2個停止位(1)
//如:讀儀表顯示的瞬時值,主機發送:DC1 AAA BB ETX
//其中:DC1是標準ASCII碼的一個控制符號,碼值為11H(十進位制的17)
//在XMA5000的通訊協議中,DC1表示讀瞬時值
//AAA是從機地址碼,也就是XMA5000顯示儀表的通訊地址
//BB為通道號,讀瞬時值時該值為01
//ETX也是標準ASCII碼的一個控制符號,碼值為03H
//在XMA5000的通訊協議中,ETX表示主機結束符
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7); //前7個位元組先清零
lpOutBuffer[0]=''\x11''; //傳送緩衝區的第1個位元組為DC1
lpOutBuffer[1]=''0''; //第2個位元組為字元0(30H)
lpOutBuffer[2]=''0''; //第3個位元組為字元0(30H)
lpOutBuffer[3]=''1''; // 第4個位元組為字元1(31H)
lpOutBuffer[4]=''0''; //第5個位元組為字元0(30H)
lpOutBuffer[5]=''1''; //第6個位元組為字元1(31H)
lpOutBuffer[6]=''\x03''; //第7個位元組為字元ETX
//從該段程式碼可以看出,儀表的通訊地址為001
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("寫串列埠失敗!");
}
}
//接收串列埠資訊
void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here
char str[100];
memset(str,''\0'',100);
DWORD wCount=100;//讀取的位元組數
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
{
AfxMessageBox("讀串列埠失敗!");
}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}
4. 關閉串列埠
您可以觀察返回的字串,其中有和儀表顯示值相同的部分,您可以進行相應的字串操作取出儀表的顯示值。
開啟ClassWizard,為靜態文字框IDC_DISP新增CString型別變數m_disp,同時新增WM_CLOSE的相應函式:
void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom); //程式退出時關閉串列埠
CDialog::OnClose();
}
程式的相應部分已經在程式碼內部作了詳細介紹。連線好硬體部分,編譯執行程式,細心體會串列埠同步操作部分。
相關推薦
VC串列埠程式設計的例項1
本例程採用同步串列埠操作,我們只介紹軟體部分,RS485介面接線方法不作介紹,感興趣的讀者可以查閱相關資料。 開啟VC++6.0,新建基於對話方塊的工程RS485Comm,在主對話方塊視窗IDD_RS485COMM_DIALOG上新增兩個按鈕,ID分別
VC串列埠程式設計的例項2
本例程採用非同步串列埠操作,我們只介紹軟體部分,RS485介面接線方法不作介紹,感興趣的讀者可以查閱相關資料。 開啟VC++6.0,新建基於對話方塊的工程RS485Comm,在主對話方塊視窗IDD_RS485COMM_DIALOG上新增兩個按鈕,ID分
Linux下的串列埠程式設計例項
親測可用,移植時根據需求修改即可,轉載自:http://blog.csdn.net/w282529350/article/details/7378388 //串列埠相關的標頭檔案 #include<stdio.h> /*標準輸入輸出定義*/ #
深入淺出VC++串列埠程式設計之基於控制元件
1.MSComm控制元件 Visual C++為我們提供了一種好用的ActiveX控制元件Microsoft Communications Control(即MSComm)來支援應用程式對串列埠的訪問,在應用程式中插入MSComm控制元件後就可以較為方便地實現對通
Vc 串列埠程式設計 Win32 控制元件
在工業控制中,工控機(一般都基於Windows平臺)經常需要與智慧儀表通過串列埠進行通訊。串列埠通訊方便易行,應用廣泛。 一般情況下,工控機和各智慧儀表通過RS485匯流排進行通訊。RS485的通訊方式是半雙工的,只能由作為主節點的工控PC機依次輪詢網路上的各智慧控
深入淺出VC++串列埠程式設計之基本概念
除錯工具 在MS-DOS下使用的程式設計環境是TC 2.0; 在Windows 2000下的程式設計環境是VC++ 6.0; 藉助工具:串列埠除錯助手2.1(圖8)。 圖8 串列埠除錯助手 串列埠除錯助手是由《Visual C++/Turbo C串列埠通訊程式設計實踐》一書作者龔建偉編寫的
Windows下C++ 串列埠程式設計例項
原文連結:http://blog.sina.com.cn/s/blog_afb1793101016mq2.html 1. 本例子使用了比較規範的軟體設計方法,類的設計具有比較好的可擴充套件性和移植性、程式碼的註釋採用doxgen支援的javaDoc風格。 2. 為了能方
深入淺出VC++串列埠程式設計之DOS的串列埠程式設計
/* Name : Sample Comm's Program - 1024 Byte Buffer - buff1024.c *//* Written By : Craig Peacock <[email protected]> */#include <dos.h>#inc
深入淺出VC++串列埠程式設計之簡訊應用開發
前面數次連載我們以較長的篇幅講解了串列埠通訊的硬體原理、DOS平臺控制以及基於WIN32 API、控制元件和第三方類的串列埠程式設計。作為本系列文章的最後一次連載,本章將給出一個典型的應用例項:西門子簡訊服務模組TC35
深入淺出VC++串列埠程式設計--簡訊應用開發
前面數次連載我們以較長的篇幅講解了串列埠通訊的硬體原理、DOS平臺控制以及基於WIN32 API、控制元件和第三方類的串列埠程式設計。作為本系列文章的最後一次連載,本章將給出一個典型的應用例項:西門子簡訊服務模組TC35的串列埠控制。 1.簡訊控制終端 作為簡訊 (Sho
20160426 VC++(VS2013)串列埠程式設計圖文教程(MSComm的使用)
1、新建MFC對話方塊工程如下 2、給編輯框控制元件新增變數,其中Edit Box新增Value變數,Button新增Control變數,ID和變數分別為: IDC_BTNOPEN()
VC++串列埠通訊程式設計詳解
總結來看串列埠通訊原理,(也可以說大多數通訊原理也是如此)。 通訊首先要有個通訊,可以簡單的把通訊看成一個小桶,傳送方住水桶裡裝水,接收方從水桶中取水。如果你要和對方通訊首先需要將桶蓋開啟,再將水
linux下串列埠程式設計設定函式---------set_opt(fd1,115200,8,'N'1)--------------------
open /dev/ttys0, 裝置檔案之後,得到檔案描述符, 對串列埠進行設定。 /** *串列埠設定函式:例(fd1, 115200, 8, 'N', 1); *引數: *fd:串列埠裝置節點
基於VC++的串列埠程式設計
序列通訊介面標準有多個版本,但是基本上都是在RS-232標準的基礎上發展而來。RS-232C標準時美國EIA和BELL等公司一起開發並於1969年公佈的通訊協議。1997年TIA發不了最新的一個版本,命名為TIA/EIA-232-F。ITU和CCITT釋出了一個類似的標準-V
Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.net/w28252
Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne
Linux串列埠程式設計詳解 linux串列埠相關設定函式
tcgetattr 函式用於獲取與終端相關的引數。引數fd為終端的檔案描述符,返回的結果儲存在termios 結構體中 http://baike.baidu.com/view/5644808.htm?fr=aladdin tcset
Linux C++串列埠程式設計 ROS
串列埠簡介 序列介面(Serial port)又稱“序列埠”,主要用於序列式逐位資料傳輸。常見的有一般計算機應用的
MFC串列埠通訊例項
參考MSComm控制元件的用法和函式說明。裡面講得也算詳細了。所以這裡直接獻上原始碼示例。 github下載地址 CSDN下載地址 效果如圖: 需要注意的是: 1.如果想同時recv/send,則必須加個執行緒。 2.奇偶校驗中,引數設定為,無(n),偶校驗(o),
Linux串列埠程式設計
串列埠通訊是指一次只傳送一個數據位。雖然在通訊的時候串列埠有 8 位或者 9 位等,但是在物理層面傳輸的時候,它仍然是以單個 bit 的方式傳輸的 一般特指 RS232 標準的介面 在 linux 下串列埠程式設計流程如下: 開啟串列埠 核心是用op
Android之串列埠程式設計
閱讀時長:10分鐘 原文地址:juejin.im/post/5bd96c… 原文作者:YKamh 技術預備:Java基礎 如今我們生活中充滿了各種智慧裝置,方便了我們的生活,這正是物聯網時代。如果我們要開發智慧裝置,那麼Android串列埠程式設計是我們應該必備的技能。 在投身到An