1. 程式人生 > >Linux下的串列埠程式設計(二)

Linux下的串列埠程式設計(二)

Linxu下的串列埠程式設計(二)

 /************宣告:本人只是見到這篇文章對我幫助很大才轉載的,但是這個完整的程式裡面本來有語法錯誤的,現在讓我改過來了************/

---------------------------------------------------------

Author             :tiger-john
WebSite            :blog.csdn.net/tigerjb

Update-Time   : 2011年2月14日星期一

Tiger宣告:本人鄙視直接複製本人文章而不加出處的個人或團體,

但不排斥別人轉載tiger-john的文章,只是請您註明出處並和本人

聯絡或留言給我。3Q

---------------------------------------------------------

前面已經提到過Linux下皆為檔案,這當然也包括我們今天的主角àUART0串列埠。因此對他的一切操作都和檔案的操作一樣(涉及到了open,read,write,close等檔案的基本操作)。

一.Linux下的串列埠程式設計又那幾部分組成

1.    開啟串列埠

2.    串列埠初始化

3.    讀串列埠或寫串列埠

4.    關閉串列埠

二.串列埠的開啟

既然串列埠在linux中被看作了檔案,那麼在對檔案進行操作前先要對其進行開啟操作。

1.在Linxu中,串列埠裝置是通過串列埠終端裝置檔案來訪問的,即通過訪問/dev/ttyS0,/dev/ttyS1,/dev/ttyS2這些裝置檔案實現對串列埠的訪問。

2.呼叫open()函式來代開串列埠裝置,對於串列埠的開啟操作,必須使用O_NOCTTY引數。

l  O_NOCTTY:表示開啟的是一個終端裝置,程式不會成為該埠的控制終端。如果不使用此標誌,任務一個輸入(eg:鍵盤中止訊號等)都將影響程序。

l  O_NDELAY:表示不關心DCD訊號線所處的狀態(埠的另一端是否啟用或者停止)。

3.開啟串列埠模組有那及部分組成

1>呼叫open()函式開啟串列埠,獲取串列埠裝置檔案描述符

2>獲取串列埠狀態,判斷是否阻塞

3>測試開啟的檔案描述符是否為終端裝置

4程式:

/*****************************************************************

* 名稱:                    UART0_Open

* 功能:                    開啟串列埠並返回串列埠裝置檔案描述

* 入口引數:            fd    :檔案描述符     port :串列埠號(ttyS0,ttyS1,ttyS2)

* 出口引數:            正確返回為1,錯誤返回為0

*****************************************************************/

int UART0_Open(int fd,char* port)

{

      fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);

      if (FALSE == fd)

             {

                    perror("Can't Open Serial Port");

                    return(FASLE);

             }

  //判斷串列埠的狀態是否為阻塞狀態                            

  if(fcntl(fd, F_SETFL, 0) < 0)

      {

             printf("fcntl failed!/n");

           return(FALSE);

      }     

  else

  {

       printf("fcntl=%d/n",fcntl(fd, F_SETFL,0));

  }

  //測試是否為終端裝置    

  if(0 == isatty(STDIN_FILENO))

      {

             printf("standard input is not a terminal device/n");

        return(FALSE);

      }

  else

      {

           printf("isatty success!/n");

      }       

  printf("fd->open=%d/n",fd);

  return fd;

}

三.串列埠的初始化

1.    在linux中的串列埠初始化和前面的串列埠初始化一樣。需要設定串列埠波特率,資料流控制,幀的格式(即資料位個數,停止位,校驗位,資料流控制)

2.    串列埠初始化模組有那幾部分組成:

1>.設定波特率

2>設定資料流控制

2>設定幀的格式(即資料位個數,停止位,校驗位)

John哥說明:

1>設定串列埠引數時要用到termios結構體,因此先要通過函式

tcgettattr(fd,&options)獲得串列埠指向termios結構的指標。

2>通過cfsetispeed函式和cfsetospeed函式用來設定串列埠的輸入/輸出波特率。一般情況下,輸入和輸出波特率相等的。

3>設定資料位可以通過修改termios機構體中c_flag來實現。其中CS5,CS6,CS7,CS8對應資料位的5,6,7,8。在設定資料位時,必須要用CSIZE做位遮蔽。

