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
- t2s串口操作
- 串口操作
- 操作串口
- 串口操作
- 操作串口
- 串口操作
- 串口操作
- C#串口操作
- Visual C 串口操作
- [转载]c#操作串口
- C#串口操作
- C#串口操作
- WINCE串口操作
- ecos串口操作
- C#串口操作
- C#操作串口
- apdcomport操作串口实例
- api操作串口
- Google账号登录不上Android Studio
- Android获取IPV4的方法
- maven 打包命名规则
- LeetCode-344:Reverse String
- How many integers can you find993 公约数和公倍数
- t2s串口操作
- 苹果企业号-通过网页下载应用,部署应用分发服务器
- MFC修改对话框及控件背景颜色 - 很轻松!
- Round Numbers((组合数 + 简单组合数学)||(数位dp))
- log4j同配置下多个进程写日志
- 逻辑地址 虚拟地址 基地址 物理地址
- 浅谈MVC、MVP和MVVM,以及iOS中的MVC
- uc/os-iii学习笔记-时间管理
- Android SearchView 自定义SearchIcon和字体颜色大小