红联Linux门户
Linux帮助

Linux下UART串口的测试小程序

发布时间:2017-03-08 09:20:37来源:linux网站作者:faihung
Linux下关于关于UART方面的东西,其实很多芯片厂家已经帮我们把内核驱动模块给做好并加载进去了,这个代码是我参考IBM上的应用测试代码:
 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE        B115200
#define UART_DEVICE     "/dev/ttyS3"
#define FALSE  -1
#define TRUE   0
///////////////////////////////////////////////////////////////////
/**
*@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void
*/
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200,  300, 115200, 38400, 19200, 9600, 4800, 2400, 1200,  300, };
void set_speed(int fd, int speed){
int   i; 
int   status; 
struct termios   Opt;
tcgetattr(fd, &Opt); 
for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) { 
if  (speed == name_arr[i]) {     
tcflush(fd, TCIOFLUSH);     
cfsetispeed(&Opt, speed_arr[i]);  
cfsetospeed(&Opt, speed_arr[i]);   
status = tcsetattr(fd, TCSANOW, &Opt);  
if  (status != 0) {        
perror("tcsetattr fd1");  
return;     
}    
tcflush(fd,TCIOFLUSH);   
}  
}
}
///////////////////////////////////////////////////////////////////
/**
*@brief   设置串口数据位,停止位和效验位
*@param  fd     类型  int  打开的串口文件句柄
*@param  databits 类型  int 数据位   取值 为 7 或者8
*@param  stopbits 类型  int 停止位   取值为 1 或者2
*@param  parity  类型  int  效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
struct termios options; 
if  ( tcgetattr( fd,&options)  !=  0) { 
perror("SetupSerial 1");     
return(FALSE);  
}
options.c_cflag &= ~CSIZE; 
switch (databits) /*设置数据位数*/
{   
case 7:     
options.c_cflag |= CS7; 
break;
case 8:     
options.c_cflag |= CS8;
break;   
default:    
fprintf(stderr,"Unsupported data size\n"); return (FALSE);  
}
switch (parity) 
{   
case 'n':
case 'N':    
options.c_cflag &= ~PARENB;   /* Clear parity enable */
options.c_iflag &= ~INPCK;     /* Enable parity checking */ 
break;  
case 'o':   
case 'O':     
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/  
options.c_iflag |= INPCK;             /* Disnable parity checking */ 
break;  
case 'e':  
case 'E':   
options.c_cflag |= PARENB;     /* Enable parity */    
options.c_cflag &= ~PARODD;   /* 转换为偶效验*/     
options.c_iflag |= INPCK;       /* Disnable parity checking */
break;
case 'S': 
case 's':  /*as no parity*/   
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;  
default:   
fprintf(stderr,"Unsupported parity\n");    
return (FALSE);  
}  
/* 设置停止位*/  
switch (stopbits)
{   
case 1:    
options.c_cflag &= ~CSTOPB;  
break;  
case 2:    
options.c_cflag |= CSTOPB;  
break;
default:    
fprintf(stderr,"Unsupported stop bits\n");  
return (FALSE); 
/* Set input parity option */ 
if (parity != 'n')   
options.c_iflag |= INPCK; 
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/   
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)   
perror("SetupSerial 3");   
return (FALSE);  
options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
options.c_oflag  &= ~OPOST;   /*Output*/
return (TRUE);  
}
///////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
int    fd, c=0, res;
char  buf[256];
printf("Start...\n");
fd = open(UART_DEVICE, O_RDWR);
if (fd < 0) 
{
perror(UART_DEVICE);
exit(1);
}
printf("Open...\n");
set_speed(fd,115200);
if (set_Parity(fd,8,1,'N') == FALSE)  
{
printf("Set Parity Error\n");
exit (0);
}
printf("Reading...\n");
while(1)
{
res = read(fd, buf, 255);
if(res==0)
continue;
buf[res]=0;
printf("%s", buf);
if (buf[0] == 0x0d)
printf("\n");
if (buf[0] == '@') break;
}
printf("Close...\n");
close(fd);
return 0;
}
 
调用的方法比较的简单,如下,fd是打开的tty设备的文件句柄:
 
set_speed(fd,115200);
if (set_Parity(fd,8,1,'N') == FALSE)  
{
printf("Set Parity Error\n");
}
 
本文永久更新地址:http://www.linuxdiyf.com/linux/28992.html