4>資料流控制是使用何種方法來標誌資料傳輸的開始和結束。

5>在設定完波特率,資料流控制,資料位,校驗位,停止位,停止位後,還要設定最小等待時間和最小接收字元。

6>在完成配置後要通過tcsetattr()函式來啟用配置。

3.程式:

/*******************************************************************

* 名稱:                UART0_Set

* 功能:                設定串列埠資料位,停止位和效驗位

* 入口引數:        fd         串列埠檔案描述符

*                              speed      串列埠速度

*                              flow_ctrl  資料流控制

*                           databits   資料位   取值為 7 或者8

*                           stopbits   停止位   取值為 1 或者2

*                           parity     效驗型別 取值為N,E,O,,S

*出口引數:              正確返回為1,錯誤返回為0

*******************************************************************/

int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)

{

      int   i;

         int   status;

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

    struct termios options;

    /*tcgetattr(fd,&options)得到與fd指向物件的相關引數,並將它們保存於options,該函式,還可以測試配置是否正確,該串列埠是否可用等。若呼叫成功,函式返回值為0,若呼叫失敗,函式返回值為1.

    */

    if  ( tcgetattr( fd,&options)  !=  0)

       {

          perror("SetupSerial 1");    

          return(FALSE); 

       }

    //設定串列埠輸入波特率和輸出波特率

    for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)

                {

              if  (speed == name_arr[i])

              {       

                          cfsetispeed(&Options, speed_arr[i]); 

                          cfsetospeed(&Options, speed_arr[i]);  

              }

       }     

    //修改控制模式,保證程式不會佔用串列埠

    options.c_cflag |= CLOCAL;

    //修改控制模式,使得能夠從串列埠中讀取輸入資料

    options.c_cflag |= CREAD;

    //設定資料流控制

    switch(flow_ctrl)

    {

       case 0 ://不使用流控制

              options.c_cflag &= ~CRTSCTS;

              break;   

       case 1 ://使用硬體流控制

              options.c_cflag |= CRTSCTS;

              break;

       case 2 ://使用軟體流控制

              options.c_cflag |= IXON | IXOFF | IXANY;

              break;

    }

    //設定資料位

    options.c_cflag &= ~CSIZE; //遮蔽其他標誌位

    switch (databits)

    {  

       case 5    :

                     options.c_cflag |= CS5;

                     break;

       case 6    :

                     options.c_cflag |= CS6;

                     break;

       case 7    :    

                 options.c_cflag |= CS7;

                 break;

       case 8:    

                 options.c_cflag |= CS8;

                 break;  

       default:   

                 fprintf(stderr,"Unsupported data size/n");

                 return (FALSE); 

    }

    //設定校驗位

    switch (parity)

    {  

       case 'n':

       case 'N': //無奇偶校驗位。

                 options.c_cflag &= ~PARENB; 

                 options.c_iflag &= ~INPCK;    

                 break; 

       case 'o':  

       case 'O'://設定為奇校驗    

                 options.c_cflag |= (PARODD | PARENB); 

                 options.c_iflag |= INPCK;             

                 break; 

       case 'e': 

       case 'E'://設定為偶校驗  

                 options.c_cflag |= PARENB;       

                 options.c_cflag &= ~PARODD;       

                 options.c_iflag |= INPCK;       

                 break;

       case 's':

       case 'S': //設定為空格 

                 options.c_cflag &= ~PARENB;

                 options.c_cflag &= ~CSTOPB;

                 break; 

        default:  

                 fprintf(stderr,"Unsupported parity/n");   

                 return (FALSE); 

    } 

    // 設定停止位 

    switch (stopbits)

    {  

       case 1:   

                 options.c_cflag &= ~CSTOPB; 

                 break; 

       case 2:   

                 options.c_cflag |= CSTOPB; 

                         break;

       default:   

                       fprintf(stderr,"Unsupported stop bits/n"); 

                       return (FALSE);

    }

    //修改輸出模式,原始資料輸出

    options.c_oflag &= ~OPOST;

    //設定等待時間和最小接收字元

    options.c_cc[VTIME] = 1; /* 讀取一個字元等待1*(1/10)s */  

    options.c_cc[VMIN] = 1; /* 讀取字元的最少個數為1 */

    //如果發生資料溢位,接收資料,但是不再讀取

    tcflush(fd,TCIFLUSH);

    //啟用配置 (將修改後的termios資料設定到串列埠中)

    if (tcsetattr(fd,TCSANOW,&options) != 0)  

    {

               perror("com set error!/n");  

       return (FALSE); 

    }

    return (TRUE); 

}

