您的位置:首页 > 运维架构 > Linux

linux下的串口通信程序详解

2010-04-06 15:47 585 查看
linux下的串口通信程序详解
2009-07-19 12:37
为了说明问题,下面给出测试程序来理解linux下的串口操作流程,例程receive.c用来接收从串口发来的数据,而例程send.c用来发送数据到串口。二者成功建立串口连接后,串口接收端会收到串口发送端发来的字符串数据“Hello,this is a Serial Port test!”。
1. receive.c程序清单:
/*******************************************************
*ilename:receive.c
* Description:Receive 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 fd,s;
int open_serial(int k)
{
if(k==0) /*串口选择*/
{
fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY); /*读写方式打开串口*/
perror("open /dev/ttyUSB0");
}
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 bad1"); /*读状态标志判断*/
}
/*************************开始接收数据******************************/
while(*rbuf!='/n') /*判断数据是否接收完毕*/
{
ncount+=1;
rbuf++;
retv=read(fd,rbuf,1);
if(retv==-1)
{
perror("read bad2");
}
}
/*******************************************************************/
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/ttyUSB0",O_RDWR|O_NOCTTY); /*读写方式打开串口*/
perror("open /dev/ttyUSB0");
}
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(&option,B9600); /*波特率设置为9600bps*/
cfsetospeed(&option,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;
}
/****************************结束***********************************/
分别将上面的俩个程序编译之后就可以运行了,如果是在两个不同的平台上运行,比如,在开发板上运行数据发送程序write(write.c编译后得到),在宿主机上运行结收数据程序read(read.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机上来运行这两个程序,这时需要将串口线的2、3脚短路连接即可(自发自收),实际运行的步骤与上面相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: