linux系统串口透传,基于CC2540的USB虚拟串口透传方案

2023-05-16

1.USB虚拟串口代替物理串口的可行性

首先,越来越多带USB接口的器件涌现出来,如带USB接口的单片机,或独立的USB接口器件,而且这些器件的成本已经很接近于使用RS232电平转换芯片所带来的成本。

其次,市场上也出现了一些USB接口转串口的芯片,这些芯片一头为串口,另一头为USB接口,在其内部完成串口到USB协议的转换。该芯片通过USB口连接到个人计算机后,在操作系统中表现为一个串口设备,这意味着USB接口对于传统的串口调试工具(HyperTerninal)和用户基于串口的应用程序是透明的,开发人员完全不用更改PC端的调试和应用程序。

但是这些器件的USB类不属于标准的USB设备类,因此需要在Windows和Linux操作系统上安装额外的设备驱动。另外,由于不是操作系统自带的设备驱动,而且通信经过了由串口到串口,USB从设备到USB主机的多次转换,当调试遇到问题时常常无法确定是串口出了问题还是USB出了问题。因此,应该使嵌入式系统直接和PC通过USB总线接口连接(通过片上的USB接口或片外USB接口芯片),由单片机直接完成USB虚拟串口的协议转换。

在USB标准子类中,有一类称之为CDC类,可以实现虚拟串口通信的协议,而且由于大部分的操作系统(Windows和Linux)都带有支持CDC类的设备驱动程序,可以自动识别CDC类的设备,这样不仅免去了写专用设备驱动的负担,同时简化了设备驱动的安装。

2.具体实现方式

TI给出的BLE4.0-1.4.0协议栈里是没有这部分的,需要我们自建工程,我们就从SimpleBLEPeripheral这个工程更改成我们想要的工程项目,因为此设备也是做从机的,主机是手机那边,作为从机实现将数据通过USB与电脑通讯,我们调试的时候是通过虚拟串口方式,通过串口助手显示在屏幕上的。

初始化UART和USB

void HalUARTInit(void)

{

#if HAL_UART_USB

HalUARTInitUSB();

#endif

}

将其他与UART相关宏关闭,打开宏HAL_UART_USB=TRUE; 打开UART宏HAL_UART=TRUE;

读写的动作我们还是调用UART的读写函数,只是此时的函数内容已经换了。

uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)

{

#if HAL_UART_USB

HalUARTTx(buf, len);

return len;

#else

#if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0)

// UART is not enabled. Do nothing.

(void) port;   // unused argument

(void) buf;   // unused argument

(void) len;   // unused argument

#endif

return 0;

#endif

}

uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len)

{

#if HAL_UART_USB

return HalUARTRx(buf, len);

#else

#if (HAL_UART_DMA == 0) && (HAL_UART_ISR == 0) && (HAL_UART_SPI == 0)

// UART is not enabled. Do nothing.

(void) port;   // unused argument

(void) buf;   // unused argument

(void) len;   // unused argument

#endif

return 0;

#endif

}

void HalUARTPoll(void)

{

#if HAL_UART_USB

HalUARTPollUSB();

#endif

}

驱动部分的替换,我们可以根据HIDAdvRemoteDongle这个工程里的2540USB工程驱动来替换2540EB的驱动;驱动替换好后,编译没有错误出现,下一步我们就是与电脑通讯这部分了。

6d3fbd345d356c1f2e9412b63f680842.png

怎么实现USB转虚拟串口,能将数据显示在串口助手上呢?前面工程部分我们已经搞定了从设备的USB驱动,现在我们就需要在电脑上安装一个USB转虚拟串口的驱动就OK啦,驱动名为usb_cdc_driver_cc2540.inf,这个可以在安装的协议栈里找到。

这基本实现之后,后面的操作就如串口透传操作是一样的了,我们这里处理的只是接口方式的不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux系统串口透传,基于CC2540的USB虚拟串口透传方案 的相关文章

随机推荐