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 = "请输入:\n"; char buff[512]; memset(buff, 0, sizeof(buff)); if ((fd = open(uart3, O_RDWR | O_NOCTTY)) < 0) { printf("打开失败\n"); } 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] = '\0'; 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!\n\r"); return 0; }
执行成功
本博客是个人工作中记录,更深层次的问题可以提供有偿技术支持。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。