/*******************************************************************

* 名稱:                  UART0_Init()

* 功能:                串列埠初始化

* 入口引數:        fd           檔案描述符   

*               speed     串列埠速度

*                              flow_ctrl   資料流控制

*               databits    資料位   取值為 7 或者8

*                           stopbits   停止位   取值為 1 或者2

*                           parity     效驗型別 取值為N,E,O,,S                    

* 出口引數:        正確返回為1,錯誤返回為0

*******************************************************************/

int UART0_Init(int fd, int speed,int flow_ctrlint databits,int stopbits,int parity)

{

    int err;

    //設定串列埠資料幀格式

    if (UART0_Set(fd,115200,0,8,1,'N') == FALSE)

    {                                                     

        return FALSE;

    }

    else

    {

               return  TRUE;

        }

}

注:

如果不是開發終端之類的,只是串列埠傳輸資料,而不需要串列埠來處理,那麼使用原始模式(Raw Mode)方式來通訊,設定方式如下:

options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/

options.c_oflag  &= ~OPOST;   /*Output*/

四.    串列埠的讀寫函式:

1.     讀寫串列埠是通過使用read函式和write函式來實現的。

2.     程式

/*******************************************************************

* 名稱:                  UART0_Recv

* 功能:                接收串列埠資料

* 入口引數:        fd                  :檔案描述符    

*                              rcv_buf     :接收串列埠中資料存入rcv_buf緩衝區中

*                              data_len    :一幀資料的長度

* 出口引數:        正確返回為1,錯誤返回為0

*******************************************************************/

int UART0_Recv(int fd, char *rcv_buf,int data_len)

{

    int len,fs_sel;

    fd_set fs_read;

    struct timeval time;

    FD_ZERO(&fs_read);

    FD_SET(fd,&fs_read);

    time.tv_sec = 10;

    time.tv_usec = 0;

    //使用select實現串列埠的多路通訊

    fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);

    if(fs_sel)

       {

              len = read(fd,data,data_len);

              return len;

       }

    else

       {

              return FALSE;

       }     

}

/*******************************************************************

* 名稱:                UART0_Send

* 功能:                傳送資料

* 入口引數:        fd                  :檔案描述符    

*                              send_buf    :存放串列埠傳送資料

*                              data_len    :一幀資料的個數

* 出口引數:        正確返回為1,錯誤返回為0

*******************************************************************/

int UART0_Send(int fd, char *send_buf,int data_len)

{

    int len = 0;

    len = write(fd,send_buf,data_len);

    if (len == data_len )

       {

              return len;

       }     

    else   

        {

                tcflush(fd,TCOFLUSH);

                return FALSE;

        }

    }

五.    關閉串列埠

在完成對串列埠裝置的操作後,要呼叫close函式關閉該檔案描述符。

程式:

/******************************************************

* 名稱:                UART0_Close

* 功能:                關閉串列埠並返回串列埠裝置檔案描述

* 入口引數:        fd    :檔案描述符   

* 出口引數:        void

*******************************************************************/

void UART0_Close(int fd)

{

    close(fd);

}

一.    一個完整程式

/************************Copyright(c)*******************************
**                       西安郵電學院
**                       graduate school
**                                     XNMS專案組
**                       WebSite :blog.csdn.net/tigerjb
**------------------------------------------FileInfo-------------------------------------------------------
** File name:                 main.c
** Last modified Date:  2011-01-31
** Last Version:              1.0
** Descriptions:            
**------------------------------------------------------------------------------------------------------
** Created by:               冀博
** Created date:            2011-01-31
** Version:                            1.0
** Descriptions:             The original version
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
*******************************************************************/
 
 
//串列埠相關的標頭檔案
#include<stdio.h>      /*標準輸入輸出定義*/
#include<stdlib.h>     /*標準函式庫定義*/
#include<unistd.h>     /*Unix 標準函式定義*/
#include<sys/types.h> 
#include<sys/stat.h>   
#include<fcntl.h>      /*檔案控制定義*/
#include<termios.h>    /*PPSIX 終端控制定義*/
#include<errno.h>      /*錯誤號定義*/
#include<string.h>
 
 
//巨集定義
#define FALSE  -1
#define TRUE   0
 
