RS-232-C序列埠監視軟體的程式實現

來源:互聯網
上載者:User
RS-232-C序列埠監視軟體的程式實現

  (一) 介面風格

  由於是即時監視軟體,那就既要監測從外設傳來的即時資料,又要通過串口向外設發送一些具體的指令以控制外設完成預先設定的動作。為了方便向串口發送命令可以在工具條上再加一個類似於"Internet Explorer 瀏覽器"風格的對話條,可以在初建工程時指定"Internet Explorer ReBars"風格,也可以通過添加Microsoft Visual C++ 6.0內建的"Dialog Bar"組件來實現。而要及時將從外部讀取的資料顯示給管理員,並且留有相當記錄以備查閱,可以挑選清單視圖來實現。

  (二) 串口的參數設定及開啟 

  對RS-232-C序列埠進行參數配置是使用串口進行通訊的必要條件。而且由於場合不同、用途、功能的不同對串口也採取不同的配置方式,為了使本程式更靈活,適應面更廣,採取將所有的可能參數都預先設定在幾個組合框中,可以在程式運行後隨時更改設定。自訂一個設定串口參數的資料結構:

typedef struct tagCOM_CONFIG
{
int nPort; file://連接埠號碼,從COM1到COM4
int nBaud; file://傳輸速率,從1200bps到57600bps(對應的宏為CBR_1200到CBR_57600)
int nData; file://資料位元個數,7位或是8位
int nStop; file://停止位個數,可以是1位、1.5位、2位。
int nParity;//採取的校正方式,有無校正(NOPARITY)、
file://奇數同位(ODDPARITY)和偶校正(EVENPARITY)等。
}COM_CONFIG; 

  當選擇好適當的參數後就可以根據設定好的連接埠配置情況開啟通訊連接埠了。與以往DOS下串列通訊程式不同的是,Windows操作平台下不提倡應用程式直接控制硬體(包括連接埠),也不讓使用中斷(除非打入到Ring0系統級),而是通過Windows作業系統提供的裝置驅動程式來進行資料傳遞。在Windows作業系統下串列口和其他通訊連接埠一樣是作為檔案來進行處理的,而不是直接對連接埠進行操作,對於串列通訊,Win 32 提供了相應的檔案I/O函數與通訊函數,通過瞭解這些函數的使用,可以編製出符合不同需要的通訊程式。與通訊裝置相關的結構有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7個,與通訊有關的Windows API函數共有26個,具體說明可參考MSDN協助檔案。下面是開啟串口的部分關鍵代碼:

//以建立檔案的形式開啟檔案,並將返回的連接埠控制代碼儲存於控制代碼idComDev之中。
idComDev =CreateFile( g_szCom_Port[g_com_config.nPort], 
GENERIC_READ | GENERIC_WRITE,
0, 
NULL, 
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL ); 
…… 
file://cfg為COMMCONFIG結構的執行個體對象,擷取當前通訊口的狀態。
cfg.dcb.DCBlength = sizeof( DCB ) ;
GetCommState( idComDev, &(cfg.dcb) ) ;
file://設定發送、接收緩衝大小
SetupComm( idComDev, 4096, 4096 ) ;
// PurgeComm()是一個清除函數,它可以用來中止任何未決的後台讀或寫,並且可以衝掉I/O
file://緩衝區.其中:PURGE_TXABORT 用於中止後台寫操作;PRUGE_RXABORT用於中止後台
file://讀操作 ;PRUGE_TXCLEAR用於清除發送緩衝區;PRUGE_RXCLEAR用於清除接收緩衝區
PurgeComm(idComDev,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
file://根據設定的參數填充DCB結構對象dcb的各個資料成員變數
dcb.DCBlength = sizeof( DCB ) ;
GetCommState( idComDev, &dcb ) ;
file://設定連接埠通訊參數
dcb.BaudRate =g_Com_Baud[g_com_config.nBaud];
dcb.ByteSize =g_Com_ByteSize[g_com_config.nData];
dcb.Parity =g_Com_Parity[g_com_config.nParity] ;
dcb.StopBits =g_Com_StopBits[g_com_config.nStop];
file://硬體流量控制
dcb.fDtrControl = DTR_CONTROL_DISABLE ;
dcb.fOutxCtsFlow = FALSE ;
dcb.fRtsControl = RTS_CONTROL_DISABLE ;
file://軟體流量控制
dcb.fInX = dcb.fOutX = FALSE ;
dcb.XonChar = (char)0xFF ;
dcb.XoffChar = (char)0XFF ;
dcb.XonLim = 100 ;
dcb.XoffLim = 100 ;
dcb.EvtChar=0x0d;
dcb.fBinary = TRUE ;
dcb.fParity = TRUE ;

file://逾時控制的設定。逾時有兩種:區間逾時:(僅對從連接埠中讀取資料有用)它指定在讀取兩個字元之間要經曆的時間;總逾時: 當讀或寫特定的位元組數需要的總時間超過某一閾值時,逾時觸發。計算逾時可以根據公式:
file://ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read)+ 
// ReadToTaltimeoutConstant
file://WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write)+ 
// WritetoTotalTimeoutConstant
file://如果在設定逾時時參數為0則為無限等待,即無逾時。
CommTimeOuts.ReadIntervalTimeout =MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier =0;
CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
CommTimeOuts.WriteTotalTimeoutMultiplier =2*9600/dcb.BaudRate ;
CommTimeOuts.WriteTotalTimeoutConstant = 25 ;
SetCommTimeouts(idComDev , &CommTimeOuts ) ;
file://根據設定好的dcb結構設定好通訊口的狀態,並開啟用於偵聽連接埠,監視從外設傳來的數
file://據的線程COMReadThreadProc。
if (SetCommState( idComDev, &dcb ))
{
m_bComPortOpen=TRUE;
g_hCom=idComDev;
AfxBeginThread(COMReadThreadProc,NULL,THREAD_PRIORITY_NORMAL);
return;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.