回复: 101
在MINI STM32 板子上实现USB虚拟串口
电梯直达
发表于 2011-6-27 06:51:45
|
只看该作者
|倒序浏览
|阅读模式
(原文件名:A6.jpg)
实验内容:通过STM32的USB端口在PC上虚拟一个COM口,当虚拟成功后,可通过串口调试软件
发送控制命令,去点亮板子上相应的LED灯,同时输出调试信息。
工程文件:点击此处下载 ourdev_652561TEJV6B.zip(文件大小:909K) (原文件名:虚拟串口.zip)
在PC机的设备管理器中可看到虚拟出的COM口
(原文件名:A14.JPG)
串口调试软件的输出状态
(原文件名:虚拟串口.JPG)
通过这个实验,可以扩展更多的通过USB端口的应用。最主要是它简单跟上位机通讯,直接可以用串口
调试软件,或者超级终端。有兴趣的网友可以再继续研究下。
当前离线
精华汤圆中级会员
{*}
(303311828)
发表于 2011-6-27 08:17:02
|
只看该作者
这个不错
STM32还没用过USB
积分
精华汤圆新手上路
{*}
(303196308)
发表于 2011-6-28 16:22:22
|
只看该作者
楼主方便的话一起讨论关于USB虚拟串口的问题,已经纠结了一个星期了,问题是:怎么通过STM32103来产生一个CTS和DSR的信号给我们的PC上位机啊?急~~~~~~~~联系:414813968
楼主|
发表于 2011-6-28 19:20:43
|
只看该作者
我目前主要是通过USB的发送端和接收端,来交换数据的。在下位机没有涉及到串行通讯。这个实验之所以叫USB虚拟串口,只是上位机给用COM口的形式,通过USB这个硬件层,来收发数据的。
发表于 2011-7-11 18:11:07
|
只看该作者
回复【楼主位】jiaxinhui
-----------------------------------------------------------------------
用你的例子改了一下。。但是我的下位机接不到上位机的数是怎么回事?!下位机给上位机发数可以收到。。。那个函数是接受上位机的数的函数哦?!
发表于 2011-7-11 18:35:28
|
只看该作者
mark
发表于 2011-7-11 18:45:14
|
只看该作者
要装驱动吗?
楼主|
发表于 2011-7-11 20:04:12
|
只看该作者
回复【6楼】pengchhui
-----------------------------------------------------------------------
驱动要装的
(302050131)
发表于 2011-7-11 22:45:19
|
只看该作者
USB 学习
发表于 2011-7-12 20:52:17
|
只看该作者
回复【楼主位】jiaxinhui
-----------------------------------------------------------------------
我已经成功移植你的程序。。。谢谢楼主的指点了。。小弟还有一事相求。。就是我在单独调试串口的时候怎么上位机用串口调试工具收到的是乱码啊,不是我想发的0x43?!
我的代码如下:
#include "stm32f10x.h"
#include "stm32_eval.h"
#include
USART_InitTypeDef USART_InitStructure;
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
static void Delay_ARMJISHU(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
int main(void)
{
GPIO_Config();
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure );
USART_Cmd(USART1, ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
while (1)
{
USART1->DR=0x43;
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
Delay_ARMJISHU(10000);
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
(301964372)
发表于 2011-7-12 22:34:38
|
只看该作者
记号
发表于 2011-7-13 08:39:58
|
只看该作者
路过学习
楼主|
发表于 2011-7-13 09:44:03
|
只看该作者
波特率设置的对吗?
发表于 2011-7-13 12:28:29
|
只看该作者
回复【楼主位】jiaxinhui
-----------------------------------------------------------------------
我用的是您的USB虚拟串口的例子,程序已经调通了,谢谢了,可以发送“STM32Vrtual”用上位机串口调试工具能接受到“STM32Vrtual”了,
但是我想发送一个十进制的数组a[5]={1,2,3,4,5};却不知道怎么定义,发送函数USB_Send_Data只能发送unsigned char型的数据,我应该怎么改程序啊?!
void USB_Send_Data(u8* data_buffer)
{
count_in=60;
UserToPMABufferCopy(data_buffer, ENDP1_TXADDR, count_in);
SetEPTxCount(ENDP1, count_in);
SetEPTxValid(ENDP1);
}
int main(void)
{
Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while (1)
{
USB_Send_Data("STM32Vrtual\r\n");
}
}
(301908115)
发表于 2011-7-13 14:12:15
|
只看该作者
void USB_Send_Data(u8* data_buffer, u8 len)
{
count_in=len;
UserToPMABufferCopy(data_buffer, ENDP1_TXADDR, count_in);
SetEPTxCount(ENDP1, count_in);
SetEPTxValid(ENDP1);
}