/*******************************************************************
* 名稱:                  UART0_Open
* 功能:                開啟串列埠並返回串列埠裝置檔案描述
* 入口引數:        fd    :檔案描述符     port :串列埠號(ttyS0,ttyS1,ttyS2)
* 出口引數:        正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Open(int fd,char* port)
{
   
         fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);
         if (FALSE == fd)
                {
                       perror("Can't Open Serial Port");
                       return(FALSE);
                }
     //恢復串列埠為阻塞狀態                               
     if(fcntl(fd, F_SETFL, 0) < 0)
                {
                       printf("fcntl failed!\n");
                     return(FALSE);
                }     
         else
                {
                  printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
                }
      //測試是否為終端裝置    
      if(0 == isatty(STDIN_FILENO))
                {
                       printf("standard input is not a terminal device\n");
                  return(FALSE);
                }
  else
                {
                     printf("isatty success!\n");
                }              
  printf("fd->open=%d\n",fd);
  return fd;
}
/*******************************************************************
* 名稱:                UART0_Close
* 功能:                關閉串列埠並返回串列埠裝置檔案描述
* 入口引數:        fd    :檔案描述符     port :串列埠號(ttyS0,ttyS1,ttyS2)
* 出口引數:        void
*******************************************************************/
 
void UART0_Close(int fd)
{
    close(fd);
}
 
/*******************************************************************
* 名稱:                UART0_Set
* 功能:                設定串列埠資料位,停止位和效驗位
* 入口引數:        fd        串列埠檔案描述符
*                              speed     串列埠速度
*                              flow_ctrl   資料流控制
*                           databits   資料位   取值為 7 或者8
*                           stopbits   停止位   取值為 1 或者2
*                           parity     效驗型別 取值為N,E,O,,S
*出口引數:          正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
   
      int   i;
         int   status;
         int   speed_arr[] = { B115200, B19200, B9600, B4800, B2400, B1200, B300};
     int   name_arr[] = {115200,  19200,  9600,  4800,  2400,  1200,  300};
         
    struct termios options;
   
    /*tcgetattr(fd,&options)得到與fd指向物件的相關引數,並將它們保存於options,該函式還可以測試配置是否正確,該串列埠是否可用等。若呼叫成功,函式返回值為0,若呼叫失敗,函式返回值為1.
    */
    if  ( tcgetattr( fd,&options)  !=  0)
       {
          perror("SetupSerial 1");    
          return(FALSE); 
       }
  
    //設定串列埠輸入波特率和輸出波特率
    for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)
                {
                     if  (speed == name_arr[i])
                            {             
                                 cfsetispeed(&options, speed_arr[i]); 
                                 cfsetospeed(&options, speed_arr[i]);  
                            }
              }     
   
    //修改控制模式,保證程式不會佔用串列埠
    options.c_cflag |= CLOCAL;
    //修改控制模式,使得能夠從串列埠中讀取輸入資料
    options.c_cflag |= CREAD;
  
    //設定資料流控制
    switch(flow_ctrl)
    {
      
       case 0 ://不使用流控制
              options.c_cflag &= ~CRTSCTS;
              break;   
      
       case 1 ://使用硬體流控制
              options.c_cflag |= CRTSCTS;
              break;
       case 2 ://使用軟體流控制
              options.c_cflag |= IXON | IXOFF | IXANY;
              break;
    }
    //設定資料位
    //遮蔽其他標誌位
    options.c_cflag &= ~CSIZE;
    switch (databits)
    {  
       case 5    :
                     options.c_cflag |= CS5;
                     break;
       case 6    :
                     options.c_cflag |= CS6;
                     break;
       case 7    :    
                 options.c_cflag |= CS7;
                 break;
       case 8:    
                 options.c_cflag |= CS8;
                 break;  
       default:   
                 fprintf(stderr,"Unsupported data size\n");
                 return (FALSE); 
    }
    //設定校驗位
    switch (parity)
    {  
       case 'n':
       case 'N': //無奇偶校驗位。
                 options.c_cflag &= ~PARENB; 
                 options.c_iflag &= ~INPCK;    
                 break; 
       case 'o':  
       case 'O'://設定為奇校驗    
                 options.c_cflag |= (PARODD | PARENB); 
                 options.c_iflag |= INPCK;             
                 break; 
       case 'e': 
       case 'E'://設定為偶校驗  
                 options.c_cflag |= PARENB;       
                 options.c_cflag &= ~PARODD;       
                 options.c_iflag |= INPCK;      
                 break;
       case 's':
       case 'S': //設定為空格 
                 options.c_cflag &= ~PARENB;
                 options.c_cflag &= ~CSTOPB;
                 break; 
        default:  
                 fprintf(stderr,"Unsupported parity\n");    
                 return (FALSE); 
    } 
    // 設定停止位 
    switch (stopbits)
    {  
       case 1:   
                 options.c_cflag &= ~CSTOPB; break; 
       case 2:   
                 options.c_cflag |= CSTOPB; break;
       default:   
                       fprintf(stderr,"Unsupported stop bits\n"); 
                       return (FALSE);
    }
   
  //修改輸出模式,原始資料輸出
  options.c_oflag &= ~OPOST;
  
  options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//我加的
