串口操作代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
#define BUFFER_SIZE 1024
#define HOST_PORT 1
int set_port(int fd, int baud_rate, int data_bits, char parity, int stop_bits)
{
    struct termios newtio,oldtio;
    if( tcgetattr(fd,&oldtio) != 0)
    {
        perror("Setup Serial 1");
        return -1;
    }
    bzero(&newtio,sizeof(newtio));
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_cflag &= ~CSIZE;
    /* set baud_speed*/
    switch(baud_rate)
    {
        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 19200:
            cfsetispeed(&newtio,B19200);
            cfsetospeed(&newtio,B19200);
            break;
        case 38400:
            cfsetispeed(&newtio,B38400);
            cfsetospeed(&newtio,B38400);
            break;
        default:
        case 115200:
            cfsetispeed(&newtio,B115200);
            cfsetospeed(&newtio,B115200);
            break;
    }
    /* set data_bits upon 7 or 8*/
    switch(data_bits)
    {
        case 7:
            newtio.c_cflag |= CS7;
            break;
        default :
        case 8:
            newtio.c_cflag |= CS8;
            break;
    }
    /**/
    switch(parity)
    {
        default:
        case 'N':
        case 'n':
        {
            newtio.c_cflag &= ~PARENB;
            newtio.c_iflag &= ~INPCK;
        }
        break;
        case 'o':
        case 'O':
        {
            newtio.c_cflag |= (PARODD | PARENB);
            newtio.c_iflag |= INPCK;
        }
        break;
        case 'e':
        case 'E':
truncated c语言
        {
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;
            newtio.c_iflag |= INPCK;
        }
        break;
        case 's':
        case 'S':
        {
            newtio.c_cflag &= ~PARENB;
            newtio.c_cflag &= ~CSTOPB;
        }
        break;
    }
    /*set stop_bits 1 or 2 */
    switch(stop_bits)
    {
        default:
        case 1:
        {
            newtio.c_cflag &= ~CSTOPB;
        }
        break;
        case 2:
        {
            newtio.c_cflag |= CSTOPB;
        }
        break;
    }
    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN] = 1;
    tcflush(fd,TCIFLUSH);
    if((tcsetattr(fd,TCSANOW,&newtio)) != 0)
    {
        perror("com set error");
        return -1;
    }
    printf("set UART done!\n");
    return 0;
}
int open_port(int com_port)
{
    int fd = 0;
    char *dev[] = {"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2","/dev/ttyS3",
                    "/dev/ttyS4", "/dev/ttyS5", "/dev/ttyS6"};
    if((com_port < 0) || (com_port > 6) )
    {
        printf("the port is out range");
        return -1;
    }
    fd = open(dev[com_port], O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd < 0)
    {
        perror("open serial port");
        return -1;
    }
    if(fcntl(fd, F_SETFL,0) < 0)
    {
        perror("fcntl F_SETFL");
        return -1;
    }
    if(isatty(fd) == 0)
    {
        perror("isatty is not a terminal device");
        return -1;
    }
    return fd;
}
int main(void)
{
    int fd = 0;
    char BUFFER[BUFFER_SIZE] = {0};
    if((fd = open_port(HOST_PORT)) == -1)
    {
        perror("open port");
        return -1;
    }
    if(set_port(fd,115200,8,'N',1)== -1)
    {
        perror("set port");
        return -1;
    }
    do
    {
        printf("Input some words:\n");
        memset(buffer,0,BUFFER_SIZE);
        if(fgets(buffer,BUFFER_SIZE,stdin) == NULL)
        {
            perror("fgets");
            break;
        }
        write(fd,buffer,strlen(buffer));
    }while(strncmp(buffer,"quit",4));
    close(fd);
    return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。