虚拟串口收发函数、大端模式和小端模式、结构体对齐
文章目录
前言
本文主要是在上一篇中的工程,使用虚拟串口遇到的一些问题:
- 在发送数据直接找到发送函数,在接受数据时,需要在接收函数中添加用户代码,进一步解析。
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