在嵌入式linux系统中,串口通信具有很大的作用,可以将一些调试信息发往PC的串口等等。下面我们来做一个简单点的串口通信。
在linux系统中“一切皆文件“,串口也不例外,用来描述串口的文件在/dev目录下的ttyS0,ttyS1,ttyS2…等等。所以我们只需要使用标准的文件读写即可完成对串口的发送与接收数据。
在串口通信这里,我们主要介绍termios,在man手册中termios这样描述:
Many of the functions described here have a termios_p argument
that isa pointer to a termios structure. This structure contains
at least thefollowing members:
tcflag_t c_iflag; /* input modes */
tcflag_t c_oflag; /* output modes */
tcflag_t c_cflag; /* control modes */
tcflag_t c_lflag; /* local modes */
cc_t c_cc[NCCS]; /* special characters */
我们可以采用tcgetattr与tcsetattr函数完成对termios的修改,这里termios的设置项较多,我们将在下面的代码示例中进行说明。另外波特率的指定需要采用单独的函数
/*其中参数为termios结构体指针与所需设置速率的宏*/
//获取输入速率
speed_t cfgetispeed(const struct termios *termios_p);
//获取输出速率
speed_t cfgetospeed(const struct termios *termios_p);
//设置输入速率
int cfsetispeed(struct termios *termios_p, speed_t speed);
//设置输出速率
int cfsetospeed(struct termios *termios_p, speed_t speed);
其中系统中关于波特率的宏如下,B后面的数字表示对应的波特率的大小。
B0
B50
B75
B110
B134
B150
B200
B300
B600
B1200
B1800
B2400
B4800
B9600
B19200
B38400
B57600
B115200
B230400
下面我们以一个最简单的串口通信来具体说明。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <termios.h>
#define MAX_SIZE 256
void init_series(int fd)
{
//声明结构体
struct termios t ;
//取出默认参数
tcgetattr( fd , &t) ;
//CSIZE默认位8位,这里先清除该位
t.c_cflag &=~CSIZE ;
//1位停止位,默认2位停止位
t.c_cflag &=~CSTOPB;
//使能接收
t.c_cflag |= CREAD ;
//忽略调制解调器线路状态
t.c_cflag |= CLOCAL ;
//关闭RTS(Request To Send 请求发送)/CTS(clear to send 允许发送)流控制
t.c_cflag &= ~CRTSCTS;
//8位数据位
t.c_cflag |= CS8;
/*
另外还有
PARENB 使用奇偶校验
PARODD 对输入使用奇偶校验,对输出使用偶校验
*/
//设置输入输出波特率
cfsetispeed( &t , B9600);
cfsetospeed( &t , B9600);
//刷新缓存
tcflush( fd , TCIOFLUSH);
//设置的值立即生效
//TCSANOW: 不等数据传输完毕就立即改变属性。
//TCSADRAIN:等待所有数据传输结束才改变属性。
//TCSAFLUSH:清空输入输出缓冲区才改变属性。
tcsetattr( fd , TCSANOW ,&t);
}
int main(void)
{
int fd ;
int count ;
//发送缓存
char buff_send[] = "this is a test\n";
//接收缓存
char buff_recv[MAX_SIZE];
//打开串口,这里要注意 权限
fd = open("/dev/ttyS1" , O_RDWR | O_NOCTTY );
if( fd<0)
{
printf("open series error\n");
return 0 ;
}
//初始化串口
init_series(fd);
//发送数据
/* fd:串口文件描述符
* buff_send:发送数据缓存
* 发送数据大小
*/
write( fd , buff_send , sizeof(buff_send));
printf("recv:\n");
do
{
//接收数据
/*
*fd:串口文件描述符
*buff_recv:接收缓存
*最大接收数据大小
*/
count = read(fd , buff_recv , MAX_SIZE -1);
buff_recv[count] = '\0';
printf("%s" , buff_recv);
}while(count > 0);
//关闭文件描述符
close(fd);
return 0 ;
}
转载请注明出处:http://blog.csdn.net/u013780605/article/details/52937295