Linux串口编程

来源:互联网 发布:各国语言在线翻译软件 编辑:程序博客网 时间:2024/06/08 13:24

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <termios.h>

#include <errno.h>

 

int set_opt(int,int,int,char,int);

 

void main()

{

    int fd,nByte;

    char *uart3 = "/dev/ttySAC3";

    char *send_buffer = "hello word";

    char read_buffer[512];

    int i;

    //清空

    //memset(send_buffer, 0, sizeof(send_buffer));

    memset(read_buffer, 0, sizeof(read_buffer));

    

    if((fd = open(uart3, O_RDWR|O_NOCTTY))<0)

        printf("open %s is failed\n",uart3);

    else

    {

        printf("open %s is success\n",uart3);

        set_opt(fd, 9600, 8, 'N', 1);

        printf("set opt is success\n");

        write(fd,send_buffer, strlen(send_buffer));

        printf("write\n");

        //nByte = read(fd, read_buffer, 512);

        //printf("read %d\n",nByte);

        

    }

    close(fd);

    printf("close\n");

}

 

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)

{

    struct termios newtio,oldtio;

    if ( tcgetattr( fd,&oldtio) != 0) {

        perror("SetupSerial 1");

        return -1;

    }

    bzero( &newtio, sizeof( newtio ) );

    newtio.c_cflag |= CLOCAL | CREAD;

    newtio.c_cflag &= ~CSIZE;

 

    switch( nBits )

    {

        case 7:

            newtio.c_cflag |= CS7;

            break;

        case 8:

            newtio.c_cflag |= CS8;

            break;

    }

 

    switch( nEvent )

    {

    case 'O':

        newtio.c_cflag |= PARENB;

        newtio.c_cflag |= PARODD;

        newtio.c_iflag |= (INPCK | ISTRIP);

        break;

    case 'E':

        newtio.c_iflag |= (INPCK | ISTRIP);

        newtio.c_cflag |= PARENB;

        newtio.c_cflag &= ~PARODD;

        break;

    case 'N':

        newtio.c_cflag &= ~PARENB;

        break;

    }

 

    switch( nSpeed )

    {

        case 2400:

            cfsetispeed(&newtio, B2400);

            cfsetospeed(&newtio, B2400);

            break;

        case 4800:

            cfsetispeed(&newtio, B4800);

            cfsetospeed(&newtio, B4800);

            break;

        case 9600:

            cfsetispeed(&newtio, B9600);

            cfsetospeed(&newtio, B9600);

            break;

        case 115200:

            cfsetispeed(&newtio, B115200);

            cfsetospeed(&newtio, B115200);

            break;

        case 460800:

            cfsetispeed(&newtio, B460800);

            cfsetospeed(&newtio, B460800);

            break;

        case 1000000:

            cfsetispeed(&newtio, B1000000);

            cfsetospeed(&newtio, B1000000);

            break;

        default:

            cfsetispeed(&newtio, B9600);

            cfsetospeed(&newtio, B9600);

            break;

    }

    if( nStop == 1 )

        newtio.c_cflag &= ~CSTOPB;

    else if ( nStop == 2 )

        newtio.c_cflag |= CSTOPB;

        newtio.c_cc[VTIME] = 0;

        newtio.c_cc[VMIN] = 0;

        tcflush(fd,TCIFLUSH);

    if((tcsetattr(fd,TCSANOW,&newtio))!=0)

    {

        perror("com set error");

        return -1;

    }

    

    //    printf("set done!\n\r");

    return 0;

}