//options.c_lflag &= ~(ISIG | ICANON);
   
    //設定等待時間和最小接收字元
    options.c_cc[VTIME] = 1; /* 讀取一個字元等待1*(1/10)s */  
    options.c_cc[VMIN] = 1; /* 讀取字元的最少個數為1 */
   
    //如果發生資料溢位,接收資料,但是不再讀取 重新整理收到的資料但是不讀
    tcflush(fd,TCIFLUSH);
   
    //啟用配置 (將修改後的termios資料設定到串列埠中)
    if (tcsetattr(fd,TCSANOW,&options) != 0)  
           {
               perror("com set error!\n");  
              return (FALSE); 
           }
    return (TRUE); 
}
/*******************************************************************
* 名稱:                UART0_Init()
* 功能:                串列埠初始化
* 入口引數:        fd       :  檔案描述符   
*               speed  :  串列埠速度
*                              flow_ctrl  資料流控制
*               databits   資料位   取值為 7 或者8
*                           stopbits   停止位   取值為 1 或者2
*                           parity     效驗型別 取值為N,E,O,,S
*                      
* 出口引數:        正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
    int err;
    //設定串列埠資料幀格式
    if (UART0_Set(fd,19200,0,8,1,'N') == FALSE)
       {                                                         
        return FALSE;
       }
    else
       {
               return  TRUE;
        }
}
 
/*******************************************************************
* 名稱:                  UART0_Recv
* 功能:                接收串列埠資料
* 入口引數:        fd                  :檔案描述符    
*                              rcv_buf     :接收串列埠中資料存入rcv_buf緩衝區中
*                              data_len    :一幀資料的長度
* 出口引數:        正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Recv(int fd, char *rcv_buf,int data_len)
{
    int len,fs_sel;
    fd_set fs_read;
   
    struct timeval time;
   
    FD_ZERO(&fs_read);
    FD_SET(fd,&fs_read);
   
    time.tv_sec = 10;
    time.tv_usec = 0;
   
    //使用select實現串列埠的多路通訊
    fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
    if(fs_sel)
       {
              len = read(fd,rcv_buf,data_len);
	      printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel);
              return len;
       }
    else
       {
	      printf("Sorry,I am wrong!");
              return FALSE;
       }     
}
/********************************************************************
* 名稱:                  UART0_Send
* 功能:                傳送資料
* 入口引數:        fd                  :檔案描述符    
*                              send_buf    :存放串列埠傳送資料
*                              data_len    :一幀資料的個數
* 出口引數:        正確返回為1,錯誤返回為0
*******************************************************************/
int UART0_Send(int fd, char *send_buf,int data_len)
{
    int len = 0;
   
    len = write(fd,send_buf,data_len);
    if (len == data_len )
              {
                     return len;
              }     
    else   
        {
               
                tcflush(fd,TCOFLUSH);
                return FALSE;
        }
   
}
 
 
int main(int argc, char **argv)
{
    int fd;                            //檔案描述符
    int err;                           //返回呼叫函式的狀態
    int len;                        
    int i;
    char rcv_buf[100];       
    char send_buf[20]="tiger john";
    if(argc != 3)
       {
              printf("Usage: %s /dev/ttySn 0(send data)/1 (receive data) \n",argv[0]);
              return FALSE;
       }
    fd = UART0_Open(fd,argv[1]); //開啟串列埠,返回檔案描述符
    do{
                  err = UART0_Init(fd,19200,0,8,1,'N');
                  printf("Set Port Exactly!\n");
       }while(FALSE == err || FALSE == fd);
   
    if(0 == strcmp(argv[2],"0"))
           {
                  for(i = 0;i < 10;i++)
                         {
                                len = UART0_Send(fd,send_buf,10);
                                if(len > 0)
                                       printf(" %d send data successful\n",i);
                                else
                                       printf("send data failed!\n");
                          
                                sleep(2);
                         }
                  UART0_Close(fd);             
           }
    else
           {
                                      
           while (1) //迴圈讀取資料
                  {  
                     len = UART0_Recv(fd, rcv_buf,9);
                     if(len > 0)
                            {
			           rcv_buf[len] = '\0';
                                   printf("receive data is %s\n",rcv_buf);
			           printf("len = %d\n",len);
                            }
                     else
                            {
                                   printf("cannot receive data\n");
                            }
                     sleep(2);
              }            
       UART0_Close(fd); 
           }
}
  
