您的位置:首页 > 其它

【转】GPS串口调试程序

2011-05-09 14:46 253 查看
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>

#define COM_OPEN "/dev/ttyS0"
#define BUFFER_SIZE 100

int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)
{
struct termios new_cfg,old_cfg;
int speed;
if(tcgetattr(fd,&old_cfg))
{
perror("tcgetattr err!/n");
return -1;
}

new_cfg = old_cfg;
cfmakeraw(&new_cfg);//set to raw 方式

new_cfg.c_cflag &= ~CSIZE;

switch (baud_rate)
{
case 2400:
speed = B2400;
break;
case 4800:
speed = B4800;
break;
case 9600:
speed = B9600;
break;
case 19200:
speed = B19200;
break;
case 38400:
speed = B38400;
break;
default:
case 115200:
{
speed = B115200;
}
break;

}

cfsetispeed(&new_cfg,speed);
cfsetospeed(&new_cfg,speed);

switch (data_bits)
{
default:
case 8:
{
new_cfg.c_cflag |= CS8;
}
break;

case 7:
{
new_cfg.c_cflag |= CS7;
}
break;
}

switch (parity)
{
default:
case 'n':
case 'N':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_iflag &= ~INPCK;
}
break;

case 'o':
case 'O':
{
new_cfg.c_cflag |=(PARODD |PARENB);
new_cfg.c_iflag |=INPCK;
}
break;

case 'e':
case 'E':
{
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;
new_cfg.c_iflag |= INPCK;
}
break;

case 's':
case 'S':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_cflag &= ~CSTOPB;
}
break;
}

switch (stop_bits)
{
default:
case 1:
new_cfg.c_cflag &= ~CSTOPB;
break;
case 2:
new_cfg.c_cflag |=CSTOPB;
break;
}

new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 1;

tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&new_cfg)) != 0)
{
perror("tcsetattr err!/n");
return -1;
}

return 0;
}

int open_port(int com_port)
{
int fd;
fd = open (COM_OPEN,O_RDWR|O_NOCTTY|O_NDELAY);
if(fd<0)
{
perror("open serial port err!/n");
return -1;
}

if(fcntl(fd, F_SETFL, 0)<0)
{
perror("fcntl err!/n");
return -1;
}

if(isatty(fd) ==0)
{
perror("this is not a terminal device!/n");
return -1;
}

return fd;

}

int main()
{

int fd;
int speed;
char buff[BUFFER_SIZE];

struct termios new_cfg,old_cfg;

fd = open (COM_OPEN,O_RDWR|O_NOCTTY|O_NDELAY);//|O_NOCTTY|O_NDELAY
if(fd<0)
{
perror("open serial port err!/n");
return -1;
}else
{
printf("open serial port !/n");
}

if (set_com_config(fd, 4800, 8, 'N', 1)<0)
{
perror("set_com_config/n");
return -1;
}
while(1)
{
memset(buff,0, BUFFER_SIZE*sizeof(char));
if(read(fd,buff,BUFFER_SIZE)>0)
{
printf("the received words are :%s/n",buff);
}
sleep(1);
}
return 0;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yiyaaixuexi/archive/2011/05/08/6403979.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: