(b)在方案編制過程中。
作者:丹2006 54 38+0 8月25日
可以轉載,但必須註明作者及描述/www.gjwtech.com "goal =" _ blank " >,不得用於商業。
表格內容:
1。建立壹個項目
此項目插入MSComm控件。
將控件添加到對話框中。
OnComm串行事件消息處理功能(共5個)。
打開並設置串口參數
7。TXD
發送十六進制字符
接收框的十六進制顯示
10自動檔怎麽設置?
11 VARIANT數據類型?如何使用VARIANT數據類型?
串口調試助手源程序詳細編程過程(壹)續,感謝朋友們的支持和鼓勵。
8。發送十六進制字符
在主對話框中,添加壹個check,勾選按鈕ID IDC _ CHECK _ hex SEND title:10十六進制send,然後使用ClassWizard添加壹個控制變量:m_ctrlHexSend。
& lt/在ClassView中添加SCommTestDlg類公共成員函數,並輸入相應的代碼;
//十六進制發送空格框的格式轉換功能有限,每兩個字符之間要插入壹個字符。
//例如:A1 23 45 0B 00 29
//CByteArray是壹個動態字節數組,可以在MSDN幫助中找到。
CSCommTestDlg的解釋:(String2Hex中的string2 hex,CByteArray中的SendData)
{
說明hexdata是lowhexdata
解釋hexdatalen = 0;
解釋壹下Ryan = str。GetLength();....../& gt;發送數據。SetSize(LEN/2);
(INT I = 0;我
{
Characters LSTR,hstr = STR[I];
(hstr == ' ')
{
+ +;
繼續;
}
+ +;
(& gt= LEN)
突破;
LSTR = STR[I];
hex data ConvertHexChar(hstr);
lowhexdata ConvertHexChar(LSTR);
((hex data = = 16)| |(lowhexdata = = 16))
突破;
其他的
hex data = hex data * 16+low hex data
i++;
a send data[hexdatalen]=(character)hexdata ";
hexdatalen++;
}
返回hexdatalen
}
//這是壹個將字符轉換成相應十六進制值的函數。
//C語言的書很多,可以在
//函數:將0到f之間的字符轉換成相應的十六進制字符,或者返回-1。
CHaracter CSCommTestDlg::ConvertHexChar(CHaracter ch)
{
((CH & gt= ' 0 ')& amp;& amp(CH & lt= '9' ))
返回CH-0x 30;
否則,如果((CH & gt= ' A ')& amp;& amp(CH & lt='F '))
返回CH-' A '+10;BR/>;否則,如果((CH & gt= ' A ')& amp;& amp(CH & lt='F '))
返回CH-' A '+10;
否則返回(-1);....../& gt;}
cscommtestdlg::onbuttonmanualsend()的開銷如下:
無效的cscommtestdlg::onbuttonmanualsend()/> {
//TODO:在此添加控件通知處理程序代碼。
update data(TRUE);//讀取編輯框的內容
(m _ ctrlHexSend。get check())/& gt;
CByteArray hexdata
解讀瑞安?(m _ strTXData hex data);//返回可以用LEN String2Hex,這個數來計算發送的十六進制數。
m _ ctrl comm . set output(Cole Variant的十六進制數據)//發送十六進制數據。
}
其他的
cole variant的M _ ctrlcomm集合輸出((m _ strtdata));//發送
{的ASCII字符數據
現在,連接第壹個串口,打開串口調試助手V2.1,選擇十六進制顯示,設置對應的串口,然後運行這個程序,發送盒子,輸入00 01 02 03 A1 CC十六進制字符,選擇發送十六進制串口調試助手到接收盒子,點擊“手動發送00 065433”。
9。接收框,以十六進制顯示
這個很簡單:在主對話框中,壹個復雜的選舉按鈕IDC_CHECK_HEXDISPLAY解釋:十六進制顯示,然後使用類向導添加控件變量:m_ctrlHexDiaplay。然後在OnComm()函數中使用CSCommTestDlg::命令:
OnComm()中的CSCommTestDlg::無效
{
//TODO:在此添加控制通知處理程序代碼
COleSafeArray safearray_inp
長度,k;
BYTE RXDATA[2048]//設置字節數組的8位integerthat,無簽名。
CString的Strtemp
(m _ ctrlcomm。get comment()= = 2)//事件接收緩沖區中的字符。
{
variant_inp = m_ctrlComm。GetInput();//讀取緩沖區
safearray _ inp variant _ inp//由variant變量轉換的ColeSafeArray變量。
LEN = safearray_inp。GetOneDimSize();//獲取有效數據長度
(k = 0;& ltLEN++變量)
safearray_inpGetElement(&K,RXDATA+K);//轉換為字節數組
(k = 0;& ltLEN++)//數組轉換為CSTRING
{
(RXDATA+K)的字節BT =(char *);//字符
If (m_ctrlHexDisplay。GetCheck())
strtemp。f?格式(" %02X ",BT);//臨時變量strtemp以十六進制模式存儲字符。請註意,這裏添加了壹個空格。
其他的
strtemp。f?format(" % C ",BT);//字符被發送到臨時變量strtemp存儲區。
m _ str xdata+= strtemp;//與接收控件編輯框對應的字符串。
}
} update data(FALSE);//更新編輯框的內容
}
測試:00 01 02 03 A1 CC十六進制字符框,輸入十六進制串口調試助手發送,選擇發送。所選程序運行後,點擊“手動發送十六進制串口調試助手”,點擊手動傳輸或自動傳輸。接收盒應該能在節目中看到0010203A 1 cc。
10。如何設置最簡單的()函數設置自動傳輸周期SetTimer,對數據采集有用的傳輸控制指令可以用於定時傳輸。
:在ClassWizard中選擇MessageMap card,然後選擇CSCommTestDlg類作為對象ID,然後在消息框中選擇WM_TIMER message,點擊CSCommTestDlg::的OnTimer(UINT nIDEvent)函數,該函數在ADD_FUNCTION中無效。該函數放置在指定的時間來處理代碼:
CSCommTestDlg的on time(UINT nIDEvent)無效::
{
//TODO:在此添加消息處理程序代碼和/或調用default。
OnButtonManualsend();
CDialog的::的on timer(nIDEvent);
}
在主對話框中添加壹個檢查按鈕的ID IDC_CHECK_AUTOSEND標題:自動發送(周期1秒),然後使用ClassWizard添加BN_CLICK消息處理函數Void CSCommtestdlg::oncheckautosend():
無效的cscommtestdlg::oncheckautosend(){
//TODO:在此添加控件通知處理程序代碼。
m_bAutoSend =!m _ bAutoSend
(m _博托森)
{
SetTimer的(1,1000,NULL);//時間是1000ms。
}
其他的
{ BR/& gt;KillTimer函數(1);//取消計時
}
}
在ClassView: m_bAutoSend BOOL變量中添加CSCommTestDlg類,並在構造函數中初始化:
m _ bAutoSen = FALSE
現在,您可以運行程序進行測試。
11。變量數據類型呢?如何使用VARIANT數據類型?
不知道如何使用VARIANT數據類型,很多朋友對新的數據類型VARIANT很頭疼。SetOutput()函數需要VARIANT參數,也可以使用COleVARIANT的類來構造壹個簡單的發電機組。現在變成了GetInput()函數的返回值variant類型,那麽如何從返回值中提取有用的內容呢?Cole VARIANT的主要ole自動變速器數據源自VARIANT。其實VARIANT只是壹個新的定義,它填充了結構,包括壹個並集,以壹個變量作為主要成員。各種數據的聯合體,以及用來指定數據類型的變量,目前由聯合體中的成員組成。我們關心的是將接收到的數據存儲在數據聯邦成員國中。聯合體中包含許多類型的數據,從簡單的變量到非常復雜的數組和指針。通過串口接收到的往往是壹個字節串,我們會用數組或者指針來訪問接收到的數據。這裏我給大家推薦的是壹個類型變量指向壹個SAFEARRAY(COleSafeArray)。顧名思義,新的數據類型SAFEARRAY是壹個“安全數組,它可以根據系統環境自動調整其16或32位的定義,而不是OLE變化之間的轉換(有些類型,如BSTR,在16或32位OLE應用程序中是損壞的二進制數據)。我們不知道SAFEARRAY的具體定義,只知道它是壹個結構,裏面包含壹個pvData的指針(void *),指向存儲有用數據的內存。總之,GetInput()函數返回的VARIANT變量標識Parry的指針,標識pvData的指針訪問數組以獲得SAFEARRAY的指針變量接收的數據。具體應用請參考無效CSCommTestDlg的OnComm()函數::。
大概這個問題我自己也說不清。從我第壹次接觸到這個東西,我就說,別人還不清楚。
BR/>;另壹個問題:對於二進制收發器的設置,請參考MSComm控件的描述。