国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

供熱換熱站預(yù)付費(fèi)系統(tǒng)通信技術(shù)應(yīng)用研究

2016-11-19 11:00羅丹厲虹周淑一
中國(guó)新通信 2016年20期
關(guān)鍵詞:讀卡器

羅丹 厲虹 周淑一

[摘要]Windows CE人機(jī)界面是面向移動(dòng)計(jì)算機(jī)和嵌入式應(yīng)用的操作系統(tǒng),具有友好的用戶界面和強(qiáng)大的通信能力,RS-232串行通信是WinCE支持的最基本通信方式。本文將RS-232串行通信技術(shù)應(yīng)用于供熱領(lǐng)域換熱站的預(yù)付費(fèi)智能控制系統(tǒng),設(shè)計(jì)了在WinCE操作系統(tǒng)下,實(shí)現(xiàn)RS-232人機(jī)界面與讀卡器之間以及$50非接觸射頻卡與讀卡器之間的通信程序,較好地解決了串口之間的通信問(wèn)題,最終利用S8讀卡器軟件平臺(tái)對(duì)編寫(xiě)程序做以驗(yàn)證,為從事串口程序開(kāi)發(fā)者提供了參考。

[關(guān)鍵詞]Windows CE 串行通信 讀卡器 S50非接觸射頻卡

目前,國(guó)內(nèi)供熱領(lǐng)域?qū)▎挝还芾砟J接兴倪M(jìn),形成一種換熱站預(yù)付費(fèi)智能控制系統(tǒng)解決方案,而預(yù)付費(fèi)智能控制系統(tǒng)離不開(kāi)人機(jī)界面與讀卡器、讀卡器與IC卡之間的通信。串行通信是計(jì)算機(jī)通信的重要方式,以其設(shè)備價(jià)格低廉、連接簡(jiǎn)單、技術(shù)成熟等優(yōu)點(diǎn)得到廣泛應(yīng)用。Windows CE是微軟推出的一個(gè)多任務(wù)、有友好界面、強(qiáng)大通信能力的32位開(kāi)放實(shí)時(shí)操作系統(tǒng),WinCE系統(tǒng)以其良好的性能得到越來(lái)越廣泛的應(yīng)用。

二、WinCE環(huán)境下的串行通信

串行端口和應(yīng)用程序的溝通是通過(guò)串行裝置驅(qū)動(dòng)程序完成的,即通過(guò)操作系統(tǒng)中文件系統(tǒng)的應(yīng)用程序開(kāi)發(fā)接口存取串行裝置驅(qū)動(dòng)程序,以傳送/接收信息和控制串行裝置。一般通信串口軟件結(jié)構(gòu)如圖1所示:

串行設(shè)備被視為用于打開(kāi)、關(guān)閉、讀寫(xiě)串行端口的常規(guī)、可安裝的流設(shè)備。WinCE的通信函數(shù)和其他大多數(shù)Windows的通信函數(shù)相同,但WinCE不支持直接對(duì)串行端口的寄存器進(jìn)行編程。所使用串行端口部分函數(shù)有:

2.1打開(kāi)和關(guān)閉串口通信端口

打開(kāi)串行端口使用函數(shù)CreateFile,若打開(kāi)端口不存在,則CreateFile回傳“ERROR_FILE_NOT_FOUND”信息,且用戶被通知這個(gè)端口不存在。

打開(kāi)串行通信端口的步驟如下:

(1)使用參數(shù)IpzPortName傳入指定的串行端口名稱。

(2)將參數(shù)dwShareMode設(shè)為0,表示不允許此COM口被其他應(yīng)用程序同時(shí)打開(kāi)。

(3)將參數(shù)dwCreationDisposition設(shè)為OPEN_EXISTING。

(4)將參數(shù)dwFlagsAndAttributes設(shè)為0,Windows CE只支持非交錯(cuò)式輸入/輸出。

//打開(kāi)串行端口

hPort=CreateFile(Serealcom,//指定串口名稱

0,//共享模式

OPEN_XISTING//打開(kāi)方式

0);//串口屬性

