ps:WSL2无法访问宿主机的串口,如果有使用wsl2,请切换回wsl
一安装
$ sudo apt update
$ sudo apt install minicom
二串口设置:
sudo minicom -s//进入串口配置界面
使用上下键选择Serial port setup,回车。此时光标在“change which setting”后面停留,它的上面有如下菜单:
Serial port setup [Enter],我们只需输入上面对应的字母,就可以进如相应的菜单进行设置。设置完成,回车,光标会回到“change which setting”后面,如此重复。完成按回车返回主菜单即可。返回主菜单后,选择“Save setup as df1”,将其保存为默认设置,然后选择 Exit推出。需退出后重新打开minicom,软件才会使用上述参数进行初始化。
1、修改串口号
2、修改波特率、校验位、停止位等
我这里的设置是虚拟串口4;8位数据为;1位停止位;无奇偶校验位;波特率9600;无硬件流和软件流控。
补充知识点: Windows10的串口,在WSL中也可以直接使用,其对应关系就是
COMx对应WSL的/dev/ttySx,例如COM1对应WSL的/dev/ttyS1
查看自己电脑的虚拟串口:计算机属性-管理-设备管理器-端口就可以查看到,如果没有设定好虚拟串口的,自行下载Configure Virtual Serial Port Driver去配置,这里不做赘述。
设置好之后你就会进入minicom界面了。
接下来我们就可以使用仿真来看是否可以正常通信啦,我这里使用的是 proteus进行仿真,没有的伙伴打开串口调试助手也一样可以进行测试。
附:
minicom基本操作如下:
1.需使用Ctrl+a 进入设置状态
2.按z进入设置菜单
O键:打开配置选项;
W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容 换行。这个功能在查看内核的啓动信息时很有用。
C键:清除屏幕的显示内容;
B键:浏览minicom的历史显示;
X键:退出minicom,会提示确认退出。
另外,ubuntu系统中/dev/文件夹是用于存放设备的,常见的设备类型如下:
/dev/hd[a-t]:IDE设备
/dev/sd[a-z]:SCSI设备
/dev/fd[0-7]:标准软驱
/dev/md[0-31]:软raid设备
dev/loop[0-7]:本地回环设备
/dev/ram[0-15]:内存
/dev/null:无限数据接收设备,相当于黑洞
/dev/zero:无限零资源
/dev/tty[0-63]:虚拟终端
/dev/ttyS[0-3]:串口
/dev/lp[0-3]:并口
/dev/console:控制台
/dev/fb[0-31]:framebuffer
/dev/cdrom => /dev/hdc
/dev/modem => /dev/ttyS[0-9]
/dev/pilot => /dev/ttyS[0-9]
/dev/random:随机数设备
/dev/urandom:随机数设备
串口编程测试源码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
int main()
{
int fd;
char recvbuff[128];
int count=0;
char buffer[]="Hello,word!\r\n";
struct termios uart_cfg;
fd=open("/dev/ttyS1",O_RDWR|O_NONBLOCK|O_NOCTTY);//打开串口
if(fd<0)
{
perror("Failed to open serial:");
return -1;
}
fcntl(fd,F_SETFL,0);//设置串口阻塞办法
//cfmakeraw(&uart_cfg);//将终端设置为原始模式 8n1没有流控
cfsetspeed(&uart_cfg,B9600); //设置波特率
// uart_cfg.c_cflag|=CLOCAL|CREAD;
//设置数据位
uart_cfg.c_cflag &= ~CSIZE; /* 用数据位掩码清空数据位设置 */
uart_cfg.c_cflag |= CS8;//数据位为8
//设置奇偶校验位
//奇校
//uart_cfg.c_cflag |= (PARODD | PARENB);
//uart_cfg.c_iflag |= INPCK;
//偶校
uart_cfg.c_cflag |= PARENB;
uart_cfg.c_cflag &= ~PARODD; /* 清除奇校验标志,则配置为偶校验*/
uart_cfg.c_iflag |= INPCK;
//无校
//uart_cfg.c_cflag &= ~PARENB;
//设置停止位
//uart_cfg.c_cflag &= ~CSTOPB; /* 将停止位设置为一个比特 */
uart_cfg.c_cflag |= CSTOPB; /* 将停止位设置为两个比特 */
tcflush(fd,TCIOFLUSH);/* 用于清空输入/输出缓冲区*/
tcsetattr(fd,TCSANOW,&uart_cfg);//使新的设置生效
while(1)
{
write(fd,buffer,strlen(buffer)); //往串口发送消息
sleep(1);
// count=read(fd,recvbuff,127); //读取串口接收数据
// if(count>0)
// {
// recvbuff[count]=0;
// printf("STR:%s\r\n",recvbuff);
// }
}
close(fd);
return 0;
}
串口编程参考:https://blog.csdn.net/morixinguan/article/details/80898172
//WSL-Ubuntu18.04 LTS 重启方法 //以管理员权限运行cmd net stop LxssManager //停止 net
start LxssManager //启动