freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一個(gè)linux下基于電話線路的數(shù)據(jù)通信程序的設(shè)計(jì)與實(shí)現(xiàn)—計(jì)算機(jī)畢業(yè)設(shè)計(jì)論文(編輯修改稿)

2024-09-02 06:55 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 O_RDWR代表可讀可寫,O_NOCTTY告訴Linux該程序不想成為那個(gè)端口的“控制終端”。如果不指明這個(gè),任何輸入都會(huì)影響此進(jìn)程。O_NDELAY標(biāo)志該程序不關(guān)心DCD信號(hào)的輸入狀態(tài),即無論另一端端口是否啟用和運(yùn)行。如果不指明這個(gè)標(biāo)志,此進(jìn)程將休眠,直到另一端發(fā)送DCD信號(hào)過來。如果不是以root身份登陸,在打開串口時(shí),可能會(huì)發(fā)生權(quán)限不允許的情況,這時(shí)候使用chmod a+rw /dev/ttyS0命令改變文件權(quán)限即可,或者直接用root身份登陸。 串口設(shè)置與讀寫 c_cflag控制項(xiàng)設(shè)置在對(duì)串口進(jìn)行讀寫之前,必須對(duì)串口進(jìn)行設(shè)置,這也是串口操作部分最復(fù)雜,最重要的一步。串口技術(shù)已經(jīng)很成熟,相應(yīng)的它的設(shè)置也變得很復(fù)雜,但相當(dāng)一部分功能是針對(duì)已經(jīng)被淘汰的外部設(shè)備,所以這里只用到了其中一部分的功能。多數(shù)系統(tǒng)支持POSIX termios終端串行接口來改變,例如波特率,字符尺寸等參數(shù)。首先必須引入文件。它定義了終端控制結(jié)構(gòu)termios和POSIX控制函數(shù)。termios是一個(gè)結(jié)構(gòu)體,它的結(jié)構(gòu)成員如表2如示:表2 Termios 結(jié)構(gòu)成員成員描述c_cflag控制項(xiàng)c_lflag線路項(xiàng)c_iflag輸入項(xiàng)c_oflag輸出項(xiàng)c_cc控制字符c_ispeed輸入波特(新接口)c_ospeed輸出波特(新接口)在對(duì)termios成員進(jìn)行設(shè)置之前,首先要使用tcgetattr(fd, amp。option)讀取當(dāng)前串口的狀態(tài),termios成員設(shè)置完之后,再使用tcsetattr (fd,TCSANOW,amp。option)將設(shè)置的內(nèi)容寫入計(jì)算機(jī)串口,option是termios類型變量,TCSANOW表明所有的改變立即生效,而不等待發(fā)送或者接收的數(shù)據(jù)結(jié)束。c_cflag成員控制波特率、數(shù)據(jù)位、校驗(yàn)、停止位和硬件流控制,所有支持的設(shè)置都有常數(shù)對(duì)應(yīng)。對(duì)應(yīng)此次設(shè)計(jì)的c_cflag設(shè)置如下:cfsetispeed(amp。options, B115200)。 //Buadrate 115200cfsetospeed(amp。options, B115200)。 |= (CLOCAL | CREAD)。 amp。= ~CSIZE。 //Mask the character size bits |= CS8。 //Select 8 data bits amp。= ~PARENB。 //NO amp。= ~CSTOPB。 //One Stop bit cfsetispeed和cfsetospeed函數(shù)用于設(shè)備波特率,上面設(shè)置的是115200波特,可供選擇的還有B76800,B19200,B1200等等。有些Linux版本并不支持cfsetispeed和cfsetospeed, |= B115200這種方式進(jìn)行設(shè)置。不同于波特率,沒有函數(shù)可以用來設(shè)置字符尺寸,需要使用比特掩碼的操作來完成。CLOCAL代表本地線不改變端口的擁有者,CREAD表示接收有效。CLOCAL | CREAD將保證這個(gè)程序不會(huì)成為端口的擁有者,從而不會(huì)妨礙控制工作和掛起信號(hào)并使串行接口驅(qū)動(dòng)讀取進(jìn)入的數(shù)據(jù)。由異步通信可知,串行數(shù)據(jù)中數(shù)據(jù)可以有5位、6位、7位、8位,并且可以選擇奇偶校驗(yàn),或者無校驗(yàn)。最后的停止位也可以設(shè)置成1位或者2位。CS8,~PARENB,~CSTOPB將把串行數(shù)據(jù)設(shè)置為:八位數(shù)據(jù)位,無奇偶校驗(yàn),1位停止位。CSIZE是數(shù)據(jù)位數(shù)掩碼,必須在設(shè)置CS8之前使用,起清除的作用,會(huì)把之前對(duì)數(shù)據(jù)位數(shù)的設(shè)置清除掉。c_cflag還包括對(duì)硬件流設(shè)備的常數(shù),這里不會(huì)用到,可以不予理會(huì)。 c_iflag、c_lflag和c_oflag設(shè)置 amp。= ~(ICANON | ECHO | ECHOE | ISIG) amp。= ~(INPCK | IGNPAR |IXON |IXOFF |IXANY)。 amp。= ~OPOST。 輸入模式成員c_iflag控制任何在端口接收字符的輸入處理,INPCK和IGNPAR分別代表校驗(yàn)有效和忽略校驗(yàn)錯(cuò)誤,但是并沒有使用校驗(yàn)位,所以屏蔽這兩項(xiàng)。IXON、IXOFF、IXANY分別是軟件流控制開啟、軟件流控制關(guān)閉和允許任何字符再次啟動(dòng)流,為簡(jiǎn)單起見,設(shè)計(jì)中不使用軟件流控制串行通迅,所以屏蔽這三項(xiàng)。c_lflag控制輸入字符如何被串行驅(qū)動(dòng)使用,它和c_oflag的設(shè)置應(yīng)該說是整個(gè)串口設(shè)置當(dāng)中最重要的,它直接影響到串口的工作方式。簡(jiǎn)單講,串行設(shè)備有三種不同的的輸入方式,需要為程序選擇合適的工作方式:◆ 標(biāo)準(zhǔn)輸入模式。這是終端設(shè)備的標(biāo)準(zhǔn)處理模式,這種方式下,read會(huì)傳回一整行完整的輸入,一行的結(jié)束默認(rèn)是以NL、文件結(jié)束符,或是一個(gè)行結(jié)束字符。◆ 非標(biāo)準(zhǔn)輸入模式。此模式下,可以每次讀取固定數(shù)量的字符,并允許使用字符接收時(shí)間定時(shí)器。這種模式可以用在每次讀取固定長(zhǎng)度字符串的程序中,或者所連接的設(shè)備會(huì)突然大量字符的情況下?!? 等待來自多信號(hào)源的輸入。實(shí)際上這并不是另一種輸入方式,它用于處理來自多個(gè)設(shè)備的數(shù)據(jù)。非標(biāo)準(zhǔn)輸入輸出更適合此次項(xiàng)目,ICANON代表標(biāo)準(zhǔn)模式,所以屏蔽它。ECHO和ECHOE是關(guān)于回顯的選項(xiàng),如果串口另一端也要求回顯的話,那就會(huì)造成串口兩端反饋死循環(huán),所以屏蔽它們。ISIG是讓某些信號(hào)起作用,這里不需要這些信號(hào),所以不也不考慮選擇ISIG。而c_oflag是對(duì)輸出數(shù)據(jù)進(jìn)行處理的成員項(xiàng),相應(yīng)的就有標(biāo)準(zhǔn)輸出模式和非標(biāo)準(zhǔn)輸出模式。非標(biāo)準(zhǔn)輸出模式更加靈活,適合做為本次設(shè)計(jì)的輸出模式,而對(duì)這種模式的選擇是非常簡(jiǎn)單的,只要屏蔽c_cflag的OPOST項(xiàng)即可,屏蔽OPOST項(xiàng),c_oflag其余的項(xiàng)就都被忽略。如果選擇了OPOST項(xiàng),那么就是標(biāo)準(zhǔn)輸出模式。其余的項(xiàng)大多出于歷史原因要追溯到打印機(jī)和終端還不能和串行數(shù)據(jù)流保持一致的時(shí)候,現(xiàn)在已經(jīng)沒有使用價(jià)值了。 c_cc控制字符設(shè)置 [VMIN] = 0。 [VTIME] = 200。c_cc的結(jié)構(gòu)是一個(gè)字符數(shù)組,它包含了控制字符和超時(shí)參數(shù)。其中常用到的只有其中的VMIN和VTIME兩個(gè)元素。VMIN和VTIME只有在非標(biāo)準(zhǔn)輸入時(shí)才有效。在非標(biāo)準(zhǔn)輸入模式中,輸入的數(shù)據(jù)并不組合成行,也不會(huì)進(jìn)行erase、kill、delete等輸入處理。這兩個(gè)參數(shù)控制這種模式的輸入行為:c_cc[VTIME]設(shè)定字符輸入間隔時(shí)間計(jì)時(shí)器,而c_cc[VMIN]設(shè)置滿足讀取函數(shù)的最少字節(jié)數(shù)。MIN 0, TIME = 0: 函數(shù)在讀到了MIN值的字符數(shù)后返回。MIN = 0, TIME 0: TIME決定了超時(shí)值,讀取函數(shù)在讀到一個(gè)字節(jié)的字符,或者等待讀取時(shí)間超了TIME(t = TIME*)以后返回,也就是說,即使沒有從串口讀到數(shù)據(jù),讀取函數(shù)會(huì)在TIME時(shí)間后返回。MIN 0, TIME 0: 讀取函數(shù)會(huì)在收到了MIN字節(jié)的數(shù)據(jù)后,或者超TIME時(shí)間沒有收到數(shù)據(jù)后返回。此時(shí)計(jì)時(shí)器會(huì)在每次收到字符的時(shí)候重新計(jì)時(shí),且只在收到第一個(gè)字節(jié)后才啟動(dòng)。所以讀取函數(shù)最少要讀取一個(gè)字節(jié)才能正常返回。MIN = 0, TIME = 0: 讀取函數(shù)會(huì)立即返回。實(shí)際讀取到的字符數(shù),或者要讀到的字符數(shù),會(huì)作為返回值返回。設(shè)計(jì)時(shí)考慮到不能讓串口接收不到數(shù)據(jù)陷入無限等待的僵死狀態(tài),并且又得讓串口有一定長(zhǎng)的等待時(shí)間等待數(shù)據(jù)到來,所以選擇了MIN = 0, TIME 0的組合,即在沒有數(shù)據(jù)到來時(shí),會(huì)等待TIME時(shí)間,如果超過TIME仍沒有數(shù)據(jù)到來,則讀取串口的函數(shù)仍可以返回。TIME的值的大小可以根據(jù)不同情況而定,但是不能太長(zhǎng),超過30s程序就會(huì)報(bào)錯(cuò),這里選擇的是200(20s)。MIN和TIME需要配合ftl(fd, F_SETFL,0)使用,ftl(fd, F_SETFL,0)作用是當(dāng)串口沒有接收到字符時(shí),阻塞等待一段時(shí)間。這時(shí)對(duì)MIN,TIME的設(shè)置才可以起作用。如果不想讓串口阻塞,則可以設(shè)置ftl(fd, F_SETFL,FNDELAY),這時(shí)它與MIN = 0, TIME = 0得到的結(jié)果相同。ftl函數(shù)是在open函數(shù)后面加入的。可以用include 將其函數(shù)聲明加入程序。最后,將設(shè)置的內(nèi)容存入串口tcsetattr (fd,TCSANOW,amp。option),串口設(shè)置就完成了。 讀寫串口寫數(shù)據(jù)到串口是很簡(jiǎn)單的,只需要使用write()系統(tǒng)呼叫去傳送數(shù)據(jù):n = write(fd, “ATZ/R”, 4)。if( n 4 ) printf(“write to serial port failed!\n”)。從串口讀取數(shù)據(jù):n=read(fd, rdata, 1);rdata是預(yù)先先定義好的字符數(shù)組,要讓rdata足夠大,才不會(huì)發(fā)生數(shù)據(jù)溢出錯(cuò)誤。串口本身有4K的讀寫緩存,不同的計(jì)算機(jī)可能緩存大小不一樣。不能一次性讀寫超過串口緩存本身大小的字符數(shù),不過4K已經(jīng)足夠使用了。向串口寫數(shù)據(jù)往往一次性就能成功,例如一次性往串口寫100個(gè)字符,但若從串口讀這100個(gè)字符,根據(jù)MIN和TIME設(shè)置的不同,可能需要讀取兩次才能將這100個(gè)字符完整讀出來。所以MIN 和TIME的設(shè)置很重要。同時(shí),串口波特率越高,一次性把串口數(shù)據(jù)讀完的機(jī)率也越小。 MODEM的控制 MODEM的兩種工作狀態(tài)MODEM的狀態(tài)可以分為命令狀態(tài)和在線狀態(tài)。除了撥號(hào)占據(jù)短暫的時(shí)間之外,MODEM總是處于其中一種狀態(tài)。當(dāng)MODEM啟動(dòng)后,首先處于命令狀態(tài),連接后進(jìn)入在線狀態(tài)。在命令狀態(tài)下MODEM以AT命令形式接受命令,例指示MODEM去撥號(hào)或當(dāng)電話響鈴時(shí)給予自動(dòng)應(yīng)答。在在線狀態(tài)下,MODEM與遠(yuǎn)端系統(tǒng)通信。這時(shí)MODEM不再嘗對(duì)發(fā)送給它的數(shù)據(jù)進(jìn)行解釋,而是直接將其發(fā)送出去。這兩種狀態(tài)之間可以相互轉(zhuǎn)換。當(dāng)MODEM處于命令狀態(tài)時(shí),MODEM不是和遠(yuǎn)端系統(tǒng)通信,而是準(zhǔn)備接受命令,此時(shí)MODEM一般處于掛機(jī)狀態(tài)(離線命令狀態(tài)),但也可以處于摘機(jī)狀態(tài)(在線命令狀態(tài))。MODEM接收并解釋AT命令,DET只有在命令狀態(tài)才能對(duì)MODEM進(jìn)行控制。在線狀態(tài)又稱為聯(lián)機(jī)狀態(tài)或數(shù)據(jù)狀態(tài),當(dāng)通信雙方握手完成,建立通信鏈路后,MODEM就可以發(fā)送和接收數(shù)據(jù),MODEM不再對(duì)接收到的數(shù)據(jù)分析處理,而是直接將其發(fā)送出去。MODEM狀態(tài)之
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1