精华内容
下载资源
问答
  • Windows10 部分系统无法安装USB转串口驱动问题解决前言问题解决方案 前言 拿到一台红米电脑,发现系统无法自动识别并安装u转串驱动,于是找了相关资料。 问题 以下是问题图片 在我安装系统自带驱动的时候遇到了这样...

    Windows10 部分系统无法安装USB转串口驱动问题解决

    前言

    拿到一台红米电脑,发现系统无法自动识别并安装u转串驱动,于是找了相关资料。

    问题

    以下是问题图片
    显示未知设备
    在我安装系统自带驱动的时候遇到了这样的问题
    新的问题
    于是只能在网上找CH340的驱动。

    解决方案

    下面是驱动下载链接
    链接: https://pan.baidu.com/s/1XzaXWgQg5wyEIICU-YwKLg
    提取码:945t
    下载驱动后首先解压文件

    打开设备属性
    设备属性
    点击驱动栏目
    点击更新驱动程序按钮
    点击更新驱动程序
    选择浏览我的电脑以查找驱动程序
    点击浏览
    找到解压CH340驱动的文件夹,点击下一步安装即可
    点击下一步安装

    完成安装

    展开全文
  • Linux串口驱动程序(6)-串口驱动实现

    千次阅读 2019-06-13 11:23:35
    当然具备移植、修改驱动能力的基础是能够读懂驱动程序,同时需要对这个驱动程序的核心功能非常了解。接下来开始编写发送中断处理程序和接收中断处理程序的代码。 1.发送中断处理程序的设计 下面我们就开始对s3c24...

    在Linux驱动开发中,一般都不会从0开始写,我们做的更多的是移植和修改,有时候还需要对驱动程序进行优化。当然具备移植、修改驱动能力的基础是能够读懂驱动程序,同时需要对这个驱动程序的核心功能非常了解。接下来开始编写发送中断处理程序和接收中断处理程序的代码。

    1.发送中断处理程序的设计

    • 下面我们就开始对s3c24xx_serial_tx_chars进行重新的编写,编写的依据就是我们之前分析出来的发送流程。最终的目的是,编写的代码,在编译进内核之后可以正确的通过串口输出和输入信息。
    // 发送中断处理程序
    static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id)
    {
    	struct s3c24xx_uart_port *ourport = id;
    	struct uart_port *port = &ourport->port;
    	struct circ_buf *xmit = &port->state->xmit;  // 循环缓冲
    	int count = 256;
    
    	// 1、判断x_char里面是否有数据,如果有数据把它发送然后退出。
    	if (port->x_char) 
    	{
    		wr_regb(port, S3C2410_UTXH, port->x_char);
    		goto out;
    	}
    	
    	// 2、判断循环缓冲是否为空,或者串口不允许发送,则把中断关闭
    	if (uart_circ_empty(xmit) || uart_tx_stopped(port)) 
    	{
    		s3c24xx_serial_stop_tx(port);
    		goto out;
    	}
    	
    	// 3、利用while循环发送数据
    	while (!uart_circ_empty(xmit) && count-- > 0)   // 循环的条件是:1.循环缓冲不为空,2.发送的数据量最多为256字节
    	{
    		// 3.1 判断发送的fifo是否满了(UFSTAT寄存器14位),如果满了要退出
    		if (rd_regl(port, S3C2410_UFSTAT) & (1 << 14))
    			break;
    	
    		// 3.2 没有满就从循环缓冲的尾部去除数据,写入S3C2410_UTXH。从循环缓冲中取出数据,用tail
    		wr_regb(port, S3C2410_UTXH, xmit->buf[xmit->tail]);
    		
    		// 3.3 调整循环缓冲的位置
    		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
    		port->icount.tx++;   // 发送的数据量加1
    	}
    	
        // 4、如果循环缓冲里面的数据小于WAKEUP_CHARS(256),则唤醒之前阻塞的发送进程
    	if (uart_circ_chars_pending(xmit) < 256)
    		uart_write_wakeup(port);
    		
    	// 5、同时如果循环缓冲为空了,把发送中断关闭。
    	if (uart_circ_empty(xmit))
    		s3c24xx_serial_stop_tx(port);
    	
     out:
    	return IRQ_HANDLED;   // 驱动被执行
    }	
    • 当然在编写过程中,应该尽量不参考原来代码的实现,而是参考之前分析的流程,碰到不会的函数、结构、可以参考内核里面的其他代码。

    2.接收中断处理程序的设计

    • 接收中断处理函数是s3c24xx_serial_rx_chars,编写过程方法和上面的也类似。
    // 接收中断处理程序
    s3c24xx_serial_rx_chars(int irq, void *dev_id)
    {
    	struct s3c24xx_uart_port *ourport = dev_id;
    	struct uart_port *port = &ourport->port;
    	struct tty_struct *tty = port->state->port.tty;
    	unsigned int ufcon, ch, flag, ufstat, uerstat;
    	int max_count = 64;
    
    	while (max_count-- > 0)
    	{	
    		// 1.判断接收fifo是否为空,如果为空,退出
    		ufstat = rd_regl(port, S3C2410_UFSTAT);  // 读取UFSTAT寄存器状态,
    		if ((ufstat & 0x3f) == 0)  // UFSTAT寄存器0到5位保存接收fifo的数据量
    			break;
    	
    		// 2.读取错误状态寄存器
    		uerstat = rd_regl(port, S3C2410_UERSTAT);
    		
    	    // 3.取出接收到的字符 
    	    ch = rd_regb(port, S3C2410_URXH);
    		
    		// 6.如果接收到的是sysrq这个特殊字符,则进行特殊处理
    		uart_handle_sysrq_char(port, ch);
    		
    		flag = TTY_NORMAL;
    		
    		// 7.把接收到的字符送到串口驱动的buf中
    	    uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN, ch, flag);
    	}
    	
    	// 8.把串口驱动中的数据送到read_buf中
    	tty_flip_buffer_push(tty);
    	
    	return IRQ_HANDLED;
    }


     

    展开全文
  • 上一篇博客分析了串口驱动初始化部分,下面逐步分析串口驱动中的打开串口,数据发送和接收! 初始化主要工作流程: 先来分析串口打开操作流程,还是先上图: 这里分析还是离不开上篇博客中的两张重要的图: ...

    上一篇博客分析了串口驱动初始化部分,下面逐步分析串口驱动中的打开串口,数据发送和接收!

    初始化主要工作流程:


    先来分析串口打开操作流程,还是先上图:



    这里分析还是离不开上篇博客中的两张重要的图:



    串口操作重要的数据结构:


    由上一篇串口驱动分析可知在samsung.c中模块初始化中有一项工作是注册一个串口驱动,


    跳到这个函数中uart_register_driver可以看到有一个函数:

    retval = tty_register_driver(normal);

    跳到这个函数中,这里贴上源码:

    int tty_register_driver(struct tty_driver *driver)
    {
    	int error;
    	int i;
    	dev_t dev;
    	void **p = NULL;
    	struct device *d;
    
    	if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {
    		p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL);
    		if (!p)
    			return -ENOMEM;
    	}
    
    	if (!driver->major) {
    		error = alloc_chrdev_region(&dev, driver->minor_start,
    						driver->num, driver->name);
    		if (!error) {
    			driver->major = MAJOR(dev);
    			driver->minor_start = MINOR(dev);
    		}
    	} else {
    		dev = MKDEV(driver->major, driver->minor_start);
    		error = register_chrdev_region(dev, driver->num, driver->name);
    	}
    	if (error < 0) {
    		kfree(p);
    		return error;
    	}
    
    	if (p) {
    		driver->ttys = (struct tty_struct **)p;
    		driver->termios = (struct ktermios **)(p + driver->num);
    	} else {
    		driver->ttys = NULL;
    		driver->termios = NULL;
    	}
    
    	cdev_init(&driver->cdev, &tty_fops);
    	driver->cdev.owner = driver->owner;
    	error = cdev_add(&driver->cdev, dev, driver->num);
    	if (error) {
    		unregister_chrdev_region(dev, driver->num);
    		driver->ttys = NULL;
    		driver->termios = NULL;
    		kfree(p);
    		return error;
    	}
    
    	mutex_lock(&tty_mutex);
    	list_add(&driver->tty_drivers, &tty_drivers);
    	mutex_unlock(&tty_mutex);
    
    	if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
    		for (i = 0; i < driver->num; i++) {
    			d = tty_register_device(driver, i, NULL);
    			if (IS_ERR(d)) {
    				error = PTR_ERR(d);
    				goto err;
    			}
    		}
    	}
    	proc_tty_register_driver(driver);
    	driver->flags |= TTY_DRIVER_INSTALLED;
    	return 0;
    
    err:
    	for (i--; i >= 0; i--)
    		tty_unregister_device(driver, i);
    
    	mutex_lock(&tty_mutex);
    	list_del(&driver->tty_drivers);
    	mutex_unlock(&tty_mutex);
    
    	unregister_chrdev_region(dev, driver->num);
    	driver->ttys = NULL;
    	driver->termios = NULL;
    	kfree(p);
    	return error;
    }
    可以看到这个函数内部实现其实就是注册一个字符设备!
    看看这一行: cdev_init(&driver->cdev, &tty_fops);

    从这个tty_fops找到串口open函数的接口:


    可以看到open操作对应的是tty_open(这里的tty_fops就是字符设备的file_operations)

    跳到这个函数中可以看到箭头所指向的一行:


    这个ops实际上是struct   tty_operations  类型的:


    这里总结一下:应用程序空间的打开串口open操作调用了tty_ops中的tty_open,然后tty_open又对应的调用了uart_ops中的uart_open这个函数,这个函数还是tty层次里面的还不涉及驱动层!

    下面跳到uart_open这个函数里面:

    static int uart_open(struct tty_struct *tty, struct file *filp)
    {
    	struct uart_driver *drv = (struct uart_driver *)tty->driver->driver_state;
    	struct uart_state *state;
    	struct tty_port *port;
    	int retval, line = tty->index;
    
    	BUG_ON(!tty_locked());
    	pr_debug("uart_open(%d) called\n", line);
    
    	state = uart_get(drv, line);
    	if (IS_ERR(state)) {
    		retval = PTR_ERR(state);
    		goto fail;
    	}
    	port = &state->port;
    
    	tty->driver_data = state;
    	state->uart_port->state = state;
    	tty->low_latency = (state->uart_port->flags & UPF_LOW_LATENCY) ? 1 : 0;
    	tty->alt_speed = 0;
    	tty_port_tty_set(port, tty);
    
    	/*
    	 * If the port is in the middle of closing, bail out now.
    	 */
    	if (tty_hung_up_p(filp)) {
    		retval = -EAGAIN;
    		port->count--;
    		mutex_unlock(&port->mutex);
    		goto fail;
    	}
    
    	/*
    	 * Make sure the device is in D0 state.
    	 */
    	if (port->count == 1)
    		uart_change_pm(state, 0);
    
    	/*
    	 * Start up the serial port.
    	 */
    	retval = uart_startup(tty, state, 0);
    
    	/*
    	 * If we succeeded, wait until the port is ready.
    	 */
    	mutex_unlock(&port->mutex);
    	if (retval == 0)
    		retval = tty_port_block_til_ready(port, tty, filp);
    
    fail:
    	return retval;

    可以看到这个函数调用一个uart_startup函数,这个函数任然是tty里面的还不涉及串口驱动层!


    这个函数比较长,截取重要的部分,上篇文章中也有提到过,看第二个红色箭头所指部分:uport的ops的startup

    uport类型可以从第一个箭头所指部分看到是struct uart_port类型的,一个uart_port对应的是一个串口,在这个数据结构中是针对这个串口的函数操作集,而这些函数操作集就是由串口驱动来实现的!

    所以现在就是要找出串口操作集里面的start_up,而这个就要从驱动里面去找了!

    又串口初始化分析可以找到串口初始化中的port是从probe这个函数获取的:


    而这个数组结构定义如下:每个port代表一个串口


    下面再来看看这个红色箭头所指向的串口驱动操作集里面的内容:



    上面截图中信息量比较多,左边和右边的可以对比着看,一个是函数指针,一个是函数指针对应的函数名字!

    至此总结一下串口open操作的函数调用关系:

    open ---> tty_open(tty_ops里面的) ---> uart_open(uart_ops里面的) ---> uart_start  --->   上图中红色箭头所指部分(这个就是相当于驱动层里面的open)

    下面跳转到这个函数中:


    代码量不多对照着代码分析总结如下图:


    以上就是整个串口打开操作的实现!


    下面再来分析串口驱动的发送操作,还是先上图:


    整体分析流程和open函数一样!

    write---> tty_write ---> n_tty_write(线路规程里面) ---> uart_write ---> uart_start ---> 向上看第四张图,也就是驱动层对应的write操作


    这里直接跳到s3c24xx_serial_start_tx这个函数:


    从上面的源码中可以看到这里没有操作寄存器的发送部分!这里有个小窍门!关键之处在enable_irq(ourport->tx_irq)这个地方!

    当发送中断时会有中断处理程序来处理发送!这里的只是起一个激活中断发送处理程序!


    在这个函数中可以看到注册了一个发送中断处理程序!跳到这个函数里面看看


    上面的代码中可以看到寄存器操作部分!总体简要总结:应用层的write串口操作最终会调用上面的s3c24xx_serial_start_tx函数,而这个函数仅仅是起一个激活发送中断的功能,具体数据发送过程又是在注册发送中断来实现的!

    下面这张图就是根据上面的这个函数实现的总结:




    分析完了发送,下面来分析接收read函数对应的操作:


    函数整个调用流程对应的和write一样!

    有了上面的基础,下面可以来思考下面的两个问题:

    1. tty子系统是如何响应用户的读数据请求?

    2. 串口驱动又是如何来接收处理的?


    其实是同write操作一样!下面还是简要的分析一下:

    做为响应用户空间的read函数的第一个结点还是struct  file_operations结构中的tty_read:


    下面跳到这个函数里面来看看源码:


    红色箭头部分可以看到这一行其实是调用了线路规程里面的read,ops的数据类型:


    再来看看read所在的结构体类型:


    其实这个被调用的read函数对应的是线路规程里面的read.

    下面再来看看线路规程struct tty_ldisc_ops tty_ldisc_N_TTY这个结构:


    可以看到这里tty_read又由线路规程里面的n_tty_read来响应!

    n_tty_read这个函数代码比较多!这里暂不截全图!只分析其中比较重要的三个部分


    箭头所指部分是设置应用程序这个进程为阻塞状态!(这行代码还不会立即阻塞)

    然后箭头下面的第二个if语句里面有个判断,input_available_p判断是否有数据读!


    当没有数据可读的时候,将会阻塞,不会被CPU调度占用CPU。结合上面的就是如果没数据就让其阻塞生效

    如果有数据将会从read_buf中读走数据


    看看这个函数内部实现:


    其实这个read_buf和驱动是紧密相关的,当驱动里面有数据的时候,驱动就将数据往read_buf里面送!下面再来看驱动是怎么收到数据的!

    还是和write函数一样在驱动模块初始化里面的有个注册发送中断函数,然后跳到s3c24xx_serial_startup函数

    在这个函数里面有个request_irq函数,这个函数里面其中一个函数指针参数就是s3c24xx_serial_rx_chars函数



    分析完了下面来着手撸驱动代码了!!!这个只是在原有代码的基础上根据上面的分析流程来自己实现串口驱动的重要部分:

    这里来实现两个最核心的功能:

    1. 串口驱动发送中断处理程序

    2. 串口驱动接收中断处理程序


    打开samsung.c,找到static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id)发送中断函数,将里面的代码删除,然后根据上面的分析流程实现!


    发送中断处理程序代码:


    第一步:1. 判断x_char是否为0,如果不为0,则发送x_char


    x_char成员在port结构中,为xon或者xoff(这个是和流控相关的)

    <span style="font-size:18px;">static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id)
    {
    	struct s3c24xx_uart_port *ourport = id;
    	struct uart_port *port = &ourport->port;
    	struct circ_buf *xmit = &port->state->xmit;//循环缓冲
    	int count = 256;
    	
    	//1. 判断x_char是否为0,如果不为0,则发送x_char
    	if(port->x_char)
    	{
    		wr_regb(port, S3C2410_UTXH,  port->x_char);//发送一个字符实际上就是将数据写到UTXH寄存器里面
    		goto out;
    	}
    	
    	//2. 判断发送缓冲是否为空或者驱动被设置为停止发送的状态 则取消发送
    	if( (uart_circ_empty(xmit)) || (uart_tx_stopped(port)) )
    	{
    		s3c24xx_serial_stop_tx(port);
    		goto out;
    	}
    	
    	//3. 循环发送,循环条件:发送缓冲不为空
    	while( (!uart_circ_empty(xmit)) || (count--) > 0 )
    	{
    		//3.1 发送fifo如果满,退出发送
    		if( rd_regl(port, S3C2410_UFSTAT) & (1 << 14) )//这里要查datasheet UFSTAT寄存器14位
    			break;
    				
    		//3.2 将要发送的字符写入发送寄存器
    		wr_regb(port, S3C2410_UTXH, xmit->buf[xmit->tail]);//从尾巴里面取出数据
    		xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);//循环,如果到最后一位又从第一位开始发送
    		
    		//3.3 修改循环缓冲的尾部位置
    		port->icount.tx++;//更新发送的统计量
    	}
    	
    	//4. 如果发送缓冲中的剩余数据量uart_circ_chars_pending<256
    	//则唤醒之前阻塞的发送进程uart_write_wakeup
    	if (uart_circ_chars_pending(xmit) < 256)
    		uart_write_wakeup(port);
    
    	
    	//5. 如果发送缓冲为空,则关闭发送使能
    	if (uart_circ_empty(xmit))
    		s3c24xx_serial_stop_tx(port);
    		
    out:
    	
    	return IRQ_HANDLED;//函数出口,表示中断已经处理
    }</span>
    上面的代码除了参考之前的分析流程图还有之前的源码,还有datasheet,这里就不一一截图祥举了!

    然后make uImage ARCH=arm COMPELE_CROSS=arm-linux-编译内核源码!将uImage下载到开发板启动内核!会发现这里有个小问题!不过对照内核源码看看可以解决!

    串口驱动接收中断处理程序:



    s3c24xx_serial_rx_chars1111(int irq, void *dev_id)
    {
    	struct s3c24xx_uart_port *ourport = dev_id;
    	struct uart_port *port = &ourport->port;
    	struct tty_struct *tty = port->state->port.tty;
    	unsigned int ufcon, ch, flag, ufstat, uerstat;
    	int max_count = 64;//一次最多接收的字符数
    
    	while (max_count-- > 0) {
    		ufcon = rd_regl(port, S3C2410_UFCON);//1. 读取UPCON寄存器
    		ufstat = rd_regl(port, S3C2410_UFSTAT);//2. 读取UPSTAT寄存器
    		
    		//3. 如果接收fifo里的数据量为0,则退出
    		if (s3c24xx_serial_rx_fifocnt(ourport, ufstat) == 0)
    			break;
    
    		uerstat = rd_regl(port, S3C2410_UERSTAT);//4. 读取UERSTAT寄存器
    		ch = rd_regb(port, S3C2410_URXH);//取出字符
    
    		if (port->flags & UPF_CONS_FLOW) {//6. 流控制处理
    			int txe = s3c24xx_serial_txempty_nofifo(port);
    
    			if (rx_enabled(port)) {
    				if (!txe) {
    					rx_enabled(port) = 0;
    					continue;
    				}
    			} else {
    				if (txe) {
    					ufcon |= S3C2410_UFCON_RESETRX;
    					wr_regl(port, S3C2410_UFCON, ufcon);
    					rx_enabled(port) = 1;
    					goto out;
    				}
    				continue;
    			}
    		}
    
    		/* insert the character into the buffer */
    
    		flag = TTY_NORMAL;
    		port->icount.rx++;
    
    		if (unlikely(uerstat & S3C2410_UERSTAT_ANY)) {
    			dbg("rxerr: port ch=0x%02x, rxs=0x%08x\n",
    			    ch, uerstat);
    
    			/* check for break */
    			if (uerstat & S3C2410_UERSTAT_BREAK) {
    				dbg("break!\n");
    				port->icount.brk++;
    				if (uart_handle_break(port))
    				    goto ignore_char;
    			}
    
    			if (uerstat & S3C2410_UERSTAT_FRAME)
    				port->icount.frame++;
    			if (uerstat & S3C2410_UERSTAT_OVERRUN)
    				port->icount.overrun++;
    
    			uerstat &= port->read_status_mask;
    
    			if (uerstat & S3C2410_UERSTAT_BREAK)
    				flag = TTY_BREAK;
    			else if (uerstat & S3C2410_UERSTAT_PARITY)
    				flag = TTY_PARITY;
    			else if (uerstat & (S3C2410_UERSTAT_FRAME |
    					    S3C2410_UERSTAT_OVERRUN))
    				flag = TTY_FRAME;
    		}
    
    		if (uart_handle_sysrq_char(port, ch))
    			goto ignore_char;
    		
    		//9. 将接收到的字符发送到串口驱动的buf
    		uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN,
    				 ch, flag);
    
     ignore_char:
    		continue;
    	}
    	//10. 把串口驱动收到的数据发送到线路规程的read_buf
    	tty_flip_buffer_push(tty);
    
     out:
    	return IRQ_HANDLED;
    }
    还是表示鸭梨山大!任重道远!


    展开全文
  • 绿联usb转串口驱动

    2021-02-05 00:46:43
    绿联usb转串口驱动是一款硬件驱动工具,可以帮助用户将USB接口转换成串口,软件内置了高性能的转换芯片,可以帮助用户轻松完成转换,在转换后可以让没有网络接口的笔记本连接网络,转换无延迟,并且支持各种协议,...

    绿联usb转串口驱动是一款硬件驱动工具,可以帮助用户将USB接口转换成串口,软件内置了高性能的转换芯片,可以帮助用户轻松完成转换,在转换后可以让没有网络接口的笔记本连接网络,转换无延迟,并且支持各种协议,方便用户进行使用。你只需要下载并打开驱动,然后让它自动安装即可。

    软件介绍

    1e0902593a19886181899636860e783f.png

    Ugreen绿联 USB转串口线,可轻松实现计算机USB接口到通用串口之间的转换。绿联USB转串口线采用台湾原装双芯片,无延迟,性能稳定,支持RS232协议以及远程唤醒和电源管理功能。产品带 USB转串口DB9驱动光盘,一键式驱动安装,操作更简单便携,支持Win7/Win8以及大部分常见操作系统。绿联USB转串口DB9线可适用于标签打印机、收银机、POS机、MODEM、扫描仪等各类串口设备(加密狗、编程机和刻字机可能不支持)。

    软件功能

    多系统兼容.轻松热插拔

    标准USB2.0接口.轻松热插拔,WIN8免驱.即插即用兼容WINDOWS ME/2000/XP/VISTA/WIN7/WIN8/WIN10.MAC OS X等操作系统

    品质可靠,性能可靠

    绿联USB转串口线采用台湾PL2303双芯片打造,内置128BYTE TX/384 BYTE RX缓存.数据传输加倍稳定

    支持远程唤醒与电源管理

    自动串口通信握手协议.支持电源管理、远程唤醒功能支持RS232串口界面

    材质好,信号传输才够稳

    USB线采用镀锡无氧铜传导线芯,传输效果好,传输速度达1MBPS

    铝箔+铝镁编织网,多层屏蔽设计,抗干扰能力更强

    软件特色

    1、绿联Ugreen USB转DB9 串口线轻松实现计算机USB接口到通用串口之间的转换。

    2、兼容设备:外置MODEM、ISDN-TA、数码相机、标准串行鼠标、条形码读入设备、通用读卡机 V、手写板、PlamIII&Palam、标签写入器、安全系统。

    3、系统支持:Windows XP (32 & 64-bit) Windows Vista/7/8/8.1/10 (32 & 64-bit)

    4、适用型号:20222|20223|20210|20211|20201

    使用说明

    f75cf9a5e9a8fccdd01983a3dd8cc748.png

    USB转串口DB9端口设置方法

    安装好USB转串口DB9驱动程序,在【设备管理器】可见相关Profolic USB设备。

    1.依次点击[设备管理器]--[端口],并右击ProlificUSB-to-Serial comm Port(COM18),在弹出的下拉菜单中,选择[属性]

    2.在属性窗口里选择[端口设置]--[高级],将[COM端口号]设置为闲置COM端口(如COM2),并点击[确定]键,设置完毕。

    3.在[计算机管理]中选择[端口],在工具栏中点击[扫描检测硬件改动]图标,搜索新设备,此时可以看到端口从COM18转换为COM2。

    电脑主板厂商在针对单片机或电子技术的开发中,作为最常用的串口被省略了。如:搞单片机会用到串口通信,这时没有串口就不能完成实验及调试工作。 同时,市场上部分笔记本电脑也没有串口,给电子工程师们或单片机学习者带来了很大的不方便,此时USB转串口DB9便派上了大用场。通过本文的简述,相信用户对USB转串口DB9驱动安装与设置方法有了更详细的了解。

    常见问题

    问:如何卸载绿联usb转串口驱动?

    答:安装并打开360软件管家,在卸载选项的列表中找到绿联usb转串口驱动,点击卸载即可

    问:绿联usb转串口驱动转接网线驱动是什么?

    答:绿联usb转接网线驱动是绿联USB外置网卡的驱动程序。

    USB外置网卡可方便不到RJ45网络接口的超极本zhuan等笔记本电脑通过USB接口连接网线,实现更稳定的有线网络上网。

    这类USB网卡需要安装驱动程序,才能正常使用,一般随产品有驱动光盘

    展开全文
  • 前几天研究了LED,按键驱动今天开始研究linux串口驱动
  • 在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式...Windows CE.net是微软公司推出的32位嵌入式操作系统,具备多任务、实时性、模块化及可伸缩性、强大的通信能力以及图形界面友好等优点。将操作
  • 原文转自:http://m.blog.csdn.net/blog/lushengchu2003/9368031最近闲来无事情...但是排查问题时候毫无疑问会查看串口驱动的相关代码,所以把串口驱动的流程过了一遍,方便以后再用到时拿来用。分析的是全志代码 A2...
  • 在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式...Windows CE.net是微软公司推出的32位嵌入式操作系统,具备多任务、实时性、模块化及可伸缩性、强大的通信能力以及图形界面友好等优点。将操作
  • 单片机IO引脚驱动能力的提高

    万次阅读 2016-01-25 11:44:17
    早期的51单片机,驱动能力很低。P1、P2和P3口只能驱动3个LSTTL输入端,P0口可驱动8个。如果想要驱动更多的器件,就要用到“总线驱动芯片”。经常用的就是74LS244(单向)和74LS245(双向)。现在常用的 AT89C51 ...
  • 串口驱动大全

    2013-09-12 13:52:07
    针对Z-TEK串口的USB转化能力的相关驱动
  • S5PV210开发 -- 串口驱动开发

    千次阅读 多人点赞 2017-11-20 12:26:43
    上篇文章讲的 UART,更多的是硬件相关的知识。接下来进入正题了,串口驱动开发。 一、阅读原理图 我们用的是 UART2 串口,则接收管脚 XuRXD2 复用 GPA1_0,发送管脚 XuTXD2 复用 GPA1_1 二、S5PV210 UART...
  • 串口,USB,USB转串口,串口驱动,仿真器下载程序 在初学stm32,接触到的第一步便是下载程序, 方法一:利用仿真器下载程序 方法二:利用串口下载程序 本文简单介绍两种下载方法,浅入窥探下载原理,因为初学,错误...
  • 【Hardware】串口驱动

    2021-04-09 09:31:43
    UART接口:通用异步收发器(Universal Asynchronous Receiver/Transmitter),UART是串口收发的逻辑电路,这部分可以独立成芯片,也可以作为模块嵌入到其他芯片里,单片机、SOC、PC里都会有UART模块。 **COM口:**...
  • 1.stm32f10x串口驱动程序(环形队列+内存动态分配+DMA)。2用于演示FAT文件系统。3代码具有可移植性,只需在此基础上修改便可移植其他项目。4增强串口收发数据的抗干扰能力,降低误码率。5,可以作为串口发送模板的...
  • 单片机的驱动能力

    千次阅读 2009-10-17 16:30:00
    在單片機中﹐I/O能夠驅動8個TTL﹐或能驅動4個TTL一般芯片都允许带多个负载...如果I/O口的驱动能力能带4个标准TTL负载,那就说明它能提供16mA电流。对于低功耗的吸入电流不到1mA。如果带74LSXXX的芯片数量可增加到16个。
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥本文通过对Linux下串口驱动的分析。由最上层的C库。到操作系统系统调用层的封装。再到tty子系统的核心。再到一系列线路规...
  • 串口驱动到Linux驱动模型

    千次阅读 2017-11-15 22:55:25
    大学的时候,帮朋友写的操作系统调研的作业,最近整理过去的文档时候偶然发现,遂作为博客发出来。  从串口驱动到Linux的tty子系统驱动模型简要分析  基于ARM920T核心
  • 串口驱动分析

    千次阅读 2013-05-19 11:32:05
    虽然串口通讯已经是普遍的标准而且广为大家熟知,但驱动中涉及的部分内容也可能在平时的应用中并不是很常用到,在这里做一个简单的介绍待后面说明到具体代码的时候可以连贯一些。 串行通讯接口是目前十分流行的...
  • 高通MSM8255串口驱动移植

    千次阅读 2011-09-01 13:47:54
    其中“57”属于引脚编号,“1”属于模式(如为“0”即GPIO模式,“1”串口模式),“GPIO_CFG_OUTPUT”输入、输出模式,“GPIO_CFG_NO_PULL”默认上拉还是下拉模式,“GPIO_CFG_2MA”驱动电流能力。   static...
  • 安卓连接串口设备需要安装驱动

    千次阅读 2017-01-27 06:11:07
    Hadoop 我们都知道 C++ ,1 主要目的是验证系统是否具有系统宣称的能力即无需与原数据库保持连接.  则按REQUIRED属性执行虽然js可以在客户端动态生成HTML,Zm是规范化因子运维的三方面.margin大数据的排序,...
  • 如何编写串口(uart)驱动-基于linux310

    千次阅读 2014-10-29 20:50:38
    Linux uart驱动编写 本篇在介绍Linux下串口
  • 详解DHT11温湿度传感器的原理及驱动程序

    万次阅读 多人点赞 2019-11-22 00:29:45
    DATA引脚并联一个5K以上的上拉电阻,增强信号的抗干扰额能力。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。 三.传感器控制时序 1.数据格式 DATA 用于微处理器与 DHT11之间的通讯和...
  • MBUS总线数据采集器

    千次阅读 2019-06-15 22:21:38
    最初怀疑是寄存器配置出错,通过单步调试和查询datasheet都没有发现问题,最后通过分析启动代码MKM33Z5.s发现对于串口UART0~UART1的中断程序是外部引用“ EXPORT SCI0_SCI1_IRQHandler [WEAK]”,而串口驱动中UART0~...
  • wince6.0串口驱动相关

    千次阅读 2011-12-05 19:03:32
    之前看了李大为编写的windows ce 工程实践完全解析关于串口驱动的章节,完后脑子里进行了一定的梳理和总结。一段时间后,偶然同事和我讨论时才发现,之前感觉良好的总结基本又乱了,这里体现了讨论的重要。同时提醒...
  • 绿联usb转串口驱动正式版绿联usb转串口驱动正式版是可以将USB...绿联usb转串口驱动还支持PL2303芯片的绿联USB转DB9串口线,可解决串口换线无法使用的问题。华军软件园提供绿联usb转串口驱动的下载服务,下载绿联u...
  • 一个 SPI 转串口驱动的优化

    千次阅读 2008-10-18 16:47:00
    考虑到我们的驱动程序确实也只是刚刚能够工作,应该有较大的优化空间, 决定对代码进行一定优化,以辅助问题解决。   首先写一个测试程序,该程序以 Cooked 模式, 8 位字节, 奇校验, 1 位...
  • 龙芯SPI NOR FLASH驱动

    2017-10-20 15:20:26
    详细列出了龙芯SPI NOR FLASH的驱动修改的地方,本文档MOCK历时接近一个月编写,包括PMON和Kernel中SPI NOR FLASH的驱动,很详细。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,876
精华内容 6,350
关键字:

串口驱动能力