繁体中文
高级搜索
 
首页 | 电子技术应用 | 行业最新动态 | 行业最新产品 | 软件资料下载 | 电路图纸欣赏 | 博客文章精选 | 电子精品论坛 | 电子技术贴吧

当前位置:首页 >> 博客文章精选 >> 嵌入式系统-博客 >> linux下的串口通讯源程序--(测试版)
linux下的串口通讯源程序--(测试版)
作者:   来源: 发表时间:2007-02-07  字号:  

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

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

!注意:如果您发现此文章出现影响您的阅读的状况,请从浏览器地址栏里复制本文的链接到留言本报告给站长解决!
  • 上一篇: 详解linux下的串口通讯开发
  • 下一篇: IBM采用自成形材料绝缘 芯片提速三分之一

  • >> 联系我们请给我们留言·留言本
    本站所有提供的信息软件资料均来自网络,版权及著作权归原作者所有,如果无意中侵犯了您的相关权利或触及法律法规,请给我们留言, 我们将在24小时内删除。
      浙ICP备05071687号  电子技术精品网