t2s串口操作

来源:互联网 发布:智慧足迹大数据 编辑:程序博客网 时间:2024/05/21 08:02

可以发送指定数据也可以循环发送特定0-9数据

/*uartcomm v0.1author: Mattdate: 2016/1/16purpose; comm between M2 and M1 both using ttyMT1all parameters can refer to http://www.cnblogs.com/chengmin/p/3818133.html*/#include <stdio.h>#include <fcntl.h>#include <termios.h>#include <pthread.h>#include <semaphore.h>#include <string.h>sem_t sem_read, sem_write;int setuart(int fd){struct termios TermiosTemp;if (tcgetattr(fd, &TermiosTemp) != 0){perror("tcgetattr fd");return -1;}tcflush(fd, TCIOFLUSH);//set default to 38400cfsetispeed(&TermiosTemp, B38400);cfsetospeed(&TermiosTemp, B38400);    TermiosTemp.c_cflag = 0;    TermiosTemp.c_iflag = 0;    TermiosTemp.c_oflag = 0;    TermiosTemp.c_lflag = 0;           TermiosTemp.c_cflag |= PARENB; // Enable parity generation.    //TermiosTemp.c_cflag &= ~PARENB; // Disable parity generation.    TermiosTemp.c_cflag &= ~PARODD; // Enable even parity type.       //normally we set CLOCAL and CREAD                  TermiosTemp.c_cflag |= CLOCAL;    TermiosTemp.c_cflag |= CREAD;    TermiosTemp.c_cflag &= ~HUPCL;     // disable canonical mode, read what you can                                  TermiosTemp.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //add ECHO/ECHOE/ISIG on VSP version    //VTIME定义要求等待的时间(百毫米,通常是unsigned char变量),    //而VMIN定义了要求等待的最小字节数(相比之下,read函数的第三个参数指定了要求读的最大字节数)。    TermiosTemp.c_cc[VMIN] = 1;     TermiosTemp.c_cc[VTIME] = 0; // non-canonical input settings: wait to receive at least 1 character and read it immediately                                               TermiosTemp.c_cflag &= ~CSIZE;    TermiosTemp.c_cflag |= CS8; // Use 8 bits per character.    TermiosTemp.c_cflag |= CSTOPB; // Use 2 stop bits.    TermiosTemp.c_cflag &= ~CRTSCTS; // Disable hardware flow control.                                                               TermiosTemp.c_iflag |= IGNBRK;    TermiosTemp.c_iflag &= ~BRKINT;    TermiosTemp.c_iflag |= IGNPAR;      TermiosTemp.c_iflag &= ~PARMRK;    TermiosTemp.c_iflag |= INPCK;    TermiosTemp.c_iflag &= ~IXON; // Disable software flow control.    TermiosTemp.c_iflag &= ~IXOFF;    TermiosTemp.c_iflag &= ~IXANY; // add this base on VSP version    TermiosTemp.c_iflag &= ~IGNCR; // don't ignore carriage return \r on input    TermiosTemp.c_iflag &= ~INLCR; // don't translate new line \n to carriage return \r on input    TermiosTemp.c_iflag &= ~ICRNL; // don't translate \r to \n on input                                                                                                       TermiosTemp.c_oflag &= ~OCRNL; // don't map \r to \n on output    TermiosTemp.c_oflag &= ~ONLCR; // don't map \n to \r\n character pair on outputm  if (tcsetattr (fd, TCSANOW, &TermiosTemp) != 0)    {                                                                                    perror("Can't set tty attr");                                                   close(fd);                                                                                            return -1;                                                                            }return 0;}void * writetx(void *arg){int uart_fd = (int)arg;//Note: if initialize the char array with string, there is a '/0' at the end char txbuf[10] = {'0','1','2','3','4','5','6','7','8','9'};int i, wr = 0;//for(i = 0; i < 256; i++)//txbuf[i] = '0';tcflush(uart_fd,TCIOFLUSH );sem_wait(&sem_write);while(1)//for( i = 0; i < 3; i++){wr = write(uart_fd, txbuf, sizeof(txbuf));//sem_post(&sem_sync);//usleep(10000);//sleep 1s//sleep(1);}    return (void *)0;}void * readtx(void *arg){int uart_fd = (int)arg;char rxbuf[12];int i, rd = 0;memset(rxbuf, 0, sizeof(rxbuf));tcflush(uart_fd,TCIFLUSH);sem_wait(&sem_read);while(1){rd = read(uart_fd, rxbuf, 20);if(rd > 0){//printf("%d\n", rd);puts(rxbuf);//printf("0x%02X", rxbuf[1]);//for(i = 0; i < rd; i++)//printf("0x%02X ", rxbuf[i]);//sem_post(&sem_sync);//sleep 10ms//usleep(10000);}}    return (void *)0;}int main(int argc, char** argv){unsigned char txbuf[] = {'0','1','2','3','4','5','6','7','8','9'};int num = -1;unsigned char data[50];memset(data, 0, sizeof(data));int length = 0;if (argc > 1){num = atol(argv[1]);//if(argc > 2)//{//length = strlen(argv[2]);//memmove(data, argv[2], length);//}}     else     {     printf("<usage> uartcomm num data: uartcomm 1\n");     return 1;     }int fd = -1;if(num == 1){fd = open("/dev/ttyMT1", O_RDWR | O_NOCTTY | O_NONBLOCK);}else if(num == 0){fd = open("/dev/ttyMT0", O_RDWR | O_NOCTTY | O_NONBLOCK);}if (fd == -1){printf("ttyMT%d", num);perror("open");return -1;}int ret = setuart(fd);if(ret != 0)goto Exit;pthread_t tid1, tid2;int err = -1;//err = pthread_create(&tid2, NULL, writetx, (void *)fd);    //if (err != 0)     //   perror( "create write thread");    err = pthread_create(&tid1, NULL, readtx, (void *)fd);    if (err != 0)        perror( "create read thread");    //sem_post(&sem_sync);    int i = 10, wr =0 ;input:    printf("please select:\n1. Read \n2. Write\n3. Read & Write\n0: Exit\n");    scanf("%d", &i);    //i = getchar();    switch(i)    {        case 1:            sem_post(&sem_read);            goto input;            break;        case 2:        //sem_post(&sem_write);        printf("please input data u want send:\n");        scanf("%s", data);        length = strlen(data);        tcflush(fd,TCOFLUSH );        if(length)        {        wr = write(fd, data, length);        printf("write %d data: %s\n", length, data);        }        else        {        wr = write(fd, txbuf, sizeof(txbuf));        printf("write 10 data: 0123456789\n");        }            goto input;            break;        case 3:        //sem_post(&sem_write);        sem_post(&sem_read);        tcflush(fd,TCOFLUSH );        wr = write(fd, txbuf, sizeof(txbuf));            goto input;            break;        case 0:            break;        default:            printf("error input\n");            goto input;    }    //char c = 0x1;    //until we get 'c' we will continue to read and write    //while (c != 'c')    //{    //scanf("%c", &c);    //}    Exit:pthread_cancel(tid1);//pthread_cancel(tid2);close(fd);return 0;}

