FD-110A型渦輪分子泵控制器串口通信的實(shí)現(xiàn)與應(yīng)用

2013-11-29 殷際英 北方工業(yè)大學(xué)機(jī)電工程學(xué)院

  本文基于串口通訊的原理,并以DF-110A型渦輪分子泵控制器為模型,介紹了使用CSerialPort類(lèi)實(shí)現(xiàn)串口通訊的步驟,分析和討論了計(jì)算機(jī)與單片機(jī)進(jìn)行通訊的協(xié)議,且在VC++6.0的基礎(chǔ)上運(yùn)用多線程串口編程工具CSerialPort類(lèi)實(shí)現(xiàn)PC機(jī)與單片機(jī)之間的串口通訊編程。通過(guò)協(xié)議改變時(shí),模型做很小的修改就能夠很方便的移植到不同的應(yīng)用系統(tǒng)中,具有很好的擴(kuò)展性。同時(shí),模型中利用多線程技術(shù)設(shè)計(jì)了一個(gè)串口監(jiān)視的線程,能實(shí)時(shí)的監(jiān)視串口狀態(tài)和數(shù)據(jù),因此具有很好的實(shí)時(shí)性。

  在現(xiàn)代工業(yè)控制中,串口通信的應(yīng)用越來(lái)越廣泛。單片機(jī)和PC機(jī)之間的串口通信在進(jìn)行數(shù)據(jù)交換時(shí)經(jīng)常被使用。在串行通信時(shí),要求通信雙方都采用一個(gè)標(biāo)準(zhǔn)接口,RS-232C接口是單片機(jī)和PC機(jī)進(jìn)行通信最常用的一種接口。單片機(jī)與PC機(jī)進(jìn)行串口通信最簡(jiǎn)單的三線制法,即接收數(shù)據(jù)針腳(RxD)與發(fā)送數(shù)據(jù)針腳(TxD)相連,彼此交叉,信號(hào)地(GND)對(duì)應(yīng)相接,如圖1所示。

  為了實(shí)現(xiàn)單片機(jī)和PC機(jī)之間的串口通信,采用VC++6.0來(lái)實(shí)現(xiàn)編程,VC++6.0是一種功能強(qiáng)大的面向?qū)ο蟮腤indows編程開(kāi)發(fā)平臺(tái)。與以

  往DOS下串行通信不同,Windows不提倡應(yīng)用程序直接控制硬件,而是通過(guò)Windows系統(tǒng)提供的設(shè)備驅(qū)動(dòng)程序來(lái)進(jìn)行數(shù)據(jù)傳遞。串口在Win32中是作為文件來(lái)處理的,而不是直接對(duì)端口進(jìn)行操作。本文采用多線程串口編程工具CSerialPort類(lèi)來(lái)實(shí)現(xiàn)PC機(jī)與單片機(jī)之間的通訊。

RS-232端接口

圖1 RS-232端接口

1、使用CSerialPort類(lèi)實(shí)現(xiàn)串行通信

  CSerialPort類(lèi)是由RemonSpekreijse提供的串口類(lèi),該類(lèi)支持線連接(非MODEM)的串口編程操作。

  CSerialPort類(lèi)是基于多線程的,其工作流程如下:首先設(shè)置好串口參數(shù),再開(kāi)啟串口監(jiān)測(cè)工作線程,串口監(jiān)測(cè)工作線程監(jiān)測(cè)到串口接收到的數(shù)據(jù)、流控制事件或其他串口事件后;就以消息方式通知主程序,激發(fā)消息處理函數(shù)來(lái)進(jìn)行數(shù)據(jù)處理,這是對(duì)接收數(shù)據(jù)而言的;發(fā)送數(shù)據(jù)可直接向串口發(fā)送。具體實(shí)現(xiàn)如下:

  1.1、添加類(lèi)文件(SerialPort.h和SerialPort.cpp)并定義類(lèi)對(duì)象m_SerialPort,(若要操作多個(gè)串口,則要為每個(gè)串口均定義一個(gè)類(lèi)對(duì)象)。

  1.2、串口的初始化

  串口的初始化代碼一般在OnInitDialog()函數(shù)中實(shí)現(xiàn),下面給出了主要代碼以及定義了一個(gè)布爾變量m_bSerialPortOpened用來(lái)標(biāo)志串口是否打開(kāi)。

  if(m_SerialPort.InitPort(this,nPort,4800,'D',8,1,EV_RXFLAG|EV_RXCHAR,512))

  {m_SerialPort.StartMonitoring();//啟動(dòng)監(jiān)測(cè)輔助線程

  m_bSerialPortOpened=TRUE;

  }

  else

  {AfxMessageBox("沒(méi)有發(fā)現(xiàn)此串口或被占用");

  m_bSerialPortOpened=FALSE;

  }

  1.3、接收數(shù)據(jù)

  接收處理在串口事件消息處理函數(shù)OnComm()中實(shí)現(xiàn)。并將接收到的字符顯示在接收編輯框中,下面代碼中,定義了接收數(shù)據(jù)變量m_ReceiveData,WPARAM、LPARAM類(lèi)型是多態(tài)數(shù)據(jù)類(lèi)型(polymorphicdatatype),根據(jù)需要自動(dòng)適應(yīng),每當(dāng)串口接收緩沖區(qū)內(nèi)有一個(gè)字符時(shí),就會(huì)產(chǎn)生一個(gè)WM_COMM_RXCHAR消息,觸發(fā)OnComm()函數(shù),這時(shí)就轉(zhuǎn)到函數(shù)中進(jìn)行數(shù)據(jù)處理。

  LONGCFD110ADlg::OnComm(WPARAMch,

  LPARAMport)

  {m_ReceiveData+=ch;

  UpdateData(FALSE);//將接收到的字符顯示在接收編輯框中

  return0;

  }

  1.4、數(shù)據(jù)發(fā)送

  if(!m_bSerialPortOpened)return;//檢查串口是否打開(kāi)

  UpdateData(TRUE);//讀入編輯框中的數(shù)據(jù)

  m_SerialPort.WriteToPort((LPCTSTR)m_strSend-Data);//發(fā)送數(shù)據(jù)

