Linux下串列埠程式設計

2021-06-18 08:43:59 字數 3621 閱讀 3749

linux下串列埠程式設計

linux 系統下,諸如串列埠、觸控螢幕、gpio、adc 等等各種裝置的操作,都是

通過訪問其對應的裝置節點進行控制。相應地,串列埠通過訪問/dev/ttys0、

/dev/ttys1、/dev/ttys2...對其進行配置與控制。

串列埠配置的引數包括:波特率,資料位,校驗位,停止位與流控。

串列埠的配置主要是通過配置struct termios 結構體,其原型如下:

#include

struct termio

;其中,通過對c_cflag 與c_iflag 的賦值,可以設定波特率、資料位、奇偶校驗位、

停止位、流控。

1、波特率配置

串列埠通過函式cfsetispeed 和cfsetospeed 設定埠的輸入/輸出波特率:

int cfsetispeed(struct termios *termios_p, speed_t speed);

int cfsetospeed(struct termios *termios_p, speed_t speed);

其中termios_p 為串列埠接頭體termios 指標變數;speed 為需要設定的串列埠傳輸速

率,取值與波特率對應關係見表:巨集定義

波特率(單位:bit/s) 巨集定

義波特率(單位:bit/s)

b0 0 b1800 1800

b50 50 b2400 2400

b75 75 b4800 4800

b110 110 b9600 9600

b134 134 b19200 19200

b150 150 b38400 38400

b200 200 b57600 57600

b300 300 b115200 115200

b600 600 b230400 230400

b1200 1200

2、資料位配置

串列埠資料位的配置通過修改termios 結構體成員c_cflag 實現,cs5、cs6、cs7

和cs8分別表示資料位為5、6、7和8。在設定資料位前,先使用csize 做位屏

蔽:termios_p.c_cflag &= ~csize;

termios_p.c_cflag |= cs5; /*配置為5資料位*/

3、校驗位配置

校驗位包括:無校驗、奇校驗、偶校驗、空格等:

無校驗:

termios_p.c_cflag &= ~parenb;

termios_p.c_iflag &= ~inpck;

奇校驗:

termios_p.c_cflag &= (parodd | parenb);

termios_p.c_iflag &= inpck;

偶校驗:

termios_p.c_cflag |= parenb;

termios_p.c_cflag ~parodd;

termios_p.c_iflag & |= inpck;

空格:termios_p.c_cflag &= ~parenb;

termios_p.c_cflag &= ~cstopb;

termios_p.c_iflag |= inpck;

4、停止位配置

串列埠停止位通過啟用c_cflag 的cstopb 控制,具體方法如下:

1個停止位:

termios_p.c_cflag &= ~cstopb;

2個停止位:

termios_p.c_cflag |= cstopb;

5、流控配置

流控用於標識資料的開始與結束,流控的種類包括硬體流、軟體流與不使用流控。

不使用流控:

termios_p.c_cflag &= ~crtscts;

硬體流:

termios_p.c_cflag |= crtscts;

軟體流:

termios_p.c_cfalg |= ixon | ixoff | ixany;

例子程式:

程式實現了配置串列埠0引數與向串列埠0輸出資料

#include

#include

#include

#include

#include

#include

#include

#include

#include

void set_uart(int fd, int databits, int stopbit, char parity, char datastream)

/*flush memory*/

tcflush(fd,tcioflush);

/*set i/o speed*/

cfsetispeed(&termios_opt, b115200);

cfsetospeed(&termios_opt, b115200);

/*active options*/

termios_opt.c_cflag |= clocal | cread;

/*set databits,default is 8 databits*/

termios_opt.c_cflag &= ~csize;

switch (databits)

/*set parity, default is no vertify*/

switch (parity)

/*set stop bits, default is 1 stopbit*/

switch (stopbit)

/*set data stream,default is no data stream control*/

switch (datastream)

/*oput modle,initial data output*/

termios_opt.c_oflag &= ~opost;

/*set waiting time and recv min character*/

termios_opt.c_cc[vtime] = 0;

termios_opt.c_cc[vmin] = 0;

/*flush memory*/

tcflush(fd,tciflush);

/*start using new options*/

if((tcsetattr(fd,tcsanow,&termios_opt)) != 0)

printf("set serial done!\n");

return ;

}int main(void)

;memset(data,'a',sizeof(data));

printf("open uart..\n");

serial_fd = open("/dev/ttys0",o_rdwr | o_noctty | o_nonblock);

if (serial_fd == -1)

/*set uart*/

set_uart(serial_fd, 8, 1, 'n', 'n'); //8 databits, 1 stopbit, no vertify, no data stream control

while(1)

close(serial_fd);

return 0;

}

Linux 下串列埠程式設計 程式設計實現

在 linux 下串列埠檔案是位於 dev 下的 開啟串列埠是通過使用標準的檔案開啟函式open操作 include include include include include include include include static int fd int uart open int fd,...

Linux 下串列埠通訊程式設計

int open com char device name return fd end of open com 一 串列埠程式需要的標頭檔案 include 標準輸入輸出定義 include 標準函式庫定義 include unix標準函式定義 include include include 檔案控...

Linux下串列埠程式設計入門

簡介 linux作業系統從一開始就對序列口提供了很好的支援,本文就linux下的序列口通訊程式設計進行簡單的介紹。串列埠簡介 序列口是計算機一種常用的介面,具有連線線少,通訊簡單,得到廣泛的使用。常用的串列埠是rs 232 c介面 又稱eia rs 232 c 它是在1970年由美國電子工業協會 e...