串口開發主要有三個方面介紹:
1、 串口概述
2、 串口設置
3、 串口的使用詳解
一、串口的概述:常見的串口數據通信方式:並行通信和串行通信;
串行通信是計算機通信常見數據接口,如:RS-232-C,該標准規定采用一個DB25芯連接器和DB9芯連接器。簡單的介紹一下DB25和DB9,這裡主要用到了其中的三個引腳,一個發送數據(TXD),一個接受數據(RXD),一個接地(GND)。只要去控制這三個引腳就可以。
芯片內部含有UART控制器,其工作方式主要有中斷模式(Interrupt)和直接內存訪問(DMA)兩種工作方式;還有一種是查詢方式,這種工作模式我到目前在工作過程中還沒有遇到過。串口驅動的編程實質上就是對UART控制器的操作實現。
UART操作主要包括以下幾個部分:
1, 數據發送;
2, 數據接收;
3, 產生中斷;
4, 產生波特率;
5, 紅外模式;
6, Loopback模式;
7, 自動流控制模式;
串口參數的配置主要包括:波特率,數據位,校驗位,停止位,流控協議。
Linux下串口設備存放的位置是/dev文件或是說Linux的操作的設備基本都存放在該目錄下;
有多個串口設備時對應的設備名分別是:/dev/ttyS0、/dev/ttyS1、/dev/ttyS2依次增加,在Linux下操作串口和操作文件是相同的,也就是需要open,write,read,close等函數對串口進行打開,讀寫,關閉的操作;
二、串口的詳細配置
在使用串口時必須對其進行相關的配置:如波特率,數據位,校驗位,停止位等;
串口的設置具體由下面的數據結構體實現:
Struct termios
{
unsigned shortc_iflag; /* 輸入模式標志*/
unsigned shortc_oflag; /* 輸出模式標志*/
unsigned shortc_cflag; /* 控制模式標志*/
unsigned shortc_lflag; /*區域模式標志或本地模式標志或局部模式*/
unsigned charc_line; /*行控制linediscipline */
unsignedchar c_cc[NCC];/* 控制字符特性*/
};
該結構體中最重要的就是c_cflag標志;它可以設置波特率,檢驗位,停止位,數據位等,在設置波特率時要在前面加上“B”,如B9600,B15200。使用其要通過“&”,“|”,等操作方式。
其次是輸入標志c_iflag成員控制端口接收字符處理;termios
結構中這兩個成員都有很多的操作標志宏:
c_cflag:
c_iflag:
CCTS_OFLOW;輸出的CTS流控制;
BRKINT;接到BREAK時產生SIGINT
CIGNORS; 忽略控制標志;
ICRNL;將輸入的CR轉化為NL;
CLOCAL; 忽略解制-解調器狀態行;
IGNBRK;忽略BREAK條件
CREAD; 啟用接收裝置
IGNBCR;忽略CR
CRTS_IFLOW; 輸入RTS流控制
IGNPAR;忽略奇偶錯字符
CSIZE; 字符大小屏蔽
IMAXBEL;在輸入列空時振鈴;
CSTOPB;設置兩個停止位,否則為1位
INLCR;將輸入的NL轉化為CR
HUPCL;最後關閉時斷開
INPCK;打開輸入奇偶校驗;
MDMBUF;經載波的流控制輸出
PARENB;進行奇偶校驗
PARODD;奇校驗,否則為偶校驗
接下來就是串口的控制函數:
Tcgetattr;獲取屬性;
Tcsetattr:設置屬性;
cfgetispeed;獲取輸入速度
cfgetospeed;獲取輸出速度;
cfsetispeed;設置輸入速度;
cfsetospeed;設置輸出速度;
Tcdrain;等待所有輸出被傳輸;
tcflow;掛起傳輸或接收;
tcflush;刷清未決輸入和/或輸出;
Tcsendbreak;送BREAK字符;
tcgetpgrp;獲取前台進程組ID;
tcsetpgrp;設置前台進程組ID;
串口的配置流程:
1. 保存原先串口配置使用tcgetattr(fd;&oldtio)函數
struct termios newtio, oldtio;
tcgetattr(fd,&oldtio);
2. 激活選項有CLOCAL和CREAD,用於本地連接和接收使能;
newtio,c_cflag |= CLOCAL | CREAD;
3. 設置波特率,使用cfsetispeed和cfsetospeed
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio, B115200);
4. 設置數據位,需要使用掩碼設置;
newtio.c_cflag&= ~CSIZE;
newtio.c_cflag|= CS8;
5. 設置奇偶校驗,使用c_cflag和c_iflag設置奇偶校驗;
設置奇校驗:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK| ISTRIP);
設置偶校驗:
newtio.c_iflag |= (INPCK| ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_cflag &= ~PARENB;
6. 設置停止位。通過激活c_cflag中的CSTOPB實現。若停止位為1位,則清除CSTOPB,若停止位為2,則激活CSTOPB;
newtio.c_cflag & = ~CSTOPB;
7. 設置最少字符和等待時間,對於接收字符和等待時間一般沒有特別要求,全都設置為0;
newtio.c_c[VMIN] = 0;
newtio.c_c[VTIME] = 0;
8. 處理要寫入的引用對象
tcflush函數刷清輸入緩存或輸出緩存;
函數原型:int tcflush(int filedes,int queue)
Queue數應該是下列三個常數之一:
·TCIFLUSH刷清輸入隊列;
·TCOFLUSH刷清輸出隊列;
·TCIOFLUSH刷清輸入輸出隊列;
9.激活配置。在完成配置後,需要激活配置使其生效,使用tsettattr()函數。原型:
int tcgetattr(int filedes, struct termiso *termptr);
int tcsetattr(int filedes, int opt, conststruct termios *termptr);
到此串口的基本配置就完成了,接下來就是根據上述所說實現串口設備的訪問。詳見串口編程二