當(dāng)應(yīng)用程序使用串行通信端口通信完畢后,使用函數(shù)CloseHandle關(guān)閉串行通信端口。CloseHandle被呼叫之后,在串行端口通信被關(guān)閉和資源釋放之前,會(huì)有2秒的延遲。

2.2設(shè)定串行通信端口

以DCB(device-control block)結(jié)構(gòu)設(shè)定好串行通信端口,呼叫CreateFile函數(shù)打開(kāi)一個(gè)有默認(rèn)串行端口設(shè)定值的串行端口,使用GetCommState函數(shù)取得默認(rèn)值,再使用SetCommState函數(shù)完成新值的設(shè)定,使用COMMTIMEOUTS結(jié)構(gòu)設(shè)定讀寫(xiě)操作的逾時(shí)值。

DCB PortDCB;//創(chuàng)建DCB

PortDCB.DCBlength=sizeof(DCB);//初始化

GetCommState(hPort,&PortDCB;);//取得默認(rèn)port設(shè)置

PortDCB.BaudRate=1 15200;//傳輸波特率

PortDCB.Parity=NOPARITY;//校驗(yàn)位

PortDCB.StopBits=ONESTOPBIT;//停止位

對(duì)于串口通信端口,應(yīng)用程序必須使用COMMTIMEOUTS結(jié)構(gòu)來(lái)設(shè)定串口端口的逾時(shí)值。通常,配置超時(shí)值和配置串口類似。首先用Get CommTimeots函數(shù)獲得當(dāng)前串口的超時(shí)值,然后可以修改COMMTIMEOUT成員,最后用SetCommTimeouts函數(shù)設(shè)定超時(shí)值。

COMMTIMEOUTS CommTimeouts;//聲明結(jié)構(gòu)

GetCommTimeouts(hPort,&CommTimeouts;);//獲得當(dāng)前的超時(shí)值

//變更COMMTIMEOUT結(jié)構(gòu)的設(shè)定值

SetCommTimeouts(hPort,&CommTimeouts;);//設(shè)定讀寫(xiě)動(dòng)作的逾時(shí)值

2.3讀取/寫(xiě)入通信串口

讀取通信端口使用ReadFile函數(shù)接收從其他末端的串聯(lián)連接裝置來(lái)的信息,需要注意的是WinCE不支持重疊I/O,所以如果在主線程進(jìn)行大量讀寫(xiě)串口操作時(shí),有可能使整個(gè)程序陷入緩慢的串口等待中去,因此一般都采用多線程來(lái)進(jìn)行讀寫(xiě)串口操作。WinCE不支持交錯(cuò)式I/O,故其參數(shù)設(shè)置為NULL。讀取串行通信端口程序如下:

