嵌入式課程設計實踐(二)——串口

嵌入式課程設計實踐(二)——串口


    這章比較水,就是根據S3C6410實驗箱的指導書對串口代碼的展示。


    我所做的課程設計是要求從串口讀取數據,然後再進行處理,所以對串口有所瞭解就是開展課設前必要的工作了。


    定義我無恥的借用了百度百科裏的說法了

    UART是一種通用串行數據總線,用於異步通信。該總線雙向通信,可以實現全雙工傳輸和接收。在嵌入式設計中,UART用來主機與輔助設備通信,如汽車音響與外接AP之間的通信,與PC機通信包括與監控調試器和其它器件,如EEPROM通信。

    它是用於控制計算機與串行設備的芯片。作爲接口的一部分,UART還提供以下功能:將由計算機內部傳送過來的並行數據轉換爲輸出的串行數據流。將計算機外部來的串行數據轉換爲字節,供計算機內部並行數據的器件使用。在輸出的串行數據流中加入奇偶校驗位,並對從外部接收的數據流進行奇偶校驗。


    以我的理解能力,我只能理解這麼多,所以就貼了這一點,還覺得不夠的自行前往百度百科瞭解(http://baike.baidu.com/view/245027.htm?fr=aladdin)。


    在本實驗中,我們就是借用串口進行PCS3C6410實驗箱進行連接控制,同時使用串口接收傳感器通過zigbee傳輸到本機中zigbee模塊中的數據。


下面就將貼出相關代碼。


1.頭文件

#include<stdio.h> /*標準輸入輸出定義*/

#include<stdlib.h> /*標準函數庫定義*/

#include<unistd.h> /*linux 標準函數定義*/

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h> /*文件控制定義*/

#include<termios.h> /*PPSIX 終端控制定義*/

#include<errno.h> /*錯誤號定義*/


2.打開串口

直接貼函數:

int OpenDev(char *Dev)

{

   int fd= open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY

   if(-1 == fd)

   {

     perror("Can'tOpen Serial Port");

     return-1;

   }

   else

   return fd;

}


3.設置波特率

這個函數也是直接貼出來,因爲我不需要對串口做什麼特殊的設置,所以也沒有深究,短期內只要複製粘貼即可==

void set_speed(int fd, int speed)

{

   int i;

   int status;

   struct termios Opt;

   tcgetattr(fd,&Opt);

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

   {

     if (speed == name_arr[i])

     {

       tcflush(fd, TCIOFLUSH);

       cfsetispeed(&Opt,speed_arr[i]);

       cfsetospeed(&Opt,speed_arr[i]);

       status= tcsetattr(fd, TCSANOW, &Opt);

       if (status != 0)

       perror("tcsetattrfd1");

       return;

     }

     tcflush(fd,TCIOFLUSH);

     }

}


4.設置校驗位/停止位等

說明同上:

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

{

  structtermios options;

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

  {

    perror("SetupSerial1");

    return(FALSE);

  }

  options.c_cflag&= ~CSIZE;

  switch(databits)

  {

    case7:

      options.c_cflag|= CS7;

    break;

      case8:

    options.c_cflag|= CS8;

      break;

    default:

      fprintf(stderr,"Unsupporteddata size\n");

    return(FALSE);

  }

  switch(parity)

  {

    case'n':

    case'N':

      options.c_cflag&= ~PARENB; /* Clear parity enable */

      options.c_iflag&= ~INPCK; /* Enable parity checking */

      break;

    case'o':

    case'O':

      options.c_cflag|= (PARODD | PARENB);

      options.c_iflag|= INPCK; /* Disnable parity checking */

      break;

    case'e':

    case'E':

      options.c_cflag|= PARENB; /* Enable parity */

      options.c_cflag&= ~PARODD;

      options.c_iflag|= INPCK; /* Disnable parity checking */

      break;

    case'S':

    case's': /*as no parity*/

      options.c_cflag&= ~PARENB;

      options.c_cflag&= ~CSTOPB;

      break;

    default:

      fprintf(stderr,"Unsupportedparity\n");

      return(FALSE);

  }

/*設置停止位*/

   switch(stopbits)

   {

     case1:

       options.c_cflag&= ~CSTOPB;

   break;

  case2:

   options.c_cflag|= CSTOPB;

   break;

  default:

   fprintf(stderr,"Unsupportedstop bits\n");

   return(FALSE);

  }

/*Set input parity option */

   if(parity != 'n')

   options.c_iflag|= INPCK;

   options.c_cc[VTIME]= 150; // 15 seconds

   options.c_cc[VMIN]= 0;

   tcflush(fd,TCIFLUSH);/* Update the options and do it NOW */

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

   {

     perror("SetupSerial3");

  return(FALSE);

  }

   return(TRUE);

}


5.正式啓用串口並執行操作

intmain(int argc, char **argv)

{

//預定義變量

  intnwrite;

  intlen;

  charbuff[512];

//串口的定義與初始化

  intfd;

  char*dev ="/dev/s3c2410_serial0";

/*串口的名稱不同的機器匯有所不同,本機就是s3c2410_serial0,我第一次弄的時候就遇到了一個串口名爲ttySAC0的,幸好對linux有所瞭解才很快解決了,所以請自己注意查看設備下的名稱(ls/dev/)。*/

  fd= OpenDev(dev);

/*linux下一切設備都是以文件形式進行操作的,故該函數也是打開文件然後操作*/

  set_speed(fd,115200);

   if(set_Parity(fd,8,1,'N')== FALSE)

   {

     printf("SetParity Error\n");

     exit(1);

   }


/**************華麗麗的分割線,下面是對於串口簡單的使用*************/

   while(1)//超級終端輸入字符串,處理並通過串口輸出。

   {

      printf("Pleaseinput your string :");

      scanf("%s",&buff); 

      len=strlen(buff);

      printf("\nlen=%d\n",len);

   nwrite=write(fd,buff,len);

   printf("\nnwrite=%d\n",nwrite);

   }

 return 0;

}


    吶,這個比較簡單啦,如果只是需要對串口進行基本初始化並使用,直接拷貝14的代碼,在5中直接調用相關函數初始化即可。如果嫌太多了,可以直接把相關設置直接寫進main函數中。(==



    本文大家看看即可,若是能有什麼幫助最好不過了,有什麼問題請直接批評,我咬不了大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章