原创 linux下的串口通讯源程序--(测试版)

2006-10-19 13:08 8897 12 11 分类: MCU/ 嵌入式

根据前面文章讲到的内容,为了说明问题,下面给出测试程序来理解linux下的串口操作流程,例程receive.c用来接收从串口发来的数据,而例程send.c用来发送数据到串口。二者成功建立串口连接后,串口接收端会收到串口发送端发来的字符串数据“Hellothis is a Serial Port test!”。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


1.      receive.c程序清单:


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


*ilenamereceive.c


* DescriptionReceive data from Serial_Port


* Date


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


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


#include <stdio.h>


#include <string.h>


#include <malloc.h>


#include <sys/types.h>


#include <sys/stat.h>


#include <fcntl.h>


#include <unistd.h>


#include <termios.h>


#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<ncount;i++)


{


     printf("%c",hd);


}


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 <stdio.h>


#include <string.h>


#include <malloc.h>


#include <sys/types.h>


#include <sys/stat.h>


#include <fcntl.h>


#include <unistd.h>


#include <termios.h>


#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脚短路连接即可(自发自收),实际运行的步骤与上面相同。
PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户377235 2012-2-23 11:18

我也接收不到数据,请指教,yeahiv@126.com

用户377235 2012-2-23 11:16

运行不成功呀?什么原因呢?

标点符号改了,少头文件也加上了。运行成功,但是发数据,收不到。

用户13664 2007-12-6 19:43

我试了  接收不到数据

如何改进 谢谢!sxylzyn@126.com

相关推荐阅读
用户936143 2007-01-29 08:53
清理
很久没来,发现已经杂草丛生了,呵!...
用户936143 2006-12-14 09:06
Linux内核启动地址
最近在网上看到一位网友写得一篇文章,写得很好,加深了对Linux启动的认识,特意贴在这里: 内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/a...
用户936143 2006-11-26 16:14
一声感叹!Linuxreiserfs文件系统即将陨落?
 Linux著名的高性能文件系统reiserfs向来是Linux fans眼中的挚爱,但是reiserfs即将陨落。前段时间已经风传Linux Kernel拒绝将reiserfs4加入kernel s...
用户936143 2006-11-16 08:43
轻松一下
发信人: Kinglish (King of English), 信区: Joke标  题: 够淫荡吗?(x发信站: 水木社区 (Thu Nov 16 00:49:23 2006), 站内上午我到一家...
用户936143 2006-11-11 13:22
教你如何构建嵌入式linux系统
构建嵌入式linux系统非常好的一篇文章,非常详细的过程!...
用户936143 2006-11-11 13:04
IBM原版linux教材
IBM原版linux教材:1234...
EE直播间
更多
我要评论
3
12
关闭 站长推荐上一条 /3 下一条