Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3432773
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类: LINUX

2009-08-13 18:55:06

根据前面文章讲到的内容,为了说明问题,下面给出测试程序来理解linux下的串口操作流程,例程receive.c用来接收从串口发来的数据,而例程send.c用来发送数据到串口。二者成功建立串口连接后,串口接收端会收到串口发送端发来的字符串数据“Hellothis is a Serial Port test!”。

1.      receive.c程序清单:

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

*ilenamereceive.c

* DescriptionReceive data from Serial_Port

* Date

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

/*********************头文件定义***********************/

#include

#include

#include

#include

#include

#include

#include

#include

#include "math.h"

#define max_buffer_size   100   /*定义缓冲区最大宽度*/

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

int fds;

int open_serial(int k)

{

  if(k==0)       /*串口选择*/

   {

     fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY);  /*读写方式打开串口*/

     perror("open /dev/ttyS0");

   }

  else

   {

     fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);

     perror("open /dev/ttyS1");

   }

  if(fd == -1)  /*打开失败*/

   return -1;

  else

   return 0;

}

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

int main()

{

char  hd[max_buffer_size],*rbuf; /*定义接收缓冲区*/

int flag_close, retv,i,ncount="0";

struct termios opt;

int realdata="0";

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

open_serial(0);    /*打开串口1*/

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

tcgetattr(fd,&opt);

cfmakeraw(&opt);

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

cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/

cfsetospeed(&opt,B9600);

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

tcsetattr(fd,TCSANOW,&opt);

rbuf="hd"; /*数据保存*/

printf("ready for receiving data...\n");

retv="read"(fd,rbuf,1);   /*接收数据*/

if(retv==-1)

{

 perror("read"); /*读状态标志判断*/

}

/*************************开始接收数据******************************/

while(*rbuf!='\n')       /*判断数据是否接收完毕*/

 {

      ncount+=1;

      rbuf++;

      retv="read"(fd,rbuf,1);

      if(retv==-1)

      {

perror("read");

    }

 }

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

printf("The data received is:\n");  /*输出接收到的数据*/

for(i="0";i

{

     printf("%c",hd[i]);

}

printf("\n");

flag_close =close(fd);

if(flag_close ==-1)   /*判断是否成功关闭文件*/

printf(“Close the Device failur\n”);

return 0;

}

/****************************结束***********************************/

2.send.c程序清单

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

* File Name     send.c

* Description  send data to serial_Port

* Date         

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

/******************头文件定义******************/

#include

#include

#include

#include

#include

#include

#include

#include

#define max_buffer_size   100   /*定义缓冲区最大宽度*/

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

int fd;  /*定义设备文件描述符*/

int flag_close

int open_serial(int k)

{

  if(k==0)       /*串口选择*/

   {

     fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY);  /*读写方式打开串口*/

     perror("open /dev/ttyS0");

   }

  else

   {

     fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);

     perror("open /dev/ttyS1");

   }

  if(fd == -1)  /*打开失败*/

   return -1;

  else

   return 0;

}

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

 

int main(int argc, char *argv[ ] )

{

 char sbuf[]={"Hello,this is a Serial_Port test!\n"};/*待发送的内容,以\n为结束标志*/

 int sfd,retv,i;

 struct termios option;

 int length="sizeof"(sbuf);/*发送缓冲区数据宽度*/

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

open_serial(0);    /*打开串口1*/

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

printf("ready for sending data...\n"); /*准备开始发送数据*/

tcgetattr(fd,&option);

cfmakeraw(&option);

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

cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/

cfsetospeed(&opt,B9600);

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

tcsetattr(fd,TCSANOW,&option);

retv="write"(fd,sbuf,length);  /*接收数据*/

if(retv==-1)

{

 perror("write");

}

printf("the number of char sent is %d\n",retv);

 

flag_close =close(fd);

if(flag_close ==-1)   /*判断是否成功关闭文件*/

printf(“Close the Device failur\n”);

 

return 0;

}

/****************************结束***********************************/

分别将上面的俩个程序编译之后就可以运行了,如果是在两个不同的平台上运行,比如,在开发板上运行数据发送程序writewrite.c编译后得到),在宿主机上运行结收数据程序readread.c编译得到),采用串口线将二者正确连接之后,就可以运行来看实际的效果了:

首先在宿主机端运行数据接收程序receive

[zhang@localhost]# ./receive

[zhang@localhost]#open /dev/ttyS0 Success

ready for receiving data...

The data received is

   Hello,this is a Serial_Port test!

[zhang@localhost]#

在接收端运行完程序之后再到发送端运行数据发送程序send

#./send

ready for sending data...

the number of char sent is 35

#

运行完发送程序之后就可以在接收端看到接收的数据了。

也可以在一台PC机上来运行这两个程序,这时需要将串口线的23脚短路连接即可(自发自收),实际运行的步骤与上面相同。
阅读(3944) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~