![自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e3/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e31.gif)
![自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e3/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e32.gif)
![自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e3/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e33.gif)
![自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e3/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e34.gif)
![自己動(dòng)手編寫串口動(dòng)態(tài)庫(kù)(超詳細(xì))_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e3/50ecc00d-a60b-4f0f-acbc-18dbe4b3d1e35.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代網(wǎng)絡(luò)教育技術(shù)的優(yōu)勢(shì)與挑戰(zhàn)
- 環(huán)境保護(hù)技術(shù)的創(chuàng)新及其商業(yè)模式研究
- 深化綠色能源技術(shù)教育的重要性
- 國(guó)慶節(jié)洋酒活動(dòng)方案設(shè)計(jì)
- 充電樁設(shè)備安裝施工方案
- 15 可親可敬的家鄉(xiāng)人1(說課稿)2024-2025學(xué)年統(tǒng)編版道德與法治二年級(jí)上冊(cè)
- many、much、a lot of(說課稿)-2023-2024學(xué)年譯林版(三起)英語(yǔ)六年級(jí)下冊(cè)
- 11屹立在世界的東方 自力更生 揚(yáng)眉吐氣 說課稿-2023-2024學(xué)年道德與法治五年級(jí)下冊(cè)統(tǒng)編版
- 2024-2025學(xué)年高中歷史 專題六 穆罕默德 阿里改革 一 亟待拯救的文明古國(guó)(1)教學(xué)說課稿 人民版選修1001
- 2023九年級(jí)數(shù)學(xué)上冊(cè) 第二十一章 一元二次方程21.3 實(shí)際問題與一元二次方程第3課時(shí) 實(shí)際問題與一元二次方程(3)說課稿(新版)新人教版
- 閃蒸罐計(jì)算完整版本
- (高清版)DZT 0073-2016 電阻率剖面法技術(shù)規(guī)程
- 完整2024年開工第一課課件
- 貨運(yùn)車輛駕駛員安全培訓(xùn)內(nèi)容資料完整
- 高一學(xué)期述職報(bào)告
- 風(fēng)神汽車4S店安全生產(chǎn)培訓(xùn)課件
- ICU患者的體位轉(zhuǎn)換與床旁運(yùn)動(dòng)訓(xùn)練
- 人教版四年級(jí)上冊(cè)豎式計(jì)算200題及答案
- 建設(shè)工程工作總結(jié)報(bào)告
- 脾破裂術(shù)后健康宣教課件
- 三廢環(huán)保管理培訓(xùn)
評(píng)論
0/150
提交評(píng)論