zoukankan      html  css  js  c++  java
  • Linux c 开发-15 Ubuntu子系统中使用串口

    Wsl2无法使用串口,open成功,但是set_opt一直通不过,没办法,最近暂时不使用docker,只能切换回Wsl1了

    wsl -l -v
    

    wsl --set-version Ubuntu-20.04 1
    

    #include<stdio.h>      /*标准输入输出定义*/
    #include<stdlib.h>     /*标准函数库定义*/
    #include<unistd.h>     /*Unix 标准函数定义*/
    #include<sys/types.h> 
    #include<sys/stat.h>  
    #include<fcntl.h>      /*文件控制定义*/
    #include<termios.h>    /*POSIX 终端控制定义*/
    #include<errno.h>      /*错误号定义*/
    #include<string.h>       /*字符串功能函数*/
    int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop);
    int main()
    {
    	int fd, nByte;
    	char* uart3 = "/dev/ttyS2";
    	char* uart_out = "请输入:
    ";
    	char buff[512];
    	memset(buff, 0, sizeof(buff));
    	if ((fd = open(uart3, O_RDWR | O_NOCTTY)) < 0)
    	{
    		printf("打开失败
    ");
    	}
    	else
    	{
    		set_opt(fd, 115200, 8, 'N', 1);
    		write(fd, uart_out, strlen(uart_out));
    		while (1)
    		{
    			while ((nByte = read(fd, buff, 512)) > 0)
    			{
    				buff[nByte + 1] = '';
    				write(fd, buff, strlen(buff));
    				memset(buff, 0, strlen(buff));
    				nByte = 0;
    			}
    		}
    	}
    }
    
    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;
    	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!
    
    ");
    	return 0;
    }
    

     执行成功  

      

      

    1、建了一个小群:616945527(软件), 欢迎大家加入,加群口令abc123,硬件嵌入式开发者推荐75764412(单片机)。
    闲置域名www.nsxz.com出售(等宽等高字符四字域名,可组合多种有意义词语)。
  • 相关阅读:
    Educational Codeforces Round 99 (Rated for Div. 2) (FG咕咕)
    2020 ccpc 威海
    【dp每日一题】CF 543A. Writing Code
    【dp每日一题】CF543C. Remembering Strings
    【dp每日一题】CF545C. Woodcutters
    【dp每日一题】CF566F. Clique in the Divisibility Graph
    Codeforces Round #686 (Div. 3)
    【dp每日一题】CF 559C. Gerald and Giant Chess
    2019 ICPC Asia Yinchuan Regional
    Educational Codeforces Round 98 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/14603961.html
Copyright © 2011-2022 走看看