请问USB虚拟串口的原理是啥?如何传输数据的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问USB虚拟串口的原理是啥?如何传输数据的相关的知识,希望对你有一定的参考价值。

USB之间的通信,需要执行USB协议,COM口之间的通信,需要执行对应的串口协议;
所谓的驱动,就是去执行相应的协议;
比如说:原始数据,是红色的,通过USB接口传输时,就被打包变成为五颜六色,而在另一头的USB接口就将接收到的五颜六色数据进行解包,再还原为红色,然后再送到COM口,再被打包成为绿色并传输,而在另一头的COM接口就解包数据,又还原为红色;
而一般的手提有USB口而没有COM口,又是如何虚拟出COM口来的呢,关键的钥匙就在要接入USB口的元器件上,元器件内部上写有这样的要求,同时手提上的操作系统或者第三方软件就会明白他要做什么;
参考技术A 百度一下,很详细的信息。
http://wenku.baidu.com/link?url=zu9_tEP8tB-EkcUNIhmgNRI10dAXWHZXoNW-SNMYYxyAcZZlmRcRuHJ8-68T6pi9YY0GzM7jap5mGLUV-OeOHk1zpEEihHAGyf_5F9xZS9a

android设备使用usb串口传输数据

  首先介绍两个开源项目一个是Google的开源项目:https://code.google.com/archive/p/android-serialport-api/

另一个是我们这次介绍的开源项目:https://github.com/mik3y/usb-serial-for-android

  

 第一步:获取所有的已插入的串口驱动

1 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
2 List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
3 if (availableDrivers.isEmpty()) {
4   return;
5 }

 

然后,我们选择第一个dirver ,连接设备

1 UsbSerialDriver driver = availableDrivers.get(0);
2 UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
3 if (connection == null) {
4   // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..)
5   return;
6 }

 

接下来就可以读数据了

 1 // Read some data! Most have just one port (port 0).
 2 UsbSerialPort port = driver.getPorts().get(0);
 3 try {
 4   port.open(connection);
 5 //设置串口的波特率、数据位,停止位,校验位
 6   port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
 7 
 8   byte buffer[] = new byte[16];
 9   int numBytesRead = port.read(buffer, 1000);
10   Log.d(TAG, "Read " + numBytesRead + " bytes.");
11 } catch (IOException e) {
12   // Deal with error.
13 } finally {
14   port.close();
15 }

 

当然,我们可以给串口添加个监听

 1  1 private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
 2  2 private SerialInputOutputManager mSerialIoManager;
 3  3 
 4  4 private final SerialInputOutputManager.Listener mListener =
 5  5             new SerialInputOutputManager.Listener() {
 6  6                 @Override
 7  7                 public void onRunError(Exception e) {
 8  8                     Log.d(TAG, "Runner stopped.");
 9  9                 }
10 10 
11 11                 @Override
12 12                 public void onNewData(final byte[] data) {
13 13                    //TODO 新的数据
14 14                 }
15 15             };
16 16 
17 17 mSerialIoManager = new SerialInputOutputManager(sPort, mListener);//添加监听
18 //在新的线程中监听串口的数据变化
19 18 mExecutor.submit(mSerialIoManager);

如果需要接受比较大的数据,有可能会遇到一个问题:数据缓存和接收时间不够,导致数据被覆盖或者丢失,我们就需要修改串口读取缓存了

把 SerialInputOutputManager 中的 READ_WAIT_MILLIS 和 BUFSIZ 改成合适的大小就可以了

写数据的操作就是调用port的方法

port.write(bytes, 1000);

 

 

其实这个开源项目已经为我们封装了很多驱动类,都在driver包下,我们直接拿来用就可以了

 

 有时间我针对Cp21xx驱动的usb串口讲一下如何区分多个usb串口

 

 

 

  

以上是关于请问USB虚拟串口的原理是啥?如何传输数据的的主要内容,如果未能解决你的问题,请参考以下文章

USB 虚拟串口简介

虚拟机linux下用usb 转串口线,minicom连接SBC2410板,能接收数据,但是不能发送数据?

如何利用C语言,C++语言打开USB串口,然後对其发送信号? 跪求回答! 可行比加分!!

如何将笔记本usb口虚拟成串口

virtualpc用本机虚拟串口

如何在ubuntu虚拟串口