首页 > 其他分享 >基于HAL库STM32F1虚拟串口(USB)通信、大端模式、结构体对齐

基于HAL库STM32F1虚拟串口(USB)通信、大端模式、结构体对齐

时间:2024-10-28 20:19:01浏览次数:7  
标签:HAL USB CDC 模式 USBD Len 串口 对齐 Buf

虚拟串口收发函数、大端模式和小端模式、结构体对齐


文章目录


前言

本文主要是在上一篇中的工程,使用虚拟串口遇到的一些问题:

  1. 在发送数据直接找到发送函数,在接受数据时,需要在接收函数中添加用户代码,进一步解析。
    2.大端模式与小端模
    3.结构体对齐,在发送不同类型数据时需要考虑。

一、发送函数

直接用函数就可以了,CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)

/**
  * @brief  CDC_Transmit_FS
  *         Data to send over USB IN endpoint are sent over CDC interface
  *         through this function.
  *         @note
  * @param  Buf: Buffer of data to be sent
  * @param  Len: Number of data to be sent (in bytes)
  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
  */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
  if (hcdc->TxState != 0){
    return USBD_BUSY;
  }
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
  result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
  /* USER CODE END 7 */
  return result;
}

二、接收函数

在接收函数int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)中加入两行代码

/**
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
  *         through this function.
  *         @note
  *         This function will issue a NAK packet on any OUT packet received on
  *         USB endpoint until exiting this function. If you exit this function
  *         before transfer is complete on CDC interface (ie. using DMA controller)
  *         it will result in receiving more data while previous ones are still
  *         not sent.
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
	
  memcpy(Receive_Data.usb_RxBuf,Buf,*Len);  //Receive_Data.usb_RxBuf定义的Buf
  Receive_Data.usb_RxLength = *Len; 	   
	
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
	
//	usb_printf("\r\n****** USB-CDC Example ******\r\n\r\n");      //
  return (USBD_OK);
  /* USER CODE END 6 */
}

一开找不到接收的Buf,无法对接收的数据进行处理,就做了上面的处理。可能是自己没有找到,有大佬知道可以告知一下,谢谢!!!

三、大端模式与小端模式

一个数据在内存中有2种存储方式:高地址存储高字节数据,低地址存储低字节数据;或者高地址存储低字节数据,低地址存储高字节数据。不同字节的数据在内存中存储顺序被称为字节序。根据字节序的不同,我们一般将存储模式分为大端模式和小端模式。

举例: a = 0x12345678;
大端模式
高地址 78 56 34 12 低地址
小端模式
高地址 12 34 56 78 低地址

当需要串口通信或者上位机接收数据时,要modbus规定的是大端模式还是小端模式,在处理数据时才能正确解析

三、结构体对齐

结构体内各成员按照各自数据的对齐模式。
结构体整体对齐方式:按照最大成员的size或者其他size的整数倍对齐。

如果使用了结构体,这里考虑结构体成员的顺序,不然发送数据个数不对,影响解析。这里参考其他大佬的帖子。

标签:HAL,USB,CDC,模式,USBD,Len,串口,对齐,Buf
From: https://blog.csdn.net/erhumiui/article/details/143311223

相关文章

  • 【STM32+HAL库】使用通用定时器生成的PWM实现呼吸灯效果
    板子:STM32F103C8仿真软件:Proteus8软件平台:cubemx+keil1新建STM32CubeMX工程1.1配置系统时钟RCC  1.2配置定时器这里用的PB3和PA15一对在TIM2中,时钟源选择内部时钟InternalClock,通道1选择PWM输出PWMGenerationCH1通道2选择PWM输出PWMGenerationCH2 ......
  • Protues的虚拟串口显示问题
    Protues的虚拟串口显示用起来比较方便,但是也有显示不出数据的问题,经研究,发现主要问题在于时钟的配置我这边的试验方式如下:CubeMx配置串口,KeilMDK编写程序,Protues显示 经常遇到虚拟仪表不能显示,或显示乱码。经研究,发现问题主要在于波特率和时钟1、波特率一定要一致(CubeMx、Ke......
  • USB协议详解第22讲(USB包-数据包及重传机制)
    USB协议详解第22讲(USB包-数据包及重传机制)1.数据包的分类数据类包有DATA0数据包、DATA1数据包、DATA2数据包、DATAM数据包。2.数据类包的组成我们今天看数据类包的详细结构,数据包的内容由PID域+数据域+16bitCRC域组成,下图为数据包各个域和抓包协议的对应图。3.数据包的功能......
  • USB协议详解第21讲(USB包-令牌类包)
    1.令牌类包的分类令牌类包有SETUP令牌包、IN令牌包、OUT令牌包。2.令牌类包的组成我们今天看令牌类包的详细结构,令牌包的内容由PID域+地址域+5bitCRC域,下图为令牌类包包各个域和抓包协议的对应图。3.令牌类包的功能所有令牌包都是主机发起的,作用就是告诉设备主机要干啥,要求......
  • USB 包的分类(令牌包这些)与USB 域的区别及关系
    USBPID类型与包类型的区分理解PID与包类型在USB协议中,PID(PacketIdentifier,包标识符)和包类型是密切相关的两个概念,但它们并不是完全相同的。PID:PID是一个8位的字段,位于每个USB数据包的头部。它明确地标识了该数据包的类型,如令牌包、数据包、握手包等。PID是USB协议中对数据包......
  • Halcon图像颜色通道拆分合并与四则运算
    读取图像并标注目标点灰度值,为后续对比做准备read_image(Image,'E:/Halcon/图片/880720666518444692.jpg')dev_set_draw('margin')dev_set_color('green')dev_get_window(WindowHandle)query_font(WindowHandle,Font)FontWithSize:=Font[0]+'-40&......
  • USB协议详解第20讲(USB包-帧首包SOF)
    USB协议详解第20讲(USB包-帧首包SOF)1.包的四种类型根据包的组成把包分为四种类型,分别是、帧首包SOF(StartofFrame)、命令包(Token)、数据包(Data)、握手包(Handshake),如下图(大家一定要把PID类型和包类型分开)。4种PID类型和4种包类型(按照组成分类)的区别如下,大家注意区分。2.SOF包组......
  • USB 3.0和USB 2.0有什么区别
    USB3.0和USB2.0有以下关键区别:1.传输速度不同;2.能耗管理不同;3.最大输出功率不同;4.向后兼容性不同;5.数据线制造成本不同。传输速度是最直接影响用户使用体验的因素之一,它的提升对于大文件的传输尤为重要。当用户需要传输高清电影、大型软件安装包或是大量照片时,USB3.0能够大幅......
  • floyd-warshall算法
    Floyd-warshall算法问题描述图的最短路径问题,多源最短路径问题求解算法思路设Dijk为从i到j的只以(1...k)集合为中间节点的最短路径的长度,Dijk=min(Dijk-1,Dikk-1+Dkjk-1)若最短路径经过点k,则Dijk=Dikk-1+Dkjk-1;若最短路径不经过点k,则Dijk=Dijk-1python......
  • Halcon 多相机统一坐标系(标定)
        多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。在计算机视觉和机器视觉领域中,多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。以gen_binocular_rectification_map(生成描述图像映射的转换图的双......