FD-110A型渦輪分子泵控制器串口通信的實現與應用
本文基于串口通訊的原理,并以DF-110A型渦輪分子泵控制器為模型,介紹了使用CSerialPort類實現串口通訊的步驟,分析和討論了計算機與單片機進行通訊的協議,且在VC++6.0的基礎上運用多線程串口編程工具CSerialPort類實現PC機與單片機之間的串口通訊編程。通過協議改變時,模型做很小的修改就能夠很方便的移植到不同的應用系統中,具有很好的擴展性。同時,模型中利用多線程技術設計了一個串口監視的線程,能實時的監視串口狀態和數據,因此具有很好的實時性。
在現代工業控制中,串口通信的應用越來越廣泛。單片機和PC機之間的串口通信在進行數據交換時經常被使用。在串行通信時,要求通信雙方都采用一個標準接口,RS-232C接口是單片機和PC機進行通信最常用的一種接口。單片機與PC機進行串口通信最簡單的三線制法,即接收數據針腳(RxD)與發送數據針腳(TxD)相連,彼此交叉,信號地(GND)對應相接,如圖1所示。
為了實現單片機和PC機之間的串口通信,采用VC++6.0來實現編程,VC++6.0是一種功能強大的面向對象的Windows編程開發平臺。與以
往DOS下串行通信不同,Windows不提倡應用程序直接控制硬件,而是通過Windows系統提供的設備驅動程序來進行數據傳遞。串口在Win32中是作為文件來處理的,而不是直接對端口進行操作。本文采用多線程串口編程工具CSerialPort類來實現PC機與單片機之間的通訊。
圖1 RS-232端接口
1、使用CSerialPort類實現串行通信
CSerialPort類是由RemonSpekreijse提供的串口類,該類支持線連接(非MODEM)的串口編程操作。
CSerialPort類是基于多線程的,其工作流程如下:首先設置好串口參數,再開啟串口監測工作線程,串口監測工作線程監測到串口接收到的數據、流控制事件或其他串口事件后;就以消息方式通知主程序,激發消息處理函數來進行數據處理,這是對接收數據而言的;發送數據可直接向串口發送。具體實現如下:
1.1、添加類文件(SerialPort.h和SerialPort.cpp)并定義類對象m_SerialPort,(若要操作多個串口,則要為每個串口均定義一個類對象)。
1.2、串口的初始化
串口的初始化代碼一般在OnInitDialog()函數中實現,下面給出了主要代碼以及定義了一個布爾變量m_bSerialPortOpened用來標志串口是否打開。
if(m_SerialPort.InitPort(this,nPort,4800,'D',8,1,EV_RXFLAG|EV_RXCHAR,512))
{m_SerialPort.StartMonitoring();//啟動監測輔助線程
m_bSerialPortOpened=TRUE;
}
else
{AfxMessageBox("沒有發現此串口或被占用");
m_bSerialPortOpened=FALSE;
}
1.3、接收數據
接收處理在串口事件消息處理函數OnComm()中實現。并將接收到的字符顯示在接收編輯框中,下面代碼中,定義了接收數據變量m_ReceiveData,WPARAM、LPARAM類型是多態數據類型(polymorphicdatatype),根據需要自動適應,每當串口接收緩沖區內有一個字符時,就會產生一個WM_COMM_RXCHAR消息,觸發OnComm()函數,這時就轉到函數中進行數據處理。
LONGCFD110ADlg::OnComm(WPARAMch,
LPARAMport)
{m_ReceiveData+=ch;
UpdateData(FALSE);//將接收到的字符顯示在接收編輯框中
return0;
}
1.4、數據發送
if(!m_bSerialPortOpened)return;//檢查串口是否打開
UpdateData(TRUE);//讀入編輯框中的數據
m_SerialPort.WriteToPort((LPCTSTR)m_strSend-Data);//發送數據
2、PC機與單片機之間的相互通信
FD-110A型分子泵控制器是供高速無刷直流電動機的電子換向器,其使用51系列單片機
作為控制器。具有4位LED數碼管顯示頻率、電壓、電流值;3只鍵盤用于啟動、停止控制,頻率、電壓、電流顯示切換及高、低轉速設置;過流、過熱、超時聲光保護報警;本地線控和遠程RS232通訊控制。
2.1、C51單片機串行口協議
(1)通訊波特率4800bit/S,格式8.1.1
(2)命令格式:
長度:參數的長度。無參數時填零。
異或效驗:從命令碼開始。
2.2、PC機與單片機接通后,PC機發送以下命令:
AB800080分子泵停止工作
AB810081分子泵啟動工作
AB820082設置430Hz
AB830083設置704Hz
AB840084要工作狀態
其中命令“AB800080”解釋如下
AB:包頭-同步碼
80:命令字
00:參數長度,無參數時填零
80:異或效驗碼
2.3、單片機上傳數據
當啟動分子泵時,隨著分子泵旋轉速度的增加,4位LED數碼顯示數字隨之增加,當顯示穩定在704Hz±10后分子泵加速完畢,進入勻速旋轉狀態。此時向單片機發送命令,單片機即可返回當前數據,就可以獲得分子泵的當前工作狀態。
具體說明如下:
(1)上傳命令
(2)上傳命令參數
(3)狀態字節
注意:等于1時,有效。
2.4、實現的程序代碼
//各種命令參數
constCStringSTARTMOTOR=“AB810081”
constCStringCLOSEMOTOR=“AB800080”
constCStringSET430Hz=“AB820082”
constCStringSET704Hz=“AB830083”
constCStringWORKSTATUS=“AB840084”
constCStringBACKDATA=“AB91078491”
//當前運動狀態
constintStartMotor=0;
constintCloseMotor=1;
constintSet430HZ=2;
constintSet704HZ=3;
constintWorkStatus=4;
//啟動分子泵
CStringstr;//臨時變量
str=m_strSendData;
m_strSendData=STARTMOTOR;
StrtoHex(m_strSendData);
CountDisplay(m_strSendData);
m_strSendData=str;
CurrentControlStatus(0);
……………
//關閉分子泵
CStringstr;//臨時變量
str=m_strSendData;
m_strSendData=CLOSEMOTOR;
StrtoHex(m_strSendData);
CountDisplay(m_strSendData);
m_strSendData=str;
CurrentControlStatus(1);
…………
//用于顯示分子泵當前工作狀態
CStringstr;
CStringstrTemp;
switch(ControlStatus)
{
……………
case1:
str="分子泵已關閉";
strTemp.Format("當前工作狀態:%s",str);
m_ctrlControlStatus.SetWindowText(strTemp);
//顯示當前工作狀態
break;
……………
UpdateData(FALSE);
}
3、結論
本文在PC機與單片機之間的串口通訊實例中,并非直接去編寫單片機(下位機)程序,而是直接面向通信協議編寫PC機(上位機)端運行的智能軟件,從而實現與單片機之間的串口通訊,該方法有兩大優點:①同一上層客戶端軟件可以與不同的單片機之間實現串口通訊,從而實現對單片機的空控制。②如果控制任務特別多,多用戶也可以通過上位機運行的智能軟件來對同一單片機共同分擔各自的控制任務。