第二版:可以指定端口以及速度

/*uartcomm v0.1author: Mattdate: 2016/1/16purpose; comm between M2 and M1 both using ttyMT1all parameters can refer to http://www.cnblogs.com/chengmin/p/3818133.htmlversion: v0.2<usage> ./uartcomm port speedcan choose port and speed freely*/#include <stdio.h>#include <fcntl.h>#include <termios.h>#include <pthread.h>#include <semaphore.h>#include <string.h>#include <stdlib.h> //malloc#include <poll.h>int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,B57600, B115200, B230400, B460800, B921600, B110, B110};int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 57600,115200, 230400, 460800, 921600, 110, 110};sem_t sem_read, sem_write;int speed = 38400;int setuart(int fd){        /*struct termios TermiosTemp;        //if (tcgetattr(fd, &TermiosTemp) != 0)        //{        //      perror("tcgetattr fd");        //      return -1;        //}        memset (&TermiosTemp, 0, sizeof (TermiosTemp)); //clear newtio struct        tcflush(fd, TCIOFLUSH);        int i;        //set default to 38400        for ( i= 0; i < sizeof(name_arr) / sizeof(int); i++)     {                if (speed == name_arr[i])                 {                        cfsetispeed(&TermiosTemp, speed_arr[i]);                        cfsetospeed(&TermiosTemp, speed_arr[i]);                        printf("i %d speed is %d %d\n", i, name_arr[i], speed_arr[i]);                        //tcsetattr(fd, TCSANOW, &TermiosTemp);                        break;                }        }    TermiosTemp.c_cflag = 0;    TermiosTemp.c_iflag = 0;    TermiosTemp.c_oflag = 0;    TermiosTemp.c_lflag = 0;           TermiosTemp.c_cflag |= PARENB; // Enable parity generation.    //TermiosTemp.c_cflag &= ~PARENB; // Disable parity generation.    TermiosTemp.c_cflag &= ~PARODD; // Enable even parity type.       //normally we set CLOCAL and CREAD                  TermiosTemp.c_cflag |= CLOCAL;    TermiosTemp.c_cflag |= CREAD;    TermiosTemp.c_cflag &= ~HUPCL;     // disable canonical mode, read what you can                                  TermiosTemp.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //add ECHO/ECHOE/ISIG on VSP version    //VTIME定义要求等待的时间(百毫米,通常是unsigned char变量),    //而VMIN定义了要求等待的最小字节数(相比之下,read函数的第三个参数指定了要求读的最大字节数)。    TermiosTemp.c_cc[VMIN] = 1;     TermiosTemp.c_cc[VTIME] = 0; // non-canonical input settings: wait to receive at least 1 character and read it immediately                                               TermiosTemp.c_cflag &= ~CSIZE;    TermiosTemp.c_cflag |= CS8; // Use 8 bits per character.    TermiosTemp.c_cflag |= CSTOPB; // Use 2 stop bits.    TermiosTemp.c_cflag &= ~CRTSCTS; // Disable hardware flow control.                                                               TermiosTemp.c_iflag |= IGNBRK;    TermiosTemp.c_iflag &= ~BRKINT;    TermiosTemp.c_iflag |= IGNPAR;      TermiosTemp.c_iflag &= ~PARMRK;    TermiosTemp.c_iflag |= INPCK;    TermiosTemp.c_iflag &= ~IXON; // Disable software flow control.    TermiosTemp.c_iflag &= ~IXOFF;    TermiosTemp.c_iflag &= ~IXANY; // add this base on VSP version    TermiosTemp.c_iflag &= ~IGNCR; // don't ignore carriage return \r on input    TermiosTemp.c_iflag &= ~INLCR; // don't translate new line \n to carriage return \r on input    TermiosTemp.c_iflag &= ~ICRNL; // don't translate \r to \n on input                                                                                                       TermiosTemp.c_oflag &= ~OCRNL; // don't map \r to \n on output    TermiosTemp.c_oflag &= ~ONLCR; // don't map \n to \r\n character pair on outputm          if (tcsetattr (fd, TCSANOW, &TermiosTemp) != 0)    {                                                                                    perror("Can't set tty attr");                                                   close(fd);                                                                                            return -1;                                                                            }        return 0;*/        struct termios newtio;        memset (&newtio, 0, sizeof (newtio)); //clear newtio struct        /* Set the bitrate */        //cfsetospeed(&newtio, SPEED);   //set bitrate 115200        //cfsetispeed(&newtio, SPEED);        int i;        for ( i= 0; i < sizeof(name_arr) / sizeof(int); i++)     {                if (speed == name_arr[i])                 {                        cfsetispeed(&newtio, speed_arr[i]);                        cfsetospeed(&newtio, speed_arr[i]);                        printf("i %d speed is %d %d\n", i, name_arr[i], speed_arr[i]);                        //tcsetattr(fd, TCSANOW, &TermiosTemp);                        break;                }        }        newtio.c_cflag |= CS8;           //set data 8bit        /* Set the parity */        newtio.c_cflag &= ~PARENB;  //wujiaoyan        /* Set the number of stop bits */        newtio.c_cflag &= (~CSTOPB);    //set stop bit 1        /* Selects raw (non-canonical) input and output */        newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);        newtio.c_oflag &= ~OPOST;        newtio.c_iflag |= IGNPAR;        /* Ignore parity errors!!! Windows driver does so why shouldn't I? */        /* Enable receiber, hang on close, ignore control line */        newtio.c_cflag |= CREAD | HUPCL | CLOCAL;        /* Read 1 byte minimun, no timeout specified */        newtio.c_cc[VMIN] = 1;    //set min read size        newtio.c_cc[VTIME] = 0;   //set wait time betwenn two character        if (tcsetattr (fd, TCSANOW, &newtio) < 0)                return 1;        return 0;}void * writetx(void *arg){        int uart_fd = (int)arg;        //Note: if initialize the char array with string, there is a '/0' at the end         char txbuf[10] = {'0','1','2','3','4','5','6','7','8','9'};        int i, wr = 0;        //for(i = 0; i < 256; i++)        //      txbuf[i] = '0';        tcflush(uart_fd,TCIOFLUSH );        sem_wait(&sem_write);        while(1)        //for( i = 0; i < 3; i++)        {                wr = write(uart_fd, txbuf, sizeof(txbuf));                //sem_post(&sem_sync);                //usleep(10000);                //sleep 1s                //sleep(1);        }    return (void *)0;}void * readtx(void *arg){        int uart_fd = (int)arg;        char rxbuf[12];        int i, rd = 0;        memset(rxbuf, 0, sizeof(rxbuf));        tcflush(uart_fd,TCIFLUSH);        int rval;        struct pollfd ufds;        ufds.fd = uart_fd;        ufds.events = POLLIN|POLLPRI;  //in para        //ufds.revents = 0x0000; //out para        sem_wait(&sem_read);        while(1)        {                ufds.revents = 0x0000; //out para                rval = poll (&ufds, 1, 5);                if(rval > 0)                {                        if((ufds.revents) & (POLLIN|POLLPRI))                        {                                rd = read(uart_fd, rxbuf, 12);                                if(rd > 0)                                {                                        //printf("%d\n", rd);                                        //puts(rxbuf);                                        //printf("0x%02X", rxbuf[1]);                                        for(i = 0; i < rd; i++)                                                printf("0x%02X ", rxbuf[i]);                                        //sem_post(&sem_sync);                                        //sleep 10ms                                        //usleep(10000);                                }                        }                }        }    return (void *)0;}int main(int argc, char** argv){        unsigned char txbuf[] = {'0','1','2','3','4','5','6','7','8','9'};        int num = -1;        unsigned char data[50];        memset(data, 0, sizeof(data));        int length = 0;        char *port;        if (argc > 1)        {                port = argv[1];                speed = atoi(argv[2]);        }     else     {        printf("<usage> ./uartcomm port speed\n");        return 1;     }     printf("open %s using speed %d\n", port, speed);        int fd = -1;        //if(num == 1)        //{                fd = open(port, O_RDWR | O_NOCTTY | O_NONBLOCK);        //}        /*else if(num == 2)        {                fd = open("/dev/ttySACS2", O_RDWR | O_NOCTTY | O_NONBLOCK);        }        else if(num == 3)        {                fd = open("/dev/ttySACS3", O_RDWR | O_NOCTTY | O_NONBLOCK);        }        else if(num == 4)        {                fd = open("/dev/ttySACS4", O_RDWR | O_NOCTTY | O_NONBLOCK);        }*/        if (fd == -1)        {                printf("ttyMT%d", num);                perror("open");                return -1;        }        int ret = setuart(fd);        if(ret != 0)                goto Exit;        pthread_t tid1, tid2;        int err = -1;        //err = pthread_create(&tid2, NULL, writetx, (void *)fd);    //if (err != 0)     //   perror( "create write thread");    err = pthread_create(&tid1, NULL, readtx, (void *)fd);    if (err != 0)        perror( "create read thread");    //sem_post(&sem_sync);    int i = 10, wr =0 ;input:    printf("please select:\n1. Read \n2. Write\n3. Read & Write\n0: Exit\n");    scanf("%d", &i);    //i = getchar();    switch(i)    {        case 1:            sem_post(&sem_read);            goto input;            break;        case 2:                        //sem_post(&sem_write);                        printf("please input data u want send:\n");                        scanf("%s", data);                        length = strlen(data);                        tcflush(fd,TCOFLUSH );                        if(length)                        {                                wr = write(fd, data, length);                                printf("write %d data: %s\n", length, data);                        }                        else                        {                                wr = write(fd, txbuf, sizeof(txbuf));                                printf("write 10 data: 0123456789\n");                        }            goto input;            break;        case 3:                //sem_post(&sem_write);                        sem_post(&sem_read);                        tcflush(fd,TCOFLUSH );                        wr = write(fd, txbuf, sizeof(txbuf));            goto input;            break;        case 0:            break;        default:            printf("error input\n");            goto input;    }    //char c = 0x1;    //until we get 'c' we will continue to read and write    //while (c != 'c')    //{    //  scanf("%c", &c);    //}    Exit:        pthread_cancel(tid1);        //pthread_cancel(tid2);        close(fd);        return 0;}



0 0