2、PC機(jī)與單片機(jī)之間的相互通信

  FD-110A型分子泵控制器是供高速無(wú)刷直流電動(dòng)機(jī)的電子換向器,其使用51系列單片機(jī)

  作為控制器。具有4位LED數(shù)碼管顯示頻率、電壓、電流值;3只鍵盤(pán)用于啟動(dòng)、停止控制,頻率、電壓、電流顯示切換及高、低轉(zhuǎn)速設(shè)置;過(guò)流、過(guò)熱、超時(shí)聲光保護(hù)報(bào)警;本地線控和遠(yuǎn)程RS232通訊控制。

  2.1、C51單片機(jī)串行口協(xié)議

  (1)通訊波特率4800bit/S,格式8.1.1

  (2)命令格式:

FD-110A型渦輪分子泵控制器串口通信的實(shí)現(xiàn)與應(yīng)用

  長(zhǎng)度:參數(shù)的長(zhǎng)度。無(wú)參數(shù)時(shí)填零。

  異或效驗(yàn):從命令碼開(kāi)始。

  2.2、PC機(jī)與單片機(jī)接通后,PC機(jī)發(fā)送以下命令:

  AB800080分子泵停止工作

  AB810081分子泵啟動(dòng)工作

  AB820082設(shè)置430Hz

  AB830083設(shè)置704Hz

  AB840084要工作狀態(tài)

  其中命令“AB800080”解釋如下

  AB:包頭-同步碼

  80:命令字

  00:參數(shù)長(zhǎng)度,無(wú)參數(shù)時(shí)填零

  80:異或效驗(yàn)碼

  2.3、單片機(jī)上傳數(shù)據(jù)

  當(dāng)啟動(dòng)分子泵時(shí),隨著分子泵旋轉(zhuǎn)速度的增加,4位LED數(shù)碼顯示數(shù)字隨之增加,當(dāng)顯示穩(wěn)定在704Hz±10后分子泵加速完畢,進(jìn)入勻速旋轉(zhuǎn)狀態(tài)。此時(shí)向單片機(jī)發(fā)送命令,單片機(jī)即可返回當(dāng)前數(shù)據(jù),就可以獲得分子泵的當(dāng)前工作狀態(tài)。

  具體說(shuō)明如下:

  (1)上傳命令

FD-110A型渦輪分子泵控制器串口通信的實(shí)現(xiàn)與應(yīng)用

  (2)上傳命令參數(shù)

FD-110A型渦輪分子泵控制器串口通信的實(shí)現(xiàn)與應(yīng)用

  (3)狀態(tài)字節(jié)

FD-110A型渦輪分子泵控制器串口通信的實(shí)現(xiàn)與應(yīng)用

  注意:等于1時(shí),有效。

  2.4、實(shí)現(xiàn)的程序代碼

  //各種命令參數(shù)

  constCStringSTARTMOTOR=“AB810081”

  constCStringCLOSEMOTOR=“AB800080”

  constCStringSET430Hz=“AB820082”

  constCStringSET704Hz=“AB830083”

  constCStringWORKSTATUS=“AB840084”

  constCStringBACKDATA=“AB91078491”

  //當(dāng)前運(yùn)動(dòng)狀態(tài)

  constintStartMotor=0;

  constintCloseMotor=1;

  constintSet430HZ=2;

  constintSet704HZ=3;

  constintWorkStatus=4;

  //啟動(dòng)分子泵

  CStringstr;//臨時(shí)變量

  str=m_strSendData;

  m_strSendData=STARTMOTOR;

  StrtoHex(m_strSendData);

  CountDisplay(m_strSendData);

  m_strSendData=str;

  CurrentControlStatus(0);

  ……………

  //關(guān)閉分子泵

  CStringstr;//臨時(shí)變量

  str=m_strSendData;

  m_strSendData=CLOSEMOTOR;

  StrtoHex(m_strSendData);

  CountDisplay(m_strSendData);

  m_strSendData=str;

  CurrentControlStatus(1);

  …………

  //用于顯示分子泵當(dāng)前工作狀態(tài)

  CStringstr;

  CStringstrTemp;

  switch(ControlStatus)

  {

  ……………

  case1:

  str="分子泵已關(guān)閉";

  strTemp.Format("當(dāng)前工作狀態(tài):%s",str);

  m_ctrlControlStatus.SetWindowText(strTemp);

  //顯示當(dāng)前工作狀態(tài)

  break;

  ……………

  UpdateData(FALSE);

  }

3、結(jié)論

  本文在PC機(jī)與單片機(jī)之間的串口通訊實(shí)例中,并非直接去編寫(xiě)單片機(jī)(下位機(jī))程序,而是直接面向通信協(xié)議編寫(xiě)PC機(jī)(上位機(jī))端運(yùn)行的智能軟件,從而實(shí)現(xiàn)與單片機(jī)之間的串口通訊,該方法有兩大優(yōu)點(diǎn):①同一上層客戶端軟件可以與不同的單片機(jī)之間實(shí)現(xiàn)串口通訊,從而實(shí)現(xiàn)對(duì)單片機(jī)的空控制。②如果控制任務(wù)特別多,多用戶也可以通過(guò)上位機(jī)運(yùn)行的智能軟件來(lái)對(duì)同一單片機(jī)共同分擔(dān)各自的控制任務(wù)。