原创 stm32 HAL usb cdc 发送和接收

2017-4-26 07:55 3470 3 3 分类: MCU/ 嵌入式

使用stm32cubemx 可以快速生成工程。对于connective 系列带USB接口的单片机,可以将其配置成USB device CDC设备。这样在WINDOWS系统中,连接USB,板子被识别成一个串口。可以进行串口通信。从单片机发送数据比较简单,只要使用 CDC_Transmit_FS函数即可。

如下,将需要输出的数据格式化成temp字符串,然后调用函数发送出去就行了。

sprintf((char)temp,"%4d,",i);
CDC_Transmit_FS(temp,strlen(temp));
从PC机接收数据,一直没有找到接收的函数。
不过找到一个折衷的办法。
那就是改写一下CDC_Receive_FS 函数。这个函数是CDC设备在接收到数据后,自动运行的。 Buf 指向收到的数据,Len则指向收到数据数量。
static int8_t CDC_Receive_FS (uint8_t
Buf, uint32_t Len)
{
/
USER CODE BEGIN 6 /
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/
USER CODE END 6 /
}

定义一个全局变量
#define BUFSIZE 64
uint8_t
pRx[BUFSIZE ]; //这个准备指向接收到的数据缓冲区
uint32_t RxLen; //这个是收到的数据数量

改写函数如下:
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t Len)
{
/
USER CODE BEGIN 6 /
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
RxLen =
Len;
memcpy(pRx,buf,RxLen);
return (USBD_OK);
/* USER CODE END 6 /
}

在接收程序中,判断RxLen 如果不为0,说明接收到数据。从
pRx取到数据。
不知道有没有其它方法?


作者: southcreek, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-408807.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
相关推荐阅读
southcreek 2020-06-14 08:35
2020-06-14
需要有大量的按键的地方,可以使用行列式键盘。为简化设置,可以把行线与列线直接连到MCU口线上。当然也可以使用专门的芯片。行列式键盘可以用较少的口线完成很多按键的识别。常规的驱动方式是:将行设置成输出,...
southcreek 2020-05-29 16:01
使用查询状态方式的LORA应用编程
厂家提供的例程,OnMaster OnSlave 结构完全一样。 void OnMaster( void ) {     uint8_t i; &nb...
southcreek 2020-05-10 15:09
DMA输入捕获红外线解码
DMA 方式,TIM输入捕获,红外线解码 当前系统时钟为48MHz 将预分频到0.1mS 也就是除4800。 DMA 打开,设置为存储器增加。模式可以用线性模式,更加方便。 定义一个...
southcreek 2019-12-18 09:31
STM32DAC 输出控制
输出可以选择输出缓冲或不缓冲。  sConfig.DAC_Trigger = DAC_TRIGGER_NONE;  sConfig.DAC_OutputBuff...
southcreek 2018-07-06 16:54
输液泵注射泵喇叭图的理解和生成
以下是9706.27上的定义:流速 r 由操作者选择的输液速度流量 flow 单位时间内测得的输出容量丸剂 bolus 作为一次注人但不属于灌注程序的一部分,在短时间内传输的液体的离散量。取样间隔 5...
southcreek 2017-06-15 11:29
STM32 输出多路不同频率的脉冲
一个定时器产生多个频率输出 使用一个tim产生20KHz的定时中断。将需要输出的速度设定好,每次将设定的速度与上一次的结果取模累加,结果大于等于10000则取反输出。 每个通道使用一个结构体,里面包含...
广告
我要评论
0
3
广告
关闭 热点推荐上一条 /5 下一条