ReadFile(hPort,&Byte;,//指向讀取的信息存放之處

1,//欲讀取的字節(jié)個(gè)數(shù)

&dwBytesTransferred;,//實(shí)際讀取的字節(jié)個(gè)數(shù)

NULL//不支持交錯(cuò)式I/O

串行通信端口使用WriteFile函數(shù)連接到另外的裝置傳輸信息,由于WinCE串行通信不支持交錯(cuò)式I/O,故應(yīng)用程序的主要線程或建立任何窗口的線程不應(yīng)寫(xiě)進(jìn)大量信息到串行端口,否則這些線程會(huì)被阻塞等待輸入/輸出完成無(wú)法管理其他相關(guān)信息隊(duì)列,寫(xiě)入串行通信端口的程序如下:

WriteFile(hPort,&Byte;,//指向欲寫(xiě)入的信息

1,//欲寫(xiě)入數(shù)據(jù)的字節(jié)個(gè)數(shù)

&dwBytesWritten;,//實(shí)際寫(xiě)入的字節(jié)個(gè)數(shù)

NULL//不支持交錯(cuò)式I/O

三、S50非接觸射頻卡與讀卡器通信

3.1硬件組成

本預(yù)付費(fèi)智能控制系統(tǒng)讀卡器采用峰華科技S8型雙界面讀卡,通過(guò)RS232串行接口與人機(jī)界面連接,工作頻率為13.56MHz,支持非接觸卡MIFARE系列/DESFIRE/ICODE2等常見(jiàn)IC卡和CPU卡,本次測(cè)試與PC采用COM3連接,IC卡采用廣泛應(yīng)用的S50卡,容量8k,分16個(gè)扇區(qū),每個(gè)扇區(qū)4塊,每塊16個(gè)字節(jié),每個(gè)扇區(qū)有獨(dú)立的一組密碼及訪問(wèn)控制;IC卡有唯一的32位序列號(hào),具有防沖突機(jī)制,可對(duì)數(shù)據(jù)塊進(jìn)行初始化、讀、寫(xiě)操作,每個(gè)扇區(qū)的塊3為控制塊,包括密碼A、存取控制以及密碼B,結(jié)構(gòu)為:A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5,圖2為S50卡讀寫(xiě)單元結(jié)構(gòu)。

3.2軟件設(shè)計(jì)

目前用匯編語(yǔ)言開(kāi)發(fā)串行通信程序的應(yīng)用較多,通常利用Mscomm控件、第3方動(dòng)態(tài)鏈接庫(kù)和調(diào)用API函數(shù)三種方式編寫(xiě)串行通信程序,Win32中使用API函數(shù)開(kāi)發(fā)通信程序時(shí)串口和其他通信設(shè)備均被作為文件處理,串口的打開(kāi)、關(guān)閉等操作使用的API函數(shù)與操作文件的函數(shù)相同。本文基于VC開(kāi)發(fā)串行通信程序,利用第3方提供的動(dòng)態(tài)鏈接庫(kù)以及調(diào)用API函數(shù)編寫(xiě)通信程序。

系統(tǒng)使用umf.dll動(dòng)態(tài)鏈接文件,在讀取IC卡以及讀卡器上所存放的電壓數(shù)據(jù)時(shí),調(diào)用實(shí)現(xiàn)串口通信。其中iport參數(shù)是串口號(hào),系統(tǒng)采用的是COM3串口通信,iBaud參數(shù)是傳輸波特率,根據(jù)用戶需求,傳輸波特率設(shè)定為115200,iSerialNo參數(shù)是讀卡器的序列號(hào),系統(tǒng)規(guī)定為0。具體的傳輸協(xié)議使用動(dòng)態(tài)鏈接庫(kù)的函數(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)通信,所以不再設(shè)置。

使用WinAPI進(jìn)行串口通信程序設(shè)計(jì)具有很強(qiáng)的靈活性,Windows的API函數(shù)存放在動(dòng)態(tài)鏈接庫(kù)中,調(diào)用函數(shù)API可以實(shí)現(xiàn)串口通信,圖3為$50卡與讀寫(xiě)器的通信流程簡(jiǎn)圖。

對(duì)于復(fù)位應(yīng)答來(lái)說(shuō),通信協(xié)議和通信波特率已經(jīng)是定義好的,當(dāng)有卡片進(jìn)入讀寫(xiě)器操作范圍時(shí),讀卡器與之通信來(lái)確定是否為本系統(tǒng)卡片類型,本系統(tǒng)設(shè)定一次只能選擇一張卡進(jìn)行操作,故防沖突機(jī)制就是當(dāng)有多張卡進(jìn)入讀卡范圍時(shí)從中選擇一張進(jìn)行操作,其他的等待下次讀卡,同時(shí)返回選中射頻卡的序列號(hào)。選定要處理的卡片對(duì)扇區(qū)密碼進(jìn)行校驗(yàn)確保無(wú)誤進(jìn)行后續(xù)讀寫(xiě)操作。

根據(jù)通信協(xié)議約定在主機(jī)控制單元對(duì)射頻卡讀寫(xiě)控制時(shí)需要握手連接,利用如下代碼,若三次均成功則數(shù)據(jù)開(kāi)始傳送,否則關(guān)閉端口。

Serial.SendData(&STX;_request,1);//發(fā)送聯(lián)絡(luò)信號(hào)

Sleep(1000);//等待回應(yīng)

Serial.Read_Data(&read;_Buffer,1);//讀取射頻卡讀寫(xiě)模塊響應(yīng)信號(hào)

if(read_Buffer==DLE)

//在此進(jìn)行命令數(shù)據(jù)傳送

else

Serial.Close();//操作完成后關(guān)閉端口

若握手成功則對(duì)卡片進(jìn)行密碼驗(yàn)證等系列命令,以下為部分源程序:

fw_getver(icdev,linchar);//獲取設(shè)備號(hào)

fw_request(indev,0,tagtype);//發(fā)出尋卡請(qǐng)求

fw_anticoll(icdev,0,&snr;);//防碰撞控制,返回卡序列號(hào)

show(“Find Card Ok!”1:

linstr.Format(“%u”,cardsnr;

show(linstr);

fw_select(icdev,snr,&size;);//選擇某一序號(hào)的卡,size返回卡的容量大小

if(fw_authentication(icdev,0,key)!=0)//核對(duì)扇區(qū)密碼

printf(“Authentication error!”);

else

show(“Auth Card Ok!”):

fw_read(icdev,4,data)//讀IC卡塊4數(shù)據(jù)

fw_changed3(iedev,1,keya,ctrlword,0,keyb);∥修改一扇區(qū)塊3密碼

fw_halt();//讀寫(xiě)一次后掛起,直到卡重新進(jìn)入有效范圍

本系統(tǒng)采用S8型讀寫(xiě)器軟件平臺(tái)對(duì)編寫(xiě)程序進(jìn)行測(cè)試,首先連接數(shù)據(jù)通信線并打開(kāi)S8.exe,對(duì)程序中部分功能進(jìn)行驗(yàn)證,圖4為連接成功后顯示的設(shè)備型號(hào)F#W-FMl702-V1.00,序號(hào)為預(yù)先設(shè)置的0。

本系統(tǒng)通信線連接使用COM3接口,故在初始化端口時(shí)選COM3端口并設(shè)置波特率為115200,圖5為初始化端口并設(shè)置參數(shù)。

S50卡分16個(gè)扇區(qū),每個(gè)扇區(qū)由4塊組成,共有0-63塊,其中第0扇區(qū)的塊O存放廠商代碼,已經(jīng)固化不可更改。系統(tǒng)對(duì)扇區(qū)3進(jìn)行密碼驗(yàn)證,如果不成功則返回重新尋卡操作,讀寫(xiě)卡測(cè)試隨機(jī)選扇區(qū)4進(jìn)行讀寫(xiě)卡操作,點(diǎn)擊讀卡可看到扇區(qū)4里面的數(shù)據(jù)均讀出,且可改變數(shù)值進(jìn)行寫(xiě)卡操作。圖6、7分別為驗(yàn)證扇區(qū)3密碼以及讀寫(xiě)卡操作。

四、結(jié)論

基于VC語(yǔ)言實(shí)現(xiàn)在Windows CE平臺(tái)上的串行端口通信應(yīng)用于換熱站智能預(yù)付費(fèi)系統(tǒng)。利用調(diào)用WIN32 API函數(shù)的方式設(shè)計(jì)并開(kāi)發(fā)S50卡與讀卡器的通信程序,在s8讀卡器上進(jìn)行驗(yàn)證,能接收到來(lái)自S50非接觸射頻卡上的數(shù)據(jù),實(shí)現(xiàn)了讀卡器與IC卡之間的通信,該方法對(duì)實(shí)現(xiàn)基于WinCE的串口通信有一定參考價(jià)值,此串口程序的設(shè)計(jì)及開(kāi)發(fā)為也為更多通信工程師提供了參考。

猜你喜歡
讀卡器
與淘汰命運(yùn)抗?fàn)帯】炊P記本的讀卡器
讀卡器
iPhone讀卡器
顏值與功能并重
基于EMV非接通信規(guī)范的非接觸讀卡器設(shè)計(jì)
多合一讀卡器
开封县| 于田县| 辛集市| 乌鲁木齐县| 卢湾区| 长治县| 固始县| 阳泉市| 汝城县| 城固县| 阳原县| 大安市| 禹州市| 澄城县| 蒲江县| 平凉市| 三台县| 北海市| 施秉县| 巫山县| 兴国县| 延吉市| 绥滨县| 淳化县| 安义县| 晋州市| 冕宁县| 丰城市| 西安市| 磴口县| 永城市| 吉木乃县| 南木林县| 长垣县| 南投市| 乌拉特中旗| 丹寨县| 抚顺县| 玛沁县| 松潘县| 册亨县|