ubuntu-串口编程

前端之家收集整理的这篇文章主要介绍了ubuntu-串口编程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
  
#include <fcntl.h>  
#include <unistd.h>  
  
#include <termios.h> //set baud rate  
  
#include <sys/select.h>  
#include <sys/time.h>  
#include <sys/types.h>  
#include <errno.h>  
#include <sys/stat.h>  
  
//#define rec_buf_wait_2s 2  
#define buffLen 1024  
#define rcvTimeOut 2  
  
  
/*******************************************************/  
/**下面的函数暂时并没什么意思,完全可以忽略**/  
int read_data_tty(int fd,char *rec_buf,int rec_wait) {  
    int retval;  
    fd_set rfds;  
    struct timeval tv;  
  
    int ret,pos;  
    tv.tv_sec = rec_wait;  
    tv.tv_usec = 0;  
    pos = 0;  
  
    while (1) {  
        FD_ZERO(&rfds);  
        FD_SET(fd,&rfds);  
  
        retval = select(fd + 1,&rfds,NULL,&tv);  
  
        if (retval == -1) {  
            perror("select()");  
            break;  
        }  
        else if (retval) {  
            ret = read(fd,rec_buf + pos,2048);  
            pos += ret;  
            if (rec_buf[pos - 2] == '\r' && rec_buf[pos - 1] == '\n') {  
                FD_ZERO(&rfds);  
                FD_SET(fd,&rfds);  
                retval = select(fd + 1,&tv);  
  
                if (!retval) {  
                    break;  
                }  
            }  
        }  
        else {  
            break;  
        }  
    }  
  
    return 1;  
}  
  
int device_485_receive(int fd) {  
    int ret;  
    char rec_buf[1024];  
    int i;  
    char send_buf[] = { "02030202f925" };  
  
    for (i = 0; i<10; i++) {  
        /*ret = write(fd,send_buf,strlen(send_buf)); 
        if (ret == -1) { 
            printf("write device %s error\n",device); 
            return -1; 
        }*/  
  
        //if (read_data_tty(fd,rec_buf,rec_buf_wait_2s)) {  
        if (read_data_tty(fd,2)) {  
            printf("%s\n",rec_buf);  
        }  
        else {  
            printf("read_error\n");  
        }  
  
        //if ((read(fd,strlen(rec_buf))) == -1) {  
        //      printf("error reading string\n");  
        //      return -1;  
        //} else {  
        //      printf("%s\n",rec_buf);  
    }  
    return 0;  
}  
/*-----------------------------------------------------*/  
/*******************************************************/  
  
/*************Linux and Serial Port *********************/  
/*************Linux and Serial Port *********************/  
int openPort(int fd,int comport)  
{  
  
    if (comport == 1)  
    {  
        fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NDELAY);  
        if (-1 == fd)  
        {  
            perror("Can't Open Serial Port");  
            return(-1);  
        }  
        else  
        {  
            printf("open ttyS0 .....\n");  
        }  
    }  
    else if (comport == 2)  
    {  
        fd = open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY);  
        if (-1 == fd)  
        {  
            perror("Can't Open Serial Port");  
            return(-1);  
        }  
        else  
        {  
            printf("open ttyS1 .....\n");  
        }  
    }  
    else if (comport == 3)  
    {  
        fd = open("/dev/ttyS2",O_RDWR | O_NOCTTY | O_NDELAY);  
        if (-1 == fd)  
        {  
            perror("Can't Open Serial Port");  
            return(-1);  
        }  
        else  
        {  
            printf("open ttyS2 .....\n");  
        }  
    }  
    /*************************************************/  
    else if (comport == 4)  
    {  
        fd = open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NDELAY);  
        if (-1 == fd)  
        {  
            perror("Can't Open Serial Port");  
            return(-1);  
        }  
        else  
        {  
            printf("open ttyUSB0 .....\n");  
        }  
    }  
  
    if (fcntl(fd,F_SETFL,0)<0)  
    {  
        printf("fcntl Failed!\n");  
    }  
    else  
    {  
        printf("fcntl=%d\n",fcntl(fd,0));  
    }  
    if (isatty(STDIN_FILENO) == 0)  
    {  
        printf("standard input is not a terminal device\n");  
    }  
    else  
    {  
        printf("is a tty success!\n");  
    }  
    printf("fd-open=%d\n",fd);  
    return fd;  
}  
  
int setOpt(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;  
    default:  
        cfsetispeed(&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");  
    return 0;  
}  
  
int readDataTty(int fd,char *rcv_buf,int TimeOut,int Len)  
{  
    int retval;  
    fd_set rfds;  
    struct timeval tv;  
    int ret,pos;  
    tv.tv_sec = TimeOut / 1000;  //set the rcv wait time    
    tv.tv_usec = TimeOut % 1000 * 1000;  //100000us = 0.1s    
  
    pos = 0;  
    while (1)  
    {  
        FD_ZERO(&rfds);  
        FD_SET(fd,&rfds);  
        retval = select(fd + 1,&tv);  
        if (retval == -1)  
        {  
            perror("select()");  
            break;  
        }  
        else if (retval)  
        {  
            ret = read(fd,rcv_buf + pos,1);  
            if (-1 == ret)  
            {  
                break;  
            }  
  
            pos++;  
            if (Len <= pos)  
            {  
                break;  
            }  
        }  
        else  
        {  
            break;  
        }  
    }  
  
    return pos;  
}  
  
int sendDataTty(int fd,char *send_buf,int Len)  
{  
    ssize_t ret;  
  
    ret = write(fd,Len);  
    if (ret == -1)  
    {  
        printf("write device error\n");  
        return -1;  
    }  
  
    return 1;  
}  
  

  
int main(int argc,char** argv)  
{  
    int iSetOpt = 0;//SetOpt 的增量i  
  
  
    int fdSerial = 0;  
  
    //openPort  
    if ((fdSerial = openPort(fdSerial,4))<0)//1--"/dev/ttyS0",2--"/dev/ttyS1",3--"/dev/ttyS2",4--"/dev/ttyUSB0" 小电脑上是2--"/dev/ttyS1"  
    {  
        perror("open_port error");  
        return -1;  
    }  

    if ((iSetOpt = setOpt(fdSerial,115200,8,'N',1))<0)  
    {  
        perror("set_opt error");  
        return -1;  
    }  
    printf("Serial fdSerial=%d\n",fdSerial);  
  
    tcflush(fdSerial,TCIOFLUSH);//清掉串口缓存  
    fcntl(fdSerial,0);  
  
  
    char buffRcvData[buffLen] = { 0 };  
    unsigned int readDatanum = 0;  
  
/*
    buffRcvData[0] = 's';  
    buffRcvData[1] = 't';  
    buffRcvData[2] = 'a';  
    buffRcvData[3] = 'r';  
    buffRcvData[4] = 't';  
      
    sendDataTty(fdSerial,buffRcvData,5);  
    */
    while (1){  
        readDatanum = readDataTty(fdSerial,rcvTimeOut,buffLen); 
        sendDataTty(fdSerial,readDatanum);  
    }  
      
      
    return 1;  
}
原文链接:https://www.f2er.com/ubuntu/349526.html

猜你在找的Ubuntu相关文章