【转】GPS串口调试程序

#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;  


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yiyaaixuexi/archive/2011/05/08/6403979.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值