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

正文內容

一個linux下基于電話線路的數據通信程序的設計與實現—免費計算機畢業(yè)設計論文(編輯修改稿)

2025-01-04 11:23 本頁面
 

【文章內容簡介】 相互關聯(lián)的步驟 ∶ 預處理 (也稱預編譯, Preprocessing)、編譯 (Compilation)、匯編 (Assembly)和連接(Linking)。 命令 gcc 首先調用 cpp 進行預處理,在預處理過程中,對源代碼文件中的文件包含 (include)、預編譯語句 (如宏定義 define 等 )進行分析。接 著調用 cc1進行編譯,這個階段根據輸入文件生成以 .o 為后綴的目標文件。匯編過程是針對匯編語言的步驟 。 當所有的目標文件都生成之后, gcc 就調用 ld 來完成最后的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執(zhí)行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。 gcc 編譯器的調用參數大約有 100 多個,其中多數參數可能根本就用不到 ,開發(fā)過程中使用最多的命令就是: gcc O test , 是 C 語言源程序, test 是可執(zhí)行文件, O 是 gcc 的參數, 對程序進行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優(yōu)化處理,這樣產生的可執(zhí)行 第 7 頁 共 24頁 文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。 4 程序的設計 設計概要 此次設計之所以選擇 Linux,是因為 Linux 支持各種硬件平臺和外部設備,Linux 對串口的操作非常簡單,功能齊全,且 Linux 有功能強大的 C語言編譯器(gcc),使程序的可移植性非常好。 Linux 又是完全開放的操作系統(tǒng),很大程度上, Linux 的開放性,賦予了其無窮的生命力。 本設計基于 Linux 操作系統(tǒng),利用 POSIX termios 函數控制計算機串口,通過 AT 命令初始化本地 MODEM 并讓本地 MMODEM 與異地 MODEM 進行撥號連接。本設計使用的是 56K MODEM,不同于現在市面上常見的 ADSL MODEM。 連接成功后,通過讀寫計算機串口來實現文件傳輸 這個過程是用一個自編的文件傳輸協(xié)議來完成的。整個程序使用 C 語言實現??傮w設想如圖 3 所示: 圖 3 預期設計效果 總體來說,設計可以分成兩部分來進行: RS232C 與 MODEM。但這兩部分并不獨立, MODEM 的初始化及撥號連接等等一切對 MODEM 的控 制和訪問,都要通過串口,因為串口是計算機與 MODEM 的唯一通道。兩部分的關系如圖 4 如示: 第 8 頁 共 24頁 圖 4 RS232C 所以設計的關鍵是現實對 RS232C控制,然后再完成 MODEM 的部分。 RS232C 建立與打開 一個輸入 /輸出 (I/O)端口是用來將資料送入計算機及從計算機取出的通道,有許多種類的輸出 /輸入端口,現在要處理的是串行端口,每一個串行端口必須有一個輸入 /輸出地址,以及一個中斷號碼 (IRQ),有四個串口設備對應到 COM1 COM4: ttyS0 (COM1) address 0x3f8 IRQ 4 ttyS1 (COM2) address 0x2f8 IRQ 3 ttyS2 (COM3) address 0x3e8 IRQ 4 ttyS3 (COM4) address 0x2e8 IRQ 3 ttyS*是串口在 Linux 中的命名方式, COM*是串口在 Windows 中的命名方式,Linux 是以 ttyS0 開始命名的,與 Windows 從 COM1 開始命名不同。 ttyS0 和 ttyS2使用同一個中斷 IRQ4, ttyS1 和 ttyS3 使用同一個中斷 IRQ3,所以如果同時使用了 ttyS0 和 ttyS2 或者 ttyS1 和 ttyS3,就必須重設它們的中斷才可以,幸運的是,現在常見的設備都不使用串口,所以連接 56K MODEM 時,多數情況都不必再重設串口中斷,如果是外置 MODEM,則它占用的是 ttyS0,如果是內置 MODEM,則它占用的很可能是 ttyS2。 Linux 下可以使用 ls – l /dev/ttyS*來檢查系統(tǒng)是否正確的建立了串口設備。 此次設計是在 Windows VMware Workstation虛擬機環(huán)境下安裝的 操作系統(tǒng),所以在進行設計之前,必須為虛擬機添加串口設備,具體是在設置中點擊 添加,選擇串口設備,然后一直選擇下一步即可。如果不設置虛擬機串口設備,在虛擬機下將無法識別到串口。設置成功后,可以像使用真正的操作系統(tǒng)一樣使用虛擬機,虛擬機下面的串口是真實的物理串口,而并非是虛擬出來的。 第 9 頁 共 24頁 VMware Workstation 中設備的使用很多都是真實的,不是模擬出來的。 確定串口正確建立以后,使用 open()函數來打開它。像所有的設備一樣,Linux 提供設備文件來掛載端口。要訪問一個串行端口,只要像訪問文件一樣來訪問設備文件即可。串行端口的設備文件名在 Linux 中是: /dev/ttyS*(*代 表 0,1, 2? )。 以 ttyS0 以例, int fd。 fd = open(“ /dev/ttyS0” , O_RDWR | O_NOCTTY | O_NDELAY)。 O_RDWR 代表可讀可寫, O_NOCTTY 告訴 Linux 該程序不想成為那個端口的“控制終端”。如果不指明這個,任何輸入都會影響此進程。 O_NDELAY 標志該程序不關心 DCD 信號的輸入狀態(tài),即無論另一端端口是否啟用和運行。如果不指明這個標志,此進程將休眠,直到另一端發(fā)送 DCD 信號過來。 如果不是以 root 身份登陸,在打開串口時,可能會發(fā)生權限不允 許的情況,這時候使用 chmod a+rw /dev/ttyS0 命令改變文件權限即可,或者直接用 root身份登陸。 串口設置與讀寫 c_cflag 控制項設置 在對串口進行讀寫之前,必須對串口進行設置,這也是串口操作部分最復雜,最重要的一步。串口技術已經很成熟,相應的它的設置也變得很復雜,但相當一部分功能是針對已經被淘汰的外部設備,所以這里只用到了其中一部分 的功能 。 多數系統(tǒng)支持 POSIX termios 終端串行接口來改變,例如波特率,字符尺寸等參數。首先必須引入文件 。它定義了終端控制結構 termios 和POSIX 控制函數。 termios 是一個結構體,它的結構成員如表 2如示: 表 2 Termios 結構成員 成員 描述 c_cflag 控制項 c_lflag 線路項 c_iflag 輸入項 c_oflag 輸出項 c_cc 控制字符 c_ispeed 輸入波特 (新接口 ) c_ospeed 輸出波特 (新接口 ) 在對 termios 成員進行設置之前,首先要使用 tcgetattr(fd, amp。option)讀取 當 前 串 口 的 狀 態(tài) , termios 成 員 設 置 完 之 后 , 再 使 用 tcsetattr (fd,TCSANOW,amp。option)將設置的內容寫入計算機串口, option 是 termios 類型 第 10 頁 共 24頁 變量, TCSANOW 表明所有的改變立即生效,而不等待發(fā)送或者接收的數據結束。 c_cflag 成員控制波特率、數據位、校驗、停止位和硬件流控制,所有支持的設置都有常數對應。對應此次設計的 c_cflag 設置如下: cfsetispeed(amp。options, B115200)。 //Buadrate 115200 cfsetospeed(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 函數用于設備波特率,上面設置的是 115200波特,可供選擇的還有 B76800, B19200, B1200 等等。有些 Linux 版本并不支持cfsetispeed 和 cfsetospeed,但仍可以用 |= B115200這種方式進行設置。 不同于波特率,沒有函數可以用來設置字符尺寸,需要使用比特掩碼的操作來完成。 CLOCAL 代表本地線不改變端口的擁有者, CREAD 表示接收有效。 CLOCAL | CREAD 將保證這個程序不會成為端口 的擁有者,從而不會妨礙控制工作和掛起信號并使串行接口驅動讀取進入的數據。 由異步通信可知,串行數據中數據可以有 5 位、 6 位、 7 位、 8 位,并且可以選擇奇偶校驗,或者無校驗。最后的停止位也可以設置成 1位或者 2位。 CS8,~PARENB, ~CSTOPB 將把串行數據設置為:八位數據位,無奇偶校驗, 1 位停止位。CSIZE 是數據位數掩碼,必須在設置 CS8之前使用,起清除的作用,會把之前對數據位數的設置清除掉。 c_cflag 還包括對硬件流設備的常數,這里不會用到,可以不予理會。 c_iflag、 c_lflag 和 c_oflag 設置 amp。= ~(ICANON | ECHO | ECHOE | ISIG) amp。= ~(INPCK | IGNPAR |IXON |IXOFF |IXANY)。 amp。= ~OPOST。 輸入模式成員 c_iflag 控制任何在端口接收字符的輸入處理, INPCK 和IGNPAR 分別代表校驗有效和忽略校驗錯誤,但是并沒有使用校驗位,所以屏蔽這兩項。 IXON、 IXOFF、 IXANY 分別是軟件流控制 開啟、軟件流控制關閉和允許任何字符再次啟動流,為簡單起見,設計中不使用軟件流控制串行通迅,所以屏 第 11 頁 共 24頁 蔽這三項。 c_lflag 控制輸入字符如何被串行驅動使用,它和 c_oflag 的設置應該說是整個串口設置當中最重要的,它直接影響到串口的工作方式。簡單講,串行設備有三種不同的的輸入方式,需要為程序選擇合適的工作方式: ◆ 標準輸入模式。這是終端設備的標準處理模式,這種方式下, read 會傳回一整行完整的輸入,一行的結束默認是以 NL、文件結束符,或是一個行結束字符。 ◆ 非標準輸入模式。此模式下,可以每次讀取固定數 量的字符,并允許使用字符接收時間定時器。這種模式可以用在每次讀取固定長度字符串的程序中,或者所連接的設備會突然大量字符的情況下。 ◆ 等待來自多信號源的輸入。實際上這并不是另一種輸入方式,它用于處理來自多個設備的數據。 非標準輸入輸出更適合此次項目, ICANON 代表標準模式,所以屏蔽它。 ECHO和 ECHOE 是關于回顯的選項,如果串口另一端也要求回顯的話,那就會造成串口兩端反饋死循環(huán),所以屏蔽它們。 ISIG 是讓某些信號起作用,這里不需要這些信號,所以不也不考慮選擇 ISIG。 而 c_oflag 是對輸出數據進行 處理的成員項,相應的就有標準輸出模式和非標準輸出模式。非標準輸出模式更加靈活,適合做為本次設計的輸出模式,而對這種模式的選擇是非常簡單的,只要屏蔽 c_cflag 的 OPOST 項即可,屏蔽 OPOST項, c_oflag 其余的項就都被忽略。如果選擇了 OPOST 項,那么就是標準輸出模式。其余的項大多出于歷史原因要追溯到打印機和終端還不能和串行數據流保持一致的時候,現在已經沒有使用價值了。 c_cc控制字符設置 [VMIN] = 0。 [VTIME] = 200。 c_cc 的結構是一個字符數組,它包含了控制字符和超時參數。其中常用到的只有其中的 VMIN 和 VTIME 兩個元素。 VMIN 和 VTIME 只有在非標準輸入時才有效。 在非標準輸入模式中,輸入的數據并不組合成行,也不會進行 erase、 kill、delete 等輸入處理。這兩個參數控制這種模式的輸入行為: c_cc[VTIME]設定字符輸入間隔時間計時器,而 c_cc[VMIN]設置滿足讀取函數的最少字節(jié)數。 MIN 0, TIME = 0: 函數在讀到了 MIN值的字符數后返回。 MIN = 0, TIME 0: TIME 決定了超時值,讀取函數在讀到一個字節(jié)的字符,或者等待讀取時間超了 TIME(t = TIME*)以后返回,也就是說,即使沒有從 第 12 頁 共 24頁 串口讀到數據,讀取函數會在 TIME 時間后返回。 MIN 0, TIME 0: 讀取函數會在收到了 MIN 字節(jié)的數據后,或者超 TIME時間沒有收到數據后返回。此時計時器會在每次收到字符的時候重新計時,且只在收到第一個字節(jié)后才啟動。所以讀取函數最少要讀取一個字節(jié)才能正常返回。 MIN = 0, TIME = 0: 讀取函數會立即返回。實際讀取到的字符數, 或者要讀到的字符數,會作為返回值返回。 設計時考慮到不能讓串口接收不到數據陷入無限等待的僵死狀態(tài),并且又得讓串口有一定長的等待時間等待數據到來,
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1