古詩詞大全網 - 個性簽名 - MSP430F4152之間的異步通信實現發送和接收字符型數組。雙方是怎麽設定的?目前接收最後壹個字符,覆蓋前面的字符。

MSP430F4152之間的異步通信實現發送和接收字符型數組。雙方是怎麽設定的?目前接收最後壹個字符,覆蓋前面的字符。

串行調試助手源碼

(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控件的描述。