歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux串口編程分析(一)

Linux串口編程分析(一)

日期:2017/2/25 10:38:40   编辑:Linux教程

  這個話題,大家可能再熟悉不過了,網上資料很多,因為這是linux下編程比較重要的一個方面,懂這方面的人很多;這裡我只是想給初學者簡單的介紹下這方面的知識:

  串口編程其實說白了, 是拿根串口線把電腦和所要控制的機器連接起來,然後在通過編程的方式對下位機進行發送指定的數據或進行控制,或進行傳輸,然後在接受下位機反饋回來的信息提示是否已經正確。是不是好俗!

  串口是計算機上一種非常通用設備通信的協議,常用PC機上包含的是RS232規格的串口,當然,除了RS232 ,還有RS485和RS422兩種規格,用於不同的設備通信;這裡主要是介紹RS232串口編程。

  在串口編程中,比較重要的是串口的設置,我們要設置的部分包括波特率,數據位,停止位,奇偶校驗位;要注意的是,每台機器的串口默認設置可能是不同的,如 果你沒設置這些,僅僅按照默認設置進行發送數據,很可能出現n 多異想不到而又查不出來的情況;所以,在真正通訊前,我們必須設置這些:

  下面就開始介紹這些基本設置的函數,(其實都是些固定框架,程序中稍微改改就行)~o~

  1.設置波特率

  注意每台機器都有輸出和輸入接受信息的速度 ,所以用cfsetispeed 和cfsetospeed來分別設置;注意到struct termios 這樣一個結構,它包括了串口端所有的設置,下面還要用到。它在termios.h中被定義。。還有一個地方比較難以理解,為什麼設置了speed_arr 和name_arr兩個數組,這是因為在linuxe 下,系統為波特率專門准備了一張表用B38400,B19200......代替,而我們實際上傳進去的只能是38400,19200這些值,所以我們拿我們傳進去的和name_arr進行比較,如果相等則從系統對照表中取出相應值進行設置,如果不等證明傳的值在系統對照表中沒有,則不進行設置。

  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, 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 判斷傳進來是否相等

  {

  tcflush(fd, TCIOFLUSH); //刷新輸入輸出緩沖

  cfsetispeed(&Opt, speed_arr); //這裡分別設置

  cfsetospeed(&Opt, speed_arr);

  status = tcsetattr(fd, TCSANOW, &Opt); //這是立刻把bote rates設置真正寫到串口中去

  if (status != 0)

  perror("tcsetattr fd1"); //設置錯誤

  return;

  }

  tcflush(fd,TCIOFLUSH); //同上

  }

  }

  2。設置奇偶校驗,數據,停止位

  這三個參數通常放在一起設置,databits是數據位,stopbits是停止位,parity是校驗位。

  串口的這些設置是很復雜很復雜的,Termios成員中共定義c_cflag 控制項 c_lflag 線路項 c_iflag 輸入項 c_oflag 輸出項 c_cc 控制字符 c_ispeed 輸入波特 c_ospeed 輸出波特那麼多項,對於每一項都有很多的設置,這裡我們不講的那麼復雜,就一個通用的串口框架進行解釋,主要進行奇偶校驗,數據,停止位的設置。而其他的一些控制項,在程序中用到時穿插講解:

  int set_Parity(int fd,int databits,int stopbits,int parity)

  {

  struct termios options; //定義一個結構

  if ( tcgetattr( fd,&options) != 0) //首先讀取系統默認設置options中,必須

  {

  perror("SetupSerial 1");

  return(FALSE);

  }

Copyright © Linux教程網 All Rights Reserved