自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第1頁(yè)
自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第2頁(yè)
自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第3頁(yè)
自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第4頁(yè)
自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、自己動(dòng)手編寫 串口動(dòng)態(tài)庫(kù)手把手教你編寫串口調(diào)試助手,單片機(jī)串口程序一、串口庫(kù)源碼: 自行在 vc6 中建立動(dòng)態(tài)庫(kù)工程#includestdafx.h#include#include#include#include#include resource.h/* 導(dǎo)出函數(shù) */ 函數(shù)參數(shù):串口名 :com1 波特率: 9600 用于顯示接收數(shù)據(jù)的文本框的句柄externc _declspec (dllexport) void entry(char *comname, int baudrate, hwnd rhbox); externc _declspec (dllexport) bool openpo

2、rt(char *portname); externc _declspec (dllexport) bool setupdcb(int rate_arg); externc _declspec (dllexport) void settimeout( int a, int b, int c, int d, int e); / 發(fā)送字符或 16進(jìn)制數(shù)externc _declspec (dllexport) void sendchar( unsigned char ch); / 顯示方式: 1:hex 0 :charexternc _declspec (dllexport) void displ

3、ayhex(int flag); externc _declspec (dllexport) void close(); / 只使用上面有注釋的三個(gè)函數(shù)即可handle hcomm;/ 串口的句柄overlapped m_ov;/ 是一個(gè)包含了用于異步輸入輸出的信息的結(jié)構(gòu)體comstat comstat;/ 包含串口結(jié)構(gòu)信息handle hthread1; / 讀線程句柄handle hthread2; / 寫線程句柄hwnd hrbox; bool sendflag = false ; unsignedchar sendchar, receivechar; bool displayhex =

4、 false ; processerrormessage( char * errortext)/ 打印進(jìn)程錯(cuò)誤信息 char *temp = new char 200; lpvoid lpmsgbuf; formatmessage( format_message_allocate_buffer | format_message_from_system, null, getlasterror(), makelangid(lang_neutral, sublang_default), / default language (lptstr)&lpmsgbuf, 0, null ); spri