/*********************************************************************                            End Of File                          **
*******************************************************************/


UART0串列埠程式設計目錄:

相關推薦

Linux串列程式設計教程(三——串列程式設計詳(原始碼解:http://blog.csdn.net/u011192270/article/details/48174353 Linux串列程式設計(----(圖文並茂,講解深刻http://blog.csdn.net/w28252

Linux串列埠程式設計教程(三)——串列埠程式設計詳(原始碼)解:http://blog.csdn.net/u011192270/article/details/48174353 Linux下的串列埠程式設計(二)----(圖文並茂,講解深刻)http://blog.csdn.ne

Linux串列程式設計(

Linxu下的串列埠程式設計(二)  /************宣告:本人只是見到這篇文章對我幫助很大才轉載的,但是這個完整的程式裡面本來有語法錯誤的,現在讓我改過來了************/ ---------------------------------------

Linux串列程式設計總結

1.串列埠操作需要的標頭檔案 #include <stdio.h> //標準輸入輸出定義 #include <stdlib.h> //標準函式庫定義 #include <unistd.h> //Unix標準函式定義 #include <

Linux串列程式設計基礎

串列埠知識 序列介面 (SerialInterface) 是指資料一位一位地順序傳送,其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用於遠距離通訊,但傳送速度較慢。 1. 波特率

linux串列程式設計設定函式---------set_opt(fd1,115200,8,'N'1)--------------------

open /dev/ttys0, 裝置檔案之後,得到檔案描述符, 對串列埠進行設定。 /** *串列埠設定函式:例(fd1, 115200, 8, 'N', 1); *引數: *fd:串列埠裝置節點

linux裝置驅動,tty串列程式設計 如何檢視linux串列是否可用?串列名稱等

如何檢視linux下串列埠是否可用?串列埠名稱等? 檢視串列埠是否可用,可以對串列埠傳送資料比如對com1口,echo lyjie126 > /dev/ttyS0 檢視串列埠名稱使用 ls -l /dev/ttyS* 一般情況下串列埠的名稱全部在dev下面,如果你沒

Linux串列通訊詳解(上開啟串列串列初始化詳解

linux下串列埠通訊主要有下面幾個步驟 串列埠通訊流程圖 下面我會一一介紹這幾個步驟。 1.開啟串列埠 程式碼(串列埠為ttyUSB0) //開啟串列埠 int open_port(void) { int fd; fd=open("/dev/ttyUSB0

Linux作業系統串列程式設計入門教程

簡介:   Linux作業系統從一開始就對序列口提供了很好的支援,本文就Linux下的序列口通訊程式設計進行簡單的介紹。   串列埠簡介   序列口是計算機一種常用的介面,具有連線線少,通訊簡單,得到廣泛的使用。常用的串列埠是RS-232-C介面(又稱EIA RS-232-

linux安裝vsftp(

restart put pass con system 關閉 set acc cannot 安裝vsftpd 1、以管理員(root)身份執行以下命令 yum install vsftpd 2、設置開機啟動vsftpd ftp服務 chkconfig vsftpd

AliOS-Things--ESP8266-linkkitapp-串列

/* * Copyright (C) 2015-2017 Alibaba Group Holding Limited * * * this is a uart sample from hal uart for esp8266, and the same as other

Linux C++串列程式設計 ROS

串列埠簡介                     序列介面(Serial port)又稱“序列埠”,主要用於序列式逐位資料傳輸。常見的有一般計算機應用的

解決Linux串列資料接收不全的異常問題

1、引言     最近在Linux下除錯串列埠程式,遇到了串列埠資料接收不全的異常問題,經過將近一上午的努力終於找到問題根源,特此分享給大家,此次除錯過程中用到了主要用到了minicom工具,至於minicom的使用大家可以自行查詢相關資料。 2、正文  

記一次linux串列資料丟包解決過程

專案中兩個晶片之間用串列埠進行通訊,由於傳輸格式中有校驗位,在資料量很大的時候總是校驗失敗。於是花了很長的時間最終解決了這個問題。 首先串列埠丟資料有兩種情況(明顯排除傳送端傳送的資料不對),第一種是通道也就是串列埠線或者連線口不行,無法承受很高的波特率(我使用的波特率是9

Linux開發stm32( | 使用openocd下載程式

1.openocd介紹 openocd全名叫做Open On-Chip Debugger,是一個自由開放的片上除錯工具和程式設計工具,目前已經發布到0.10.0版本,目前主流偵錯程式幾乎都支援,具體可以檢視Open On-Chip Debugger:OpenOCD User’s Guid

linux 串列工具minicom的使用

為了在ubuntu 12.04下能夠看到正常串列埠輸出,使用Minicom. 1、安裝   sudo apt-get install minicom 2、配置 (1)首先在命令列下執行sudo minicom啟動程式 (2)進入主介面後按 Ctrl+A 然後再按Z 進入配

linux串列除錯工具/串列終端推薦: picocom

對於picocom, kermit, minicom, picocom 最簡單易用,也完全符合我的使用需求。 安裝(mint / ubuntu):$ sudo apt-get install picocom使用:$ picocom -b 115200 /dev/ttyUSB

嵌入式Linux串列除錯

By Toradex秦海 1). 簡介 UART串列埠是嵌入式裝置最為常用的除錯和通訊介面之一,無論是RS232還是RS422/485都有著非常廣泛的應用,因此本文就基於嵌入式Linux演示在User Space進行串列埠除錯。 本文所演示的平臺來自於Toradex Co

linux串列非標準波特率的實現

最近要在linux下使用電腦的串列埠,而使用的波特率不是諸如9600,19200之類的標準波特率,從網上查詢非標準波特率的設定方法,都是說對termios結構體進行設定。按照網上的程式碼進行設定卻不成功。費了很大力氣終於找到了原因:原來我的linux版本支援一部分非標準的

Cutecom--Linux串列除錯工具

Cutecom是一款在Linux環境下,非常好用的串列埠除錯工具,使用方法幾乎跟Windows下的串列埠除錯工具一樣,非常方便。 Cutecom的安裝:直接在終端輸入:sudo apt-get install cutecom。 安裝完後,使用命令:sudo cutecom開

linux串列工具minicom使用

系統環境:ubuntu destop 11.10 我當時的需要主要是兩個,能夠看到正常串列埠輸出,並且把串列埠內容實時輸出到檔案中 那接下來工作主要是兩個:1、安裝 2、配置 相信各位也都是至少會操作一些全令行的,我們在這裡用apt-get安裝(不會的同學請google一