分类: 嵌入式
2015-01-08 15:49:03
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