歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

串口編程 一

串口開發主要有三個方面介紹:

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);

到此串口的基本配置就完成了,接下來就是根據上述所說實現串口設備的訪問。詳見串口編程二

Copyright © Linux教程網 All Rights Reserved