嵌入式课程设计实践(二)——串口

嵌入式课程设计实践(二)——串口


    这章比较水,就是根据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函数中。(==



    本文大家看看即可,若是能有什么帮助最好不过了,有什么问题请直接批评,我咬不了大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值