第一篇:arduino mega 2560 串口
arduino mega 2560 串口
2560的串口一共有4個,分別對應(yīng)數(shù)字接口0-1,18-19,16-17,14-15所有串口都可以跟pc通信,但只有0-1是跟板子上的usb2ttl連接,只有0-1是可以用來下載程序的,即使購買了usb2ttl的線,在0-1以外的串口也不能用來下載,除非修改bootloader將藍(lán)牙模塊接在14-15上(注意藍(lán)牙的rx、tx跟板子上的rx、tx要反接)程序里面可以用serial3.read()等類似操作程序里面serial操作0-1,serial1操作18-19,serial2操作16-17,serial3操作14-15這樣使用usb線下載程序同時可以用藍(lán)牙接收數(shù)據(jù)到電腦上。
串口通訊中最重要的一點就的通訊協(xié)議,一般串口通訊協(xié)議都會有波特率、數(shù)據(jù)位、停止位、校驗位等參數(shù)。大家不會設(shè)置也不用怕,Arduino語言中Serial.begin()函數(shù)就能使大家輕松完成設(shè)置,我們只需要改變該函數(shù)的參數(shù)即可,例如Serial.begin(9600),則表示波特率為9600bit/s(每秒比特數(shù)bps),其余參數(shù)默認(rèn)即可。
Arduino語言中還提供了Serial.available()判斷串口緩沖器狀態(tài)、Serial.read()讀串口、Serial.print()串口發(fā)送及Serial.println()帶換行符串口發(fā)送四個函數(shù)。
下面用一段代碼來演示這些函數(shù)的用途。無須外圍電路,只需要將下載的USB線連接即可。char word;void setup(){ Serial.begin(9600);// 打開串口,設(shè)置波特率為9600 bps } void loop(){ if(Serial.available()> 0)//判斷串口緩沖器是否有數(shù)據(jù)裝入 { word = Serial.read();//讀取串口 if(word=='a')//判斷輸入的字符是否為a { Serial.print(“DFRobot ”);//從串口發(fā)送字符串 Serial.println(“is NO.1”);//從串口發(fā)送字符串并換行 } } }
編譯下載完程序后,點紅圈里的按鈕,打開串口監(jiān)視器;
選擇串口監(jiān)視器的波特率為9600bps,在發(fā)送框里填上字母a,點send發(fā)送,下面的顯示框里就會顯示返回的數(shù)據(jù),如果發(fā)送的是字母a,則顯示字符串,否則無返回。
第二篇:單片機串口總結(jié)
51單片機串口總結(jié)
有句話說“盡信書不如無書”,要學(xué)好單片機就要不斷的、大膽的實驗,要多懷疑,即使我們的懷疑最終被證明是錯誤的那么這也是進步(人們認(rèn)識事物很多情況下來源于懷疑),當(dāng)懷疑出現(xiàn)時就要去實踐。有很多東西如果不通過實踐是不可能掌握其中隱藏的奧秘,就拿51單片機串口通訊這一塊,我認(rèn)為掌握很好了,可以很輕松的實現(xiàn)數(shù)據(jù)的接收、發(fā)送,但這段時間當(dāng)我重新學(xué)習(xí)串口時,我才發(fā)現(xiàn)里面還有很多小細(xì)節(jié)從沒注意,更別說研究了。對于接收發(fā)送程序永遠(yuǎn)是按照別人的模式來編寫程序,并沒有真真正正的挖掘深層次的內(nèi)容。我身邊太多的人在臨摹別人的程序,當(dāng)然我不反對,但是希望自己多問幾個問什么,單純的會編程是學(xué)不好單片機的,畢竟單片機有自己獨特的硬件結(jié)構(gòu)。
開講之前先簡要說一下同步、異步通信:
同步通信:發(fā)送方時鐘對接收方時鐘控制,使雙方達(dá)到完全同步。
異步通信:發(fā)送與接受設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接受過程(雖然時鐘不同,但一般相差不大)。
51單片機串行口結(jié)構(gòu)
從上圖中我們看到,51單片機有兩個物理上獨立的接收、發(fā)送緩沖器SBUF,它們共用同一個地址99H,但是請注意:接收緩沖器只能讀而不能寫,發(fā)送緩沖器只寫不讀。單片機可以同時實現(xiàn)數(shù)據(jù)的發(fā)送與接收功能。
特別注意:接收器是雙緩沖結(jié)構(gòu):當(dāng)前一個字節(jié)從接收緩沖區(qū)取走之前,就已經(jīng)開始接收第
二個字節(jié)(串行輸入至移位寄存器),此時如果在第二個字節(jié)接收完畢而前一個字節(jié)還未被讀走,那么就會丟失前一個字節(jié)。
51單片機串口控制寄存器
關(guān)于51單片機的控制寄存器各個位表示的含義在這里我只談SM2。
SM2為多機控制位,主要用于工作方式2和3,當(dāng)接收機的SM2=1時,可以利用接收到的RB8來控制是否激活RI(RB8=0不激活RI,收到的數(shù)據(jù)丟失;RB8=1時收到的數(shù)據(jù)進入SBUF,并激活RI ,進而在中斷服務(wù)程序中將數(shù)據(jù)從SBUF中讀走)。當(dāng)SM2=0時,不論收到的RB8為何值都將使接收到的數(shù)據(jù)進入SBUF,并激活RI,通過控制SM2實現(xiàn)多機通信。
51單片機串口通訊方式
51串口通訊方式有3種,方式0、方式
1、方式2與方式3,他們的工作模式不盡相同。首先他們的波特率很容易忽視。方式0與方式2的波特率固定,而方式1和3的波特率由T1的溢出率決定。
方式0的波特率=f/12
系統(tǒng)晶振的12分頻,換句話說12M晶振的情況下,其波特率可達(dá)1M,速度是很高的(當(dāng)我們在選用串行器件并采用方式0時需要特別注意器件所能允許的最大時鐘頻率)。
方式2 =f/64或f/32(當(dāng)SMOD=1時為f/32,SMOD=0時為f/64)。
曾經(jīng)我用方式2進行MODBUS通信時,總是通訊失敗,我仔細(xì)檢查程序,沒有發(fā)現(xiàn)邏輯錯誤,特別是當(dāng)我參考別人的程序時,發(fā)現(xiàn)很少有人用方式2進行MODBUS通訊,所以當(dāng)時自己妄下結(jié)論51單片機的串行方式2不可用,直到有一天夜里我突然想起方式2的波特率是固定的,試想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能通信成功。這才恍然大悟,看來還是自己太武斷了,沒有認(rèn)真看書啊。有時我們認(rèn)為我們犯這樣的錯誤很低級,其實我們很多次都是因為這樣的小細(xì)節(jié)導(dǎo)致我們整個系統(tǒng)不正常,正所謂“千里之堤毀于蟻穴”,這些細(xì)節(jié)真的傷不起啊。
方式1、3波特率=(2smod/32)*T1的溢出率,其中TI的溢出率=f/{12*[256-(TH1)]}.關(guān)于3種通訊方式其中有幾點特別容易出錯:
1、無論采用哪種通訊方式,數(shù)據(jù)發(fā)送和接受都是低位在先,高位在后。、3種方式作為輸出,由于輸出是CPU主動發(fā)送,不會產(chǎn)生重疊錯誤,當(dāng)數(shù)據(jù)寫入SBUF后,發(fā)送便啟動(通過單片機內(nèi)部邏輯控制,與程序無關(guān)),當(dāng)該字節(jié)發(fā)送結(jié)束(SBUF空),置TI。不要理解為當(dāng)數(shù)據(jù)一寫入SBUF就置位TI,如果中斷允許則在中斷中發(fā)送數(shù)據(jù),這就大錯特錯了。同樣作為輸入,可能會產(chǎn)生重疊錯誤(主要依賴于特定的環(huán)境),當(dāng)一個字節(jié)的數(shù)據(jù)接收完畢(SBUF滿)置位RI,表示緩沖區(qū)有數(shù)據(jù)提示CPU讀取。
接下來通過一些實驗具體說明串口通信中需要注意的地方 方式0輸出
方式0主要功能是作為移位寄存器,將數(shù)據(jù)從SBUF中逐位移出,最常見的用法就是外接串入并出的移位寄存器,如74LS164。之前在做這一部分實驗時總是利用單片機I/O端口模擬實現(xiàn),現(xiàn)在想想在串口未被占用的情況下,方式0是最好的實現(xiàn)方式。
利用串口方式0,向74LS164輸出字符“0”的編碼,程序如下:
該程序采用了中斷方式實現(xiàn),結(jié)果是通過74LS164使數(shù)碼管顯示“0”。實驗結(jié)果如下:
這里我說明幾點: 如果采用查詢方式,并且只發(fā)送一遍,那么程序最后的while(1);不可以省略,否則會出現(xiàn)數(shù)碼管閃爍的現(xiàn)象(在KEIL環(huán)境下,main()函數(shù)也是作為一個調(diào)用函數(shù),最后也有返回RET,它不像C中的main()函數(shù),當(dāng)執(zhí)行完畢后就停止,而是重新復(fù)位執(zhí)行,如此反復(fù),這一點要特別注意)
這是查詢方式下不加while(1);的現(xiàn)實效果 如果采用中斷方式發(fā)送,請記得中斷中清除TI,僅僅是為了解除中斷標(biāo)志,而不是等待發(fā)送結(jié)束,因為此時數(shù)據(jù)早已離開了SBUF跑到外邊去了。3 74LS164最高25MHZ,采用方式0,沒有問題。
方式0作為輸入模式
以74ls165(最高時鐘25MHZ)為例,可以滿足要求。
對應(yīng)結(jié)果如下:
(注意:74ls165線傳送高位,而串口通信低位在先,所以顯示的數(shù)據(jù)和實際數(shù)據(jù)高低位正好相反
P1.7---P1.0對應(yīng)D0---D7)。
本程序只接收一次,也許有人會問,中斷程序中REN=0,表示什么意思?可不可以改成ES=0?
這個問題很好,首先REN=0表示接收禁止,即不允許串口接收數(shù)據(jù);ES=0是禁止中斷和單片機是否接收數(shù)據(jù)沒有關(guān)系,不接收數(shù)據(jù)自然中斷允許也是徒勞,這兩者有很大的區(qū)別。我們在很多接收程序中經(jīng)常可以看到在判斷RI標(biāo)志后緊跟著清除標(biāo)志位,我想問一下,為什么?)
如果我們也按照這種模式改寫會怎樣呢?
實驗結(jié)果如下
兩次結(jié)果差異怎么這么大?為什么會這樣子?
為了便于理解,也為了說明問題方便,對中斷程序做了如下處理:
結(jié)果又變了
是不是感覺很奇怪,究竟咋回事呢?
首先中斷程序中當(dāng)判斷RI置位標(biāo)志后緊跟著清零是為了接收下一個字節(jié)的數(shù)據(jù),也為了避免單片機重復(fù)中斷。
當(dāng)51單片機串口方式0作輸入時,在REN=1且RI=0的條件下就啟動了單片機串口接收過程。如果有一個條件不滿足就不能啟動接收過程,以上出現(xiàn)的錯誤正式由于忽略了這個重要的因素造成的。在RI清零后由于REN仍然為1,單片機已經(jīng)開始接收第二字節(jié)的數(shù)據(jù),由于串口速度很快,RI仍會置位,而緊接著將REN清零只能阻止單片機接收數(shù)據(jù),但是卻
不能阻擋第二次中斷。由于只接收了部分外部引腳數(shù)據(jù)(此時外部引腳為高電平,即邏輯1,其實單片機只接收了一位,對于12M晶振而言,方式0大約8us接收一個字節(jié)數(shù)據(jù))。相反在RI=0與REN=0之間加上適當(dāng)?shù)难舆t,就可以保證一個字節(jié)的數(shù)據(jù)全部接收完畢,故此時我們讀上來的一個字節(jié)為0xff。
我在中斷程序中添加了一個中斷計數(shù)器(不加延遲),發(fā)現(xiàn)中斷服務(wù)程序的確執(zhí)行了兩次
結(jié)果如下
加上延遲結(jié)果
這就驗證了剛才的結(jié)論。
至于說可不可以換做ES=0,回答是可以的,盡管同樣可以實現(xiàn)數(shù)據(jù)的讀取,但是實質(zhì)不同,當(dāng)禁止中斷后,單片機仍在接收外部數(shù)據(jù),只是不再請求中斷,自然的不再讀取第2、3。。。字節(jié)的數(shù)據(jù),那么P1將保留第一次中斷時從SBUF中讀出的數(shù)據(jù)。如果某一時刻打開中斷發(fā)現(xiàn)結(jié)果不正常,如果理解了上面的機制就不會覺得驚訝了。建議:單次接收時,中斷服務(wù)程序中REN清零放在RI之前。
還有一個問題非常重要:
如果我在中斷服務(wù)程序中不清除RI,會怎樣?
很少有人會這樣用,但是經(jīng)常有人忘記了(包括我)。課本上寫得很清楚,務(wù)必在中斷中用軟件清除RI,為什么要這樣呢?難道僅僅是為了接收下一次數(shù)據(jù)并且避免單片機不斷的響應(yīng)中斷?的確如此,如果對于一個小系統(tǒng)而言,不清除中斷標(biāo)志,那么單片機將不停的中斷,影響接下來任務(wù)的執(zhí)行,系統(tǒng)必然癱瘓,而且不能正常的接收數(shù)據(jù)??偨Y(jié):方式0作為發(fā)送方,只要向SBUF中寫入數(shù)據(jù)就啟動了發(fā)送過程;
方式0在座位接收模式時,REN=
1、RI=0的情況下就已經(jīng)啟動了接收過程。在中斷程序中要注意兩者清零的順序。
還有一種情況要特別注意:單片機復(fù)位時SCON自動清零,如果單片機不工作在方式0,那么如果采用位操作SCON時也要注意REN=1與SM0、SM1的書寫順序,總之切記方式0啟動發(fā)送、接收數(shù)據(jù)的條件。
方式1 方式1為10位異步通信模式。作為輸出和方式0沒有本質(zhì)的區(qū)別,不同的是數(shù)據(jù)幀的形式,但是對于接受模式則有點不同,當(dāng)REN=1且RI=0時,單片機并不啟動接收過程。而是以已選擇波特率的16倍速率采樣RXD引腳的電平,當(dāng)檢測到輸入引腳發(fā)生1---0負(fù)跳變時,則說明起始位有效,才開始接受本幀數(shù)據(jù)。方式1模式下 單片機可以工作在全雙工以及半雙工方式。下面舉兩個例子
半雙工
主機發(fā)送某一字符,從機接收到數(shù)據(jù)后返回數(shù)據(jù)加1的值 比如 主機發(fā)送“1“,從機收到后回復(fù)主機”2“。實驗結(jié)果如下:
方式1工作方式主要注意: 1 波特率可變。數(shù)據(jù)接收以起始位為標(biāo)志,停止位結(jié)束。當(dāng)RI=0且SM2=0或接收到有效停止位時,單片機將接收到的數(shù)據(jù)移入SBUF中,兩個條件缺一不可。
方式2和方式3 方式2和3不同的只是波特率,這里以方式3為例
作為輸出模式同方式1沒有區(qū)別,只是增加了第八位數(shù)據(jù)位,第八位數(shù)據(jù)可以用作校驗位或在多機通信中用作數(shù)據(jù)/地址幀的判別位。
首先我們來做模擬主從奇偶校驗?zāi)J?/p>
主機發(fā)送一幀數(shù)據(jù),并發(fā)送奇偶校驗位,從機接收數(shù)據(jù)后,判斷數(shù)據(jù)是否正確,如果正
確,接收指示燈亮,并且回送主機數(shù)據(jù)加1,反之回送0;主機接收從機信息,如果校驗正確點亮LED指示燈.(從機、主機接收數(shù)據(jù)無論校驗正確與否,均顯示接收到的字節(jié)數(shù)據(jù))。奇校驗?zāi)J?演示結(jié)果如下:
(注:從接接收不正確,返回0)
主從機接收正確效果
之前我們已經(jīng)介紹了SM2的具體用法,主要用于多機通信,將SM2作為數(shù)據(jù)/地址幀 的判別位,在接收地址時令SM2=1,當(dāng)接收到的第八位數(shù)據(jù)為1時激活RI產(chǎn)生中斷,然后比較地址,如果地址符合則清除SM2準(zhǔn)備接受數(shù)據(jù)信息,反之不理睬。
特別注意 當(dāng)RI=0且SM2=0(或SM2=1時接收到第9位數(shù)據(jù)為1)時,單片機將接收到的數(shù)據(jù)移入SBUF中,兩個條件缺一不可。
在這里我只舉一個簡單的例子 一個主機,兩個從機 起始時,主機從機的SM2均置位,所有的從機等待主機發(fā)送地址幀,主機令TB8=1,發(fā)送地址幀。所用的從機將接受到的地址和自己的地址比較,如果符合,點亮LED指示燈,清除SM2(準(zhǔn)備接受主機發(fā)送的數(shù)據(jù)幀),并將自己的地址發(fā)送到主機。主機接收從機發(fā)送的地址信息,如果地址符合則數(shù)碼管顯示從機地址并開始準(zhǔn)備發(fā)送數(shù)據(jù),反之發(fā)復(fù)位信號,TB8=1。從機接收數(shù)據(jù)先判斷RB8,如果RB8=1,則復(fù)位,重新開始接收主機發(fā)送的地址幀,反之通過P1口外接數(shù)碼管顯示接收到的數(shù)據(jù)。實驗結(jié)果如下:
注意:如果主機沒有得到正確的地址,則將按照一定的速率發(fā)送地址幀,直到接收正確的地址為止,該試驗主機向從機2發(fā)送信息。
另外在這里我補充兩點: 我們可以很方便的利用串口通信的工作方式2或3實現(xiàn)奇偶校驗,注意技巧,當(dāng)為偶校驗時TB8=P,奇校驗時TB8=~P;
2當(dāng)單片機利用中斷發(fā)送大量數(shù)據(jù)時,盡量采用中斷發(fā)送,因為單片機在寫入SBUF數(shù)據(jù)后由硬件將數(shù)據(jù)發(fā)送完,在發(fā)送過程中,單片機還可以做很多事情,利用中斷發(fā)送數(shù)據(jù)可以提高CPU利用率。尤其在低波特率時效果更明顯。
第三篇:串口通信實驗報告范文
華南農(nóng)業(yè)大學(xué)
實驗報告
----------目錄----------
1、實驗任務(wù)和目的..............................................................................................................2、實驗準(zhǔn)備..........................................................................................................................3、實驗步驟................................................................................................................................4、實驗分析與總結(jié)....................................................................................................................(1)、分析.............................................................................................................................(2)、總結(jié).............................................................................................................................1、實驗任務(wù)和目的
了解串行通信的背景知識后,通過三線制制作一條串口通信線(PC-PC),并編程實現(xiàn)兩臺PC間通過RS-232C通信。要求兩臺PC機能進行實時的字符通信,并了解工業(yè)自動化控制中的基本通信方式。
2、實驗準(zhǔn)備
1、檢查PC是否具有串行通信接口,并按其針腳類準(zhǔn)備一條串口通信線纜。
2、串口包的安裝,下載javacomm20-win32.zip并解壓,將win32com.dll復(fù)制到
3、實驗步驟
1、將實驗所需RS-232纜線準(zhǔn)備好,并將JAVA串口包復(fù)制到相應(yīng)地目錄下。
2、查找有關(guān)串口通信的書籍以及在網(wǎng)上查找相應(yīng)地串口通信代碼。
3、用JAVA編程軟件JCreator編寫代碼。
4、實驗分析與總結(jié)
(1)、分析
(I)、對串口讀寫之前需要先打開一個串口并檢測串口是否被占用: public void open(){//打開串口以及輸入輸出流
recieve=false;
try
{serialPort=(SerialPort)portId.open(“Serial Communication”, 2000);}
catch(PortInUseException e){System.out.println(“端口正被占用!”);}
try
{serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);}
catch(UnsupportedCommOperationException e){System.out.println(“不支持通信”);}
try
{
outputStream=serialPort.getOutputStream();
inputStream=serialPort.getInputStream();
1-完整運行程序如圖所示:
圖1
(2)、總結(jié)
通過本次串口實驗,我對串口通信的知識了解的更透徹,這是在剛開始對串口通信知識不了解的情況下就編程而造成許多錯誤之后才得到的結(jié)果。在網(wǎng)上查找資料的時候也接觸到了不少其他的編程語言例如VB,delphi,C#等,這也讓我對這些從沒有學(xué)過的語言有所了解,我想這些知識對以后的實驗工作都有幫助。
3--
第四篇:串口通訊實驗報告
網(wǎng)絡(luò)編程與實踐實驗報告
實驗內(nèi)容:串口通信編程 學(xué)號:S201502189 姓名:職榮豪 日期:2015-9-28
一、實驗要求
使用VS2010編寫基于對話框的MFC應(yīng)用程序,兩個窗口分別使用兩個串口,使得這兩個窗口可以進行通信,包括數(shù)據(jù)的發(fā)送與接收。
二、實驗原理
本實驗使用Microsoft Communications Control控件,利用這個ActiveX控件,只需要編寫少量代碼即可輕松進行通信。
該控件相關(guān)的函數(shù)如下: put__CommPort:設(shè)置串口號
put_Settings:以字符串的形式設(shè)置波特率、奇偶校驗位(n-無校驗,e-偶校驗,o-奇校驗)、數(shù)據(jù)位數(shù)、停止位數(shù)
put_InputMode:設(shè)置接收數(shù)據(jù)的類型(0-文本類型,1-二進制類型)put_InputLen:設(shè)置從接收緩沖區(qū)讀取的字節(jié)數(shù),0表示全部讀取 put_InBufferSize:設(shè)置接收緩沖區(qū)大小 put_OutBufferSize:設(shè)置發(fā)送緩沖區(qū)大小
put_RThreshold:設(shè)定當(dāng)接收幾個字符時觸發(fā)OnComm事件,0表示不產(chǎn)生事件,1表示每接收一個字符就產(chǎn)生一個事件
put_SThreshold:設(shè)定在觸發(fā)OnComm事件前,發(fā)送緩沖區(qū)內(nèi)所允許的最少的字符數(shù),0表示發(fā)送數(shù)據(jù)時不產(chǎn)生事件,1表示當(dāng)發(fā)送緩沖區(qū)空時產(chǎn)生OnComm事件
put_PortOpen:打開或關(guān)閉串口,傳入?yún)?shù)為true時打開串口,傳入?yún)?shù)為false時關(guān)閉串口 get_CommEvent:獲得串口上剛發(fā)生的事件,事件值為2表示接收到數(shù)據(jù)
get_InBufferCount:獲得緩沖區(qū)中的數(shù)據(jù)位數(shù)
get_Input:獲取緩沖區(qū)數(shù)據(jù),返回類型為VARIANT put_Output:發(fā)送數(shù)據(jù)
三、設(shè)計思路
需要添加一個Microsoft Communications Control控件,用于進行串口通信。由于要求同一程序可運行兩個窗口進行相互通信,需要兩個窗口開啟兩個不同串口,故需要添加一個Edit Control控件用于輸入串口號,并添加打開串口按鈕,在點擊該按鈕時對串口控件的參數(shù)進行設(shè)置并開啟串口。同時添加關(guān)閉串口按鈕,點擊后關(guān)閉串口并可以對串口號進行修改。
需要添加兩個Edit Control 分別用于顯示接收到的數(shù)據(jù)以及輸入要發(fā)送的數(shù)據(jù)。需要添加一個發(fā)送按鈕,點擊后發(fā)送輸入的數(shù)據(jù)。
四、實驗步驟
1.建立基于對話框的MFC應(yīng)用程序 2.添加界面控件并設(shè)置ID與Caption 添加Microsoft Communications Control控件,用于進行串口通信 添加一個Edit Control控件,用于輸入串口號,ID設(shè)置為IDC_PORT 添加一個Static Text控件,用于標(biāo)注端口號,將Caption設(shè)置為“串口號:”
添加兩個按鈕,分別用于打開串口、關(guān)閉串口。IDC分別設(shè)置為IDC_BTN_OPEN、IDC_BTN_CLOSE,Caption分別設(shè)置為“打開”、“關(guān)閉” 添加兩個Edit Control,分別用于顯示接收到的數(shù)據(jù)以及輸入要發(fā)送的數(shù)據(jù),ID分別設(shè)置為IDC_RECEIVE、IDC_SEND 添加兩個Static Text控件,用于標(biāo)注接收區(qū)與發(fā)送區(qū),Caption分別設(shè)置為“接收區(qū)”、“發(fā)送區(qū)”
添加一個按鈕用于發(fā)送數(shù)據(jù),ID設(shè)置為IDC_BTN_SEND,Caption設(shè)置為“發(fā)送” 調(diào)整控件的大小與位置。
完成后如圖:
3.給控件綁定變量
右鍵單擊Microsoft Communications Control控件,選擇“添加變量”,變量名為m_com 打開類向?qū)Ыo控件添加變量:
給IDC_PORT綁定變量,用于存放輸入的端口號,數(shù)據(jù)類型為int,變量名為m_port 給IDC_RECEIVE綁定變量,用于存放接收到的數(shù)據(jù),數(shù)據(jù)類型為CString,變量名為m_strReceive 給IDC_SEND綁定變量,用于存放輸入的待發(fā)送的數(shù)據(jù),數(shù)據(jù)類型為CString,變量名為m_strSend
4.給控件添加事件響應(yīng)函數(shù)
右鍵單擊Microsoft Communications Control控件,選擇“添加事件處理程序”,點擊“添加編輯”,生成響應(yīng)函數(shù),此函數(shù)用于接收數(shù)據(jù)。
在函數(shù)中添加以下代碼:
UpdateData(TRUE);if(nEvent == 2){
} UpdateData(FALSE);//將m_strReceive的值顯示到控件中
//更新m_strReceive的值
//獲取事件值
//獲取緩沖區(qū)位數(shù)
//時間值為2,此時為收到數(shù)據(jù) int nEvent = m_com.get_CommEvent();int k = m_com.get_InBufferCount();if(k <= 0)//位數(shù)小于等于0時則返回 return;char* str =(char*)m_com.get_Input().parray->pvData;//獲取接收到數(shù)據(jù)的字*(str + k)= '