




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、通信軟件設計實 驗 指 導 書通信工程系計算機通信教研室2008年6月102前 言通信軟件幾乎存在于所有通信設備和系統,通信工程專業的學生應該了解通信軟件的組成和主要設計要點,所以通信軟件設計(design of communications software)是通信工程專業一門重要的選修課。本課程技術性、實踐性很強。通信軟件的開發平臺和運行平臺都是在某個操作系統之上,涉及到較多操作系統概念和技術。軟件的設計基礎是數據結構,這門課程也是操作系統、數據結構、程序設計語言等基礎課程的綜合運用。通信技術的范圍很大,就其軟件的類型來說,也非常復雜繁多。實驗和課堂學時有限,只能選擇目前流行的ip和lin
2、ux作為實驗環境和目標,目的是使學生了解通信軟件的設計過程和方法,了解通信軟件的核心問題,而非學習每個通信技術種類的軟件開發和運行情況,比如程控交換機軟件、以太網絡交換機軟件、第三層交換機軟件等等。本實驗選擇linux作為基礎操作系統,所以實驗要從linux的結構/組成、開發入手,掌握基本的編輯、編譯、運行方法;再深入進程間通信、內核構造;最后是協議實現。目 錄前 言i目 錄ii實驗要求1實驗一 linux程序設計環境21實驗目的22實驗內容23實驗步驟及調試環境23.1調試環境23.2實驗步驟:23.3程序樣本:33.3.1 c-h.c文件33.3.2 makefile文件3實驗二 利用li
3、nux的/dev/tty接口的通信程序設計41實驗目的42實驗內容43實驗步驟及調試環境43.1調試環境43.2實驗步驟:43.3原理和程序樣本:53.3.1 串口簡介53.3.2 計算機串口的引腳說明53.3.3 串口操作53.3.4 打開串口63.3.5 設置串口63.3.6 需要注意:103.3.7 讀寫串口103.3.8 關閉串口103.3.9 主程序例子103.3.10 例子程序(樣本1)113.3.10.1 makfile文件113.3.10.2 頭文件123.3.10.3 tty_comm_init.c文件(初始化子程序庫)123.3.10.4 tty_send_file.c文件
4、(文件發送程序)183.3.10.5 tty_recv_file.c文件(文件接收程序)19實驗三 底層232通信程序221實驗目的222實驗內容223實驗步驟及調試環境223.1調試環境223.2實驗步驟:223.3原理和程序樣本:233.3.1程序功能233.3.2 核外進程進入內核原理233.3.3 核內外的接口設備243.3.4 設備文件操作表和文件操作程序243.3.5 設備加載和注銷形式263.3.6 內核程序的特殊性263.3.7 232串口的控制和數據讀寫寄存器263.3.8 232串口中斷服務程序273.3.9 xon/xoff協議程序273.3.10 編寫用戶空間串口通信程
5、序283.3.11 例子程序(樣本2)283.3.11.1 makefile文件283.3.11.2 頭文件283.3.11.3 rs232_comm.c文件293.3.11.4 rs232_comm_send.c文件303.3.11.5 rs232_comm_recv.c文件323.3.11.6 rs232_comm_driver.c文件34實驗四 狀態機程序設計481實驗目的482實驗內容483實驗步驟及調試環境483.1調試環境483.2實驗步驟:493.3簡化的sdlc規程493.3.1體系關系493.3.2狀態機設計493.3.3幀結構513.4系統結構與實驗環境523.4.1系統結
6、構523.4.2 任務設置533.4.3測試數據和運行543.5流程與數據結構543.5.1數據流程與緩沖區/隊列543.5.2主要程序流程553.5.2.1 s_open()流程553.5.2.2 s_write()流程553.5.2.3 s_close()流程553.5.2.4 文件發送流程(file_send)553.5.2.5 r_read()流程563.5.2.6 文件接收流程(file_recv)563.5.2.7 sdlc狀態機處理流程(sdlc_state_process()563.5.2.8事件隊列結構(sdlc_event_q,sdlc_data)和sdlc_read()流
7、程583.5.2.9 232接口中斷處理流程(232_intr()593.5.3 數據結構說明593.5.4 程序樣本(樣本3)603.5.4.1 makefile文件603.5.4.2 file_copy.h 文件(上層文件傳輸頭文件)613.5.4.3 file_send.c 文件613.5.4.4 file_recv.c 文件643.5.4.5 file_copy.c 文件653.5.4.6 sdlc.h 文件663.5.4.7 sdev.c 文件693.5.4.8 rdev.c 文件723.5.4.9 sdlc.c 文件753.5.4.10 msdlc.c 文件763.5.4.11 s
8、sdlc.c 文件90實驗五 ip交換軟件設計911實驗目的912實驗內容913實驗步驟及調試環境923.1調試環境923.2實驗步驟:923.2.1實驗五.1實驗步驟:923.2.2實驗五.2實驗步驟:943.3原理和要求943.3.1程序功能943.3.2 linux操作系統內核原理943.3.3 ip原理和簡化的ip轉發程序功能要求943.3.3.1 ip數據包格式953.3.3.2 ip路由表963.3.3.3路由選擇算法963.3.3.4 路由表的建立與刷新973.3.3.5 路由軟件應處理的主要內容973.3.3.6 簡化的路由程序983.3.3.7 簡單的維護程序983.4 緩沖
9、區隊列設計983.4.1 自由隊列983.4.2 接收隊列983.4.3 發送隊列983.5 程序流程設計993.5.1 文件接收和發送程序流程993.5.2 232驅動程序流程993.5.3 簡化的sdlc程序流程993.5.4 ip初始化和管理程序程序流程993.5.5 ip轉發程序流程1003.5.6 緩沖區操作程序流程1013.6 完整程序101實驗六 rh linux 2.4版本下的u盤使用1021實驗目的1022實驗內容1023實驗步驟及調試環境1023.1調試環境1023.2實驗步驟:102實驗要求通信軟件設計實驗課程主要是編寫程序和調試程序,要求在知道某個通信協議的情況下,學會
10、如何在設備中實現這個協議。因此學會開發環境的搭建、運行、編寫程序、編輯、編譯、運行、試驗等等方法和步驟。本指導書已經寫出了初步的實驗步驟和程序樣本。整體步驟和完整程序必須要求學生自己去完成。所以在通信軟件設計的課程實驗過程中,要求學生做到:(1)預習實驗指導書有關部分,認真做好實驗內容的準備,就實驗可能出現的情況提前作出思考和分析,提前編寫代碼。(2)仔細觀察調試時出現的各種現象,記錄主要情況,作出必要說明和分析。(3)認真書寫實驗報告。實驗報告包括實驗目的和要求,實驗情況及其分析。對需編程的實驗,寫出程序設計說明,給出源程序框圖和清單。(4)遵守機房紀律,服從老師指揮,愛護實驗設備。(5)實
11、驗課程不遲到。如有事不能出席,必須請假,且所缺實驗不補。實驗的驗收將分為兩個部分。第一部分是上機操作,包括檢查程序運行、設備配置和即時提問。第二部分是提交書面的實驗報告。上機檢查逐個進行,按初步規定的時間檢查,都將應當在規定的時間內完成并檢查通過,過期視為未完成該實驗,不計成績。希望同學們抓緊時間,合理安排,認真完成。實驗報告格式:1)實驗名稱三號字體、宋體2)實驗日期、地點五號字體、宋體3)班級、年級、學號、姓名五號字體、宋體4)實驗目的五號字體、標題黑體、內容宋體5)實驗環境五號字體、標題黑體、內容宋體6)實驗步驟五號字體、標題黑體、內容宋體7)實驗關鍵程序分析五號字體、標題黑體、內容宋體
12、8)實驗過程分析和體會五號字體、標題黑體、內容宋體9)實驗結論分析五號字體、標題黑體、內容宋體實驗一 linux程序設計環境(linux環境下的c語言源程序編輯、源程序編譯、可執行文件的執行)1實驗目的掌握linux程序設計的基本方法和linux的編輯和編譯操作。2實驗內容用c語言編寫和調試一個在顯示器上顯示“hello,xx!”的程序。xx可替代任何字串。3實驗步驟及調試環境3.1調試環境pc以及linux操作系統。3.2實驗步驟:1) 安裝linux操作系統(請找到合適的pc機器上安裝,學校實驗室-省略該步驟);2) 啟動linux操作系統,用root用戶登陸;3) 用鼠標尋找主菜單-系統
13、設置-用戶和組管理-添加用戶,產生一個普通用戶(自己的選擇,比如stu1);注意觀察這個用戶的主目錄在整個linux中的位置4) 在主菜單中注銷并退出root用戶,然后再用你產生的用戶(比如stu1)登陸系統;5) 在桌面上空白處點擊鼠標右鍵,然后“新建終端”,并進入終端窗口;終端是命令行操作模式6) 在終端命令提示狀態下,用mkdir c-test命令做一個子目錄(自己的選擇,比如c-test),并用cd c-test命令進入這個子目錄;7) 在這個目錄下用vi c-h.c編輯源程序文件;學習vi編輯器或其它編輯器8) 用vi makefile編輯makefile文件;9) 用make命令編
14、譯你剛輸入的源程序;10) 在目錄/home/stu1/c-test下,出現命令行提示符號$,輸入./c-h lili就可以執行你編寫的程序。觀察結果,思考編輯、編譯、執行三者關系。11) 在主菜單中選擇關閉系統。3.3程序樣本:3.3.1 c-h.c文件int main(int argc, char *argv)if (argc 2) printf(“命令參數不正確n”);exit(-1);printf(“nhello,%s!n”,argv1);exit(1);3.3.2 makefile文件c-h:c-h.ogcc -o c-h c-h.c實驗二 利用linux的/dev/tty接口的通信
15、程序設計(利用linux 串口設備文件編通信程序)1實驗目的掌握linux程序設計的基本方法和linux的操作;掌握linux串口文件的使用,學會如何在linux之上采用串口作通信。2實驗內容用c語言編寫一個基于/dev/ttysx串口設備的文件發送通信程序和文件接收通信程序(利用linux提供的串口內核程序實現),然后編輯輸入和編譯調試。完成任務的標志是兩個機器之間通過232電纜實現任何文件的傳輸。3實驗步驟及調試環境3.1調試環境pc以及linux操作系統。3.2實驗步驟:12) 脫機編寫基于/dev/ttysx串口設備的通信程序(參見樣本1);13) 做一個普通用戶并這個普通用戶登陸系統
16、;14) 做一個子目錄,并在這個目錄下編輯文件;15) 學習vi編輯器或其它編輯器;16) 編輯輸入程序和編輯makefile文件;17) 編譯程序;18) 執行程序;19) 退出系統,關閉系統。3.3原理和程序樣本:3.3.1 串口簡介串行口是計算機一種常用的接口,具有連接線少,通訊簡單,得到廣泛的使用。常用的串口是 rs-232-c 接口(又稱 eia rs-232-c)它是在 1970 年由美國電子工業協會(eia)聯合貝爾系統、 調制解調器廠家及計算機終端生產廠家共同制定的用于串行通訊的標準。它的全名是數據終端設備(dte)和數據通訊設備(dce)之間串行二進制數據交換接口技術標準該標
17、準規定采用一個 25 個腳的 db25 連接器,對連接器的每個引腳的信號內容加以規定,還對各種信號的電平加以規定。傳輸距離在碼元畸變小于 4% 的情況下,傳輸電纜長度應為 15 米。linux 操作系統從一開始就對串行口提供了很好的支持,需要詳細了解串口使用,建議看參考書 serial programming guide for posix operating systems。3.3.2 計算機串口的引腳說明 序號信號名稱符號流向功能2發送數據txddtedcedte發送串行數據3接收數據rxddtedcedte 接收串行數據4請求發送rtsdtedcedte 請求 dce 將線路切換到發送方
18、式5允許發送ctsdtedcedce 告訴 dte 線路已接通可以發送數據6數據設備準備好dsrdtedcedce 準備好7信號地信號公共地8載波檢測dcddtedce表示 dce 接收到遠程載波20數據終端準備好dtrdtedcedte 準備好22振鈴指示ridtedce表示 dce 與線路接通,出現振鈴3.3.3 串口操作串口操作需要的頭文件#include /*標準輸入輸出定義*/#include /*標準函數庫定義*/#include /*unix 標準函數定義*/#include #include #include /*文件控制定義*/#include /*ppsix 終端控制定義*
19、/#include /*錯誤號定義*/3.3.4 打開串口在 linux 下串口文件是位于 /dev 下的 串口一 為 /dev/ttys0 串口二 為 /dev/ttys1 打開串口是通過使用標準的文件打開函數操作:int fd;/*以讀寫方式打開串口*/fd = open( /dev/ttys0, o_rdwr);if (-1 = fd) /* 不能打開串口一*/ perror( 提示錯誤!);3.3.5 設置串口最基本的設置串口包括波特率設置,效驗位和停止位設置。串口的設置主要是設置 struct termios 結構體的各成員值。struct termio unsigned short
20、 c_iflag;/* 輸入模式標志 */unsigned short c_oflag;/* 輸出模式標志 */unsigned short c_cflag;/* 控制模式標志*/unsigned short c_lflag;/* local mode flags */unsigned char c_line;/* line discipline */unsigned char c_ccncc; /* control characters */;設置這個結構體很復雜,這里就只說說常見的一些設置:波特率設置下面是修改波特率的代碼struct termios opt;tcgetattr(fd, &
21、opt);cfsetispeed(&opt,b19200); /*設置為19200bps*/cfsetospeed(&opt,b19200);tcsetattr(fd,tcanow,&opt);設置波特率的例子函數:/*set_speed(fd, speed) 設置串口通信速率參數 fd 類型 int 打開串口的文件句柄參數 speed 類型 int 串口速度返回 void*/int speed_arr = b38400, b19200, b9600, b4800, b2400, b1200, b300,b38400, b19200, b9600, b4800, b2400, b1200, b
22、300, ;int name_arr = 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, ;void set_speed(int fd, int speed) int i; int status; struct termios opt;tcgetattr(fd, &opt); for (i= 0; i 0) printf(nlen %dn,nread); buffnread+1 = 0; printf( n%s, buff); / close(fd); / exit (0
23、);3.3.10 例子程序(樣本1)3.3.10.1 makfile文件all:send recvsend:tty_send_file.o tty_comm_init.ogcc -o send tty_send_file.o tty_comm_init.otty_send_file.o:tty_send_file.c tty_comm.hgcc -c tty_send_file.crecv:tty_recv_file.o tty_comm_init.ogcc -o recv tty_recv_file.o tty_comm_init.otty_recv_file.o:tty_recv_file
24、.c tty_comm.hgcc -c tty_recv_file.cclean:#rm *.o send recvtty_comm_init.o:tty_comm_init.c tty_comm.hgcc -c tty_comm_init.c3.3.10.2 頭文件#define false0#define true1#define name_len 50#define buffer_len 512#define c1 *#define e1 q#define e2 t#define s_n 0#define s_e1 1#define s_e2 2#define s_c 3void get
25、_file_end_flag(char *, int *);int check_file_end(char *, int *);void insert_chang_char(char *, int *);3.3.10.3 tty_comm_init.c文件(初始化子程序庫)/-#include /*標準輸入輸出定義*/#include /*標準函數庫定義*/#include /*unix標準函數定義*/#include /*/#include /*/#include /*文件控制定義*/#include /*ppsix終端控制定義*/#include /*錯誤號定義*/#include /*錯
26、誤號定義*/#include tty_comm.h/*void set_speed(fd, speed) 設置串口通信速率參數 fd 類型 int 打開串口的文件句柄參數 speed 類型 int 串口速度返回 void*/int speed_arr = b38400, b19200, b9600, b4800, b2400, b1200, b300, b38400, b19200, b9600, b4800, b2400, b1200, b300, ;int name_arr = 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200,
27、 9600, 4800, 2400, 1200, 300, ;void set_speed(int fd, int speed)int i;int status;struct termios opt;tcgetattr(fd, &opt);for ( i= 0; i sizeof(speed_arr) / sizeof(int); i+) if (speed = name_arri) tcflush(fd, tcioflush);cfsetispeed(&opt, speed_arri);cfsetospeed(&opt, speed_arri);status = tcsetattr(fd,
28、tcsanow, &opt); if (status != 0)perror(tcsetattr fd1); return; tcflush(fd, tcioflush);/*int set_parity(fd, databits, stopbits, parity) 設置串口數據位,停止位和效驗位參數 fd 類型 int 打開的串口文件句柄*參數 databits類型 int 數據位 取值 為 7 或者8*參數 stopbits類型 int 停止位 取值為 1 或者2*參數 parity 類型 int 效驗類型 取值為n,e,o,s*/int set_parity(int fd,int da
29、tabits,int stopbits,int parity) struct termios options; if (tcgetattr(fd, &options) != 0) perror(setupserial 1); return(false); options.c_cflag &= csize; switch (databits) /*設置數據位數*/ case 7: options.c_cflag |= cs7; break; case 8: options.c_cflag |= cs8; break; default: fprintf(stderr,unsupported dat
30、a sizen); return (false); switch (parity) case n: case n: options.c_cflag &= parenb; /* clear parity enable */ options.c_iflag &= inpck; / enable parity checking break; case o: case o: options.c_cflag |= (parodd | parenb); /設置為奇效驗 options.c_iflag |= inpck; /* disnable parity checking */ break; case
31、e: case e: options.c_cflag |= parenb; /* enable parity */ options.c_cflag &= parodd; /* 轉換為偶效驗*/ options.c_iflag |= inpck; /* disnable parity checking */ break; case s: case s: /*as no parity*/ options.c_cflag &= parenb; options.c_cflag &= cstopb; break; default: fprintf(stderr,unsupported parityn);
32、 return (false); switch (stopbits) /* 設置停止位*/ case 1: options.c_cflag &= cstopb; break; case 2: options.c_cflag |= cstopb; break; default: fprintf(stderr,unsupported stop bitsn); return (false); if (parity != n) /* set input parity option */ options.c_iflag |= inpck; options.c_ccvtime = 150; / 15 se
33、conds options.c_ccvmin = 0; tcflush(fd,tciflush); /* update the options and do it now */ if (tcsetattr(fd,tcsanow,&options) != 0) perror(setupserial 3); return (false); return (true);/* 打開串口*/int opendev(char *dev) int fd = open( dev, o_rdwr ); /| o_noctty | o_ndelay if (-1 = fd) /*設置數據位數*/ perror(c
34、ant open serial port); return -1; else return fd;/ 文件結束字段void get_file_end_flag(char *bufp, int *buf_len_p) /生成文件結束字串 char *p = bufp; *p+ = e1; *p+ = e2; *buf_len_p = 2;void memncopy(char *t1, char *f1, int n) register char *t = t1, *f = f1; register int i; for (i = 0; i n; i+) *t+ = *f+;static int endstat = s_n;int check_file_end(char *bufp, int *buf_len_p) /檢查文件傳輸完成否? char *p, *p1 = bufp; int ti = 0, bi = 0, ei = *buf_len_p; int r = false; p = malloc(ei); if (p = null) return false; memncopy(p, bufp, ei); while (bi ei) *p1+ = *p+; bi+; ti+; switch
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年山東華興機械集團有限責任公司人員招聘筆試備考題庫含答案詳解(奪分金卷)
- 2024年濱州新能源集團有限責任公司及權屬公司公開招聘工作人員遞補筆試備考題庫含答案詳解(典型題)
- 2025年黑龍江省五大連池市輔警招聘考試試題題庫附答案詳解(鞏固)
- 2025年河北省定州市輔警招聘考試試題題庫附答案詳解
- 2024年湖北省黃石市陽新縣三溪鎮招聘社區工作者考前自測高頻考點模擬試題(共500題)含答案
- 2025年Z世代消費心理分析:新消費品牌市場拓展報告
- 《賀新郎·國脈微如縷》
- 皮膚老化的研究進展2025
- 2025屆高考物理大一輪復習課件 第二章 微點突破2 摩擦力的突變問題
- 2025年小學父親節活動方案-“爸”氣飛揚父愛如光
- 滑板項目選材指標與標準
- 有機化學第九章醛和酮
- 護理體查操作評分標準
- 《交通調查與數據分析》課程教學大綱(本科)
- 兩輪自平衡小車的設計畢業設計論文
- 【課件】3.3觸摸創新——用材料改變觀念課件-2021-2022學年高中美術人美版(2019)選修繪畫
- 工程機械租賃服務方案及保障措施 (1)
- 服裝廠工人各種工序單價單算累計工資表
- 兒童中醫辨識表
- 大班畢業典禮教師詩朗誦《今天你們畢業了》
- 巧克力糖包裝機
評論
0/150
提交評論