c - 使用 USB CDC (STM32) 发送数据
问题描述
我正在使用 NucleoF413ZH 和 STM32CubeIDE。我有 16 个麦克风,每个都连接到一个 ADC 通道,并且由于使用了 DMA,它可以将数据定向到内存。但是,我想对信号进行互相关,所以我得出的结论是我会将数据发送到 PC 或 RPi 4b,然后我会在那里进行计算。但对我来说,问题是从内存中发送了如此多的数据。我尝试使用 CDC_TRANSMIT_FS 但我无法发送所有 16 个通道的测量值,而且传输速度也很慢。有没有办法发送 16 个元素的整个数组,甚至更好的 16xM 元素,所以它可能会更快?我需要 16mic x10bit x44.1khz ~= 7Mbit/s =882KBytes/s,我也可以将一些麦克风减少到 12 个。这是我的代码(完整链接https://pastebin.pl/view/6059edc8):
另外,如果语法不好,对不起,英语是我的第二语言,我还在学习
/* USER CODE BEGIN PV */
uint16_t Pomiar[16]; // measurments 16x1
char msg[10];
uint8_t DataToSend[40]; //
uint8_t MessageCounter = 0; //
uint8_t MessageLength = 0; // Msg lngth
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1, (uint16_t*)Pomiar, 16);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// CDC_Transmit_FS((uint8_t*)Pomiar, (512));
//++MessageCounter;
//MessageLength = sprintf(DataToSend, "Wiadomosc nr %d\n\r", MessageCounter);
// MessageLength = sprintf(DataToSend, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n\r", Pomiar[0],Pomiar[1],Pomiar[2],Pomiar[3],Pomiar[4],Pomiar[5],Pomiar[6],Pomiar[7],Pomiar[8],Pomiar[9],Pomiar[10],Pomiar[11],Pomiar[12],Pomiar[13],Pomiar[14],Pomiar[15]);
MessageLength = sprintf(DataToSend, "%d:%d:%d:%d\n\r", Pomiar[0],Pomiar[1],Pomiar[2],Pomiar[3]);
CDC_Transmit_FS(DataToSend, MessageLength);
//HAL_Delay(1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
usart 设置
static void MX_USART3_UART_Init(void)
{
/* USER CODE BEGIN USART3_Init 0 */
/* USER CODE END USART3_Init 0 */
/* USER CODE BEGIN USART3_Init 1 */
// huart3.Init.BaudRate = 115200;
/* USER CODE END USART3_Init 1 */
huart3.Instance = USART3;
// huart3.Init.BaudRate = 115200;
huart3.Init.BaudRate = 921600;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART3_Init 2 */
/* USER CODE END USART3_Init 2 */
}
解决方案
sprintf
速度非常慢,并且每个 ADC 样本都发送 ASCII 5 位数字。您可以为每个样本发送 2 个字节的原始十六进制数据,以像这样节省带宽
CDC_Transmit_FS(Pomiar, sizeof(Pomiar));
推荐阅读
- windows - Pygame的窗口打开而不是立即关闭,为什么?
- java - tycho surefire 的附加捆绑包
- android - Kotlin Jacoco 覆盖未显示 Android 中的静态方法(伴侣)
- python - 方法中的参数过多错误,只有一个必需参数
- javascript - 进行开玩笑测试时脚本(从脚本标签调用)不可用
- c - CHIP-8 模拟器无法按预期呈现图形
- python-3.x - 如何在keras中使用evaluate_generator?
- php - 按下按钮时调用控制器
- awk - 在整行中搜索模式并在同一行中添加一个单词
- docker - Docker push nexus private repo 失败,413 Request Entity Too Large