第一篇:嵌入式實驗2
南昌航空大學(xué)實驗報告
二0一一 年 10月 16日
課程名稱: 嵌入式系統(tǒng) 實驗名稱: 串行端口程序設(shè)計 班 級: 080611 學(xué)生姓名: 曹啟斌 學(xué)號: 08061107 指導(dǎo)教師評定: 簽名:
一、實驗?zāi)康?了解在linux環(huán)境下串行程序設(shè)計的基本方法。掌握終端的主要屬性及設(shè)置方法,熟悉終端IO函數(shù)的使用。3 學(xué)習(xí)使用多線程來完成串口的收發(fā)處理。
二、實驗內(nèi)容
讀懂程序源代碼,學(xué)習(xí)終端IO函數(shù)tcgetattr(), tcsetattr(),tcflush()的使用方法,學(xué)習(xí)將多線程編程應(yīng)用到串口的接收和發(fā)送程序設(shè)計中。
三、預(yù)備知識
1、有C語言基礎(chǔ)。
2、掌握在LINUX下常用編輯器的使用。
3、掌握Makefile 的編寫和使用。
4、掌握Linux下的程序編譯與交叉編譯過程
四、實驗設(shè)備及工具
硬件:UP-NETARM2410-S嵌入式實驗儀,PC機pentumn500以上, 硬盤40G以上,內(nèi)存大于128M。
軟件:PC機操作系統(tǒng)REDHAT LINUX 9.0 +MINICOM + AMRLINUX開發(fā)環(huán)境
五、實驗原理
Linux 操作系統(tǒng)從一開始就對串行口提供了很好的支持,為進行串行通訊提供了大量的函數(shù),我們的實驗主要是為掌握在LINUX中進行串行通訊編程的基本方法。
1.程序流程圖
程序流程圖如圖2-3所示:
圖2-3 程序流程圖
2串口操作需要的頭文件
#include /*線程庫定義*/ 3打開串口 在 Linux 下串口文件是位于 /dev 下,串口一為/dev/ttyS0,串口二為 /dev/ttyS1,打開串口是通過使用標準的文件打開函數(shù)操作: int fd;/*以讀寫方式打開串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示錯誤!”);} 4設(shè)置串口 最基本的設(shè)置串口包括波特率設(shè)置,效驗位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置 struct termios 結(jié)構(gòu)體的各成員值。 struct termio { unsigned short 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_cc[NCC];/* control characters */ };設(shè)置這個結(jié)構(gòu)體很復(fù)雜,可以參考man手冊或者由趙克佳、沈志宇編寫的《UNIX程序編寫教程》,我這里就只考慮常見的一些設(shè)置: 波特率設(shè)置: 下面是修改波特率的代碼: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*設(shè)置為19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校驗位和停止位的設(shè)置: 無效驗 8位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效驗(Odd)7位 Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效驗(Even)7位 Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效驗 7位 Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;設(shè)置停止位: 1位: options.c_cflag &= ~CSTOPB;2位: options.c_cflag |= CSTOPB;需要注意的是,如果不是開發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來處理,那么使用原始模式(Raw Mode)方式來通訊,設(shè)置方式如下: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/ options.c_oflag &= ~OPOST;/*Output*/ 5讀寫串口 設(shè)置好串口之后,讀寫串口就很容易了,把串口當作文件讀寫就可以了。發(fā)送數(shù)據(jù): char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)讀取串口數(shù)據(jù): 使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(Raw Mode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實際串口收到的字符數(shù)。 可以使用操作文件的函數(shù)來實現(xiàn)異步讀取,如fcntl,或者select等來操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6關(guān)閉串口 關(guān)閉串口就是關(guān)閉文件。close(fd);7空MODEM通訊連接電纜 一般進行串口調(diào)試使用空MODEM連接電纜,其接線方式如下圖2-4所示: 圖2-4 實用RS-232C通訊連線 六、實驗步驟 1.2.3.4.進入expbasic