5、ntf(temp, warning: %s failed with the following error: n%snport: %dn, ( char*)errortext, lpmsgbuf, com2); messagebox(null, temp, application error, mb_iconstop); localfree(lpmsgbuf); delete temp; returntrue ; /*打開串口 */bool openport(char *portname) hcomm = createfile(portname, generic_read | generic_

6、write, 0, 0, open_existing, file_flag_overlapped, 0); if (hcomm = invalid_handle_value) return false; elsereturntrue ; /*設(shè)備控制塊的設(shè)置 */ 參數(shù) 波特率 rate_arg : 9600bool setupdcb(int rate_arg) dcb dcb; int rate = rate_arg; memset(&dcb, 0, sizeof (dcb); / 申請(qǐng)一個(gè) dcb 結(jié)構(gòu)體空間if (!getcommstate(hcomm, &dcb) /

7、獲取當(dāng)前 dcb 配置 processerrormessage( getcommstate() ); / 打印錯(cuò)誤信息return false; /* - */ 配置當(dāng)前串口dcb.dcblength = sizeof (dcb); /* -串口的配置 - */dcb.baudrate = rate; dcb.parity = noparity; dcb.fparity = 0; dcb.stopbits = onestopbit; dcb.bytesize = 8; dcb.foutxctsflow = 0; dcb.foutxdsrflow = 0; dcb.fdtrcontrol = d

8、tr_control_disable; dcb.fdsrsensitivity = 0; dcb.frtscontrol = rts_control_disable; dcb.foutx = 0; dcb.finx = 0; /* -其他參數(shù)的設(shè)置 - */dcb.ferrorchar = 0; dcb.fbinary = 1; dcb.fnull = 0; dcb.fabortonerror = 0; dcb.wreserved = 0; dcb.xonlim = 2; dcb.xofflim = 4; dcb.xonchar = 0 x13; dcb.xoffchar = 0 x19; d

9、cb.evtchar = 0; /* - */ 用上面的設(shè)備控制塊來設(shè)置當(dāng)前串口if (!setcommstate(hcomm, &dcb) processerrormessage( setcommstate() ); returnfalse ; elsereturntrue ; / 設(shè)置成功 /*超時(shí)的設(shè)置 */bool setuptimeout(intreadinterval, intreadtotalmultiplier, intreadtotalconstant, intwritetotalmultiplier, int writetotalconstant) commtime

10、outs timeouts; timeouts.readintervaltimeout = readinterval; / 讀間隔超時(shí)timeouts.readtotaltimeoutconstant = readtotalconstant;/ 讀時(shí)間常量timeouts.readtotaltimeoutmultiplier = readtotalmultiplier;/ 讀時(shí)間系數(shù)timeouts.writetotaltimeoutconstant = writetotalconstant;/ 寫時(shí)間常量timeouts.writetotaltimeoutmultiplier = write

11、totalmultiplier;/ 寫時(shí)間系數(shù)if (!setcommtimeouts(hcomm, &timeouts) / 設(shè)置當(dāng)前串口的超時(shí)設(shè)置 processerrormessage( setcommtimeouts() ); returnfalse ; elsereturntrue ; void receivechar() bool bread = true; bool bresult = true; dword dwerror = 0; dword bytesread = 0; char rxbuff; / 接收數(shù)據(jù)緩沖器char str10; for (;)/ 死循環(huán)等待

12、 sleep(100); bresult = clearcommerror(hcomm, &dwerror, &comstat);/ 清除硬件的通訊錯(cuò)誤以及獲取通訊設(shè)備的當(dāng)前狀態(tài)if (comstat.cbinque = 0) continue ; if (bread) bresult = readfile(hcomm, / handle to comm port&rxbuff, / rx buffer pointer1, / read one byte&bytesread, / stores number of bytes read&m_ov); /

13、pointer to the m_ov structureif (displayhex) / printf(0 x%08x , rxbuff);/打印接收到的數(shù)據(jù)sprintf(str, 0 x%08x , rxbuff); setwindowtext(hrbox, str); else / printf(%c, rxbuff);/打印接收到的數(shù)據(jù)sprintf(str, %c, rxbuff); setwindowtext(hrbox, str); if (!bresult)/ 讀不成功 switch (dwerror = getlasterror() case error_io_pendi

14、ng: bread = false; break; default : break ; else bread = true; / close if (bread)if (!bread) bread = true; bresult = getoverlappedresult(hcomm, / handle to comm port&m_ov, / overlapped structure&bytesread, / stores number of bytes readtrue); / wait flag writechar(byte* m_szwritebuffer, dword

15、 m_ntosend) bool bwrite = true; bool bresult = true; dword bytessent = 0; handle m_hwriteevent; resetevent(m_hwriteevent); if (bwrite) m_ov.offset = 0; m_ov.offsethigh = 0; / clear bufferbresult = writefile(hcomm, / handle to comm portm_szwritebuffer, / pointer to message buffer in calling finctionm

16、_ntosend, / length of message to send&bytessent, / where to store the number of bytes sent&m_ov); / overlapped structureif (!bresult) dword dwerror = getlasterror(); switch (dwerror) case error_io_pending: / continue to getoverlappedresults() bytessent = 0; bwrite = false; break ; default: /

17、 all other error codes processerrormessage(writefile(); / end if(bwrite)if (!bwrite) bwrite = true; bresult = getoverlappedresult(hcomm, / handle to comm port&m_ov, / overlapped structure&bytessent, / stores number of bytes senttrue); / wait flag/ deal with the error codeif (!bresult) proces

18、serrormessage( getoverlappedresults() in writefile(); / end if (!bwrite)/ verify that the data size send equals what we tried to sendif (bytessent != m_ntosend) printf(warning: writefile() error. bytes sent: %d; message length: %dn, bytessent, strlen(char *)m_szwritebuffer); returntrue ; / 讀線程dword

19、winapi mythread1(lpvoid pparam) receivechar(); return 0; / 寫線程dword winapi mythread2(lpvoid pparam) while (hcomm != invalid_handle_value) / 串口已被成功打開 sleep(100);/ 等待 100毫秒if (sendflag) writechar(&sendchar, 1); sendflag = false ; / 發(fā)送 return 0; /*函數(shù)名 entry參數(shù)comname: 串口名baudrate: 波特率*/void entry(ch

20、ar *comname, int baudrate, hwnd rhbox) hrbox = rhbox; if (openport(comname) printf(open comport successn); if (setupdcb(baudrate) printf(setupdcb successn); if (setuptimeout(0, 0, 0, 0, 0) printf(setuptimeout successn); / 清空緩沖區(qū)purgecomm(hcomm, purge_rxclear | purge_txclear | purge_rxabort | purge_tx

21、abort); hthread1 = createthread(null, 0, mythread1, 0, 0, null); / 讀線程hthread2 = createthread(null, 0, mythread2, 0, 0, null); / 寫線程 /*設(shè)置顯示 */void displayhex(int flag) if (flag = 0) displayhex = false ; else displayhex = true ; /*設(shè)置超時(shí) */void settimeout( int a, int b, int c, int d, int e) if (setupti

22、meout(a, b, c, d, e) printf(setuptimeout successn); /*發(fā)送數(shù)據(jù) */void sendchar( unsignedchar ch) sendchar = ch; sendflag = true ; / 通知發(fā)送線程發(fā)送數(shù)據(jù) /*關(guān)閉 */void close() closehandle(hthread1);/ 關(guān)閉都線程closehandle(hthread2);/ 關(guān)閉寫線程closehandle(hcomm);/ 關(guān)閉串口 二、驗(yàn)證是否成功把 dll放在 exe一起三、驗(yàn)證串口庫(kù)代碼:#pragma comment ( lib , li

23、bserialport.lib) externc_declspec ( dllimport) void entry(char *comname, int baudrate, null); externc_declspec ( dllimport) void sendchar( unsignedchar ch); externc_declspec ( dllimport) void close(); externc_declspec ( dllimport) void displayhex(int flag); #include #include int main() char ch; entr

24、y( com4, 9600, null ); / 根據(jù)需要設(shè)置串口號(hào)displayhex(0); sleep(2000); sendchar(a ); / 測(cè)試字符sleep(2000); sendchar(b ); sleep(2000); displayhex(1); sendchar(0 x00); sleep(2000); sendchar(0 xf3);/ 測(cè)試 16進(jìn)制數(shù)sleep(2000); sendchar(0 xff); sleep(2000); close();/ 關(guān)閉串口return 0; 四、 (可選 )編寫窗口程序可以看出不用 mfc編寫的串口程序體積非常小五、單片機(jī)上的程序#include #definejingzhen 11059200ul #definebotelv 9600ul/ 定義波特率為 9600volatileunsignedchar sending, receive = 0; unsignedc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論