此代码正在通过USB串行端口接收“1”或“0”。如果它是“1”,则LED打开。如果它是“0”,则LED关闭。如果我在文件“usbd_cdc_if.c”中使用以下代码,则它工作正常....
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);
if(Buf[0] == '1'){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
}
else if(Buf[0] == '0'){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
}
return (USBD_OK);
/* USER CODE END 6 */
}
但是,我想把if语句放在“main. c”文件中,而不是“usbd_cdc_if. c”文件中。
“usbd_cdc_if. c”文件:
extern char serialCopy[];
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);
memcpy(serialCopy,Buf,*Len);
return (USBD_OK);
/* USER CODE END 6 */
}
“main. c”文件:
char serialCopy[MAX_LEN];
while (1)
{
if(strcmp(serialCopy, "1") == 0){
HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET);
}
else if(strcmp(serialCopy, "0") == 0){
HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_RESET);
}
}
当尝试将变量值从“usbd_cdc_if.c”复制到“main.c”时。当我使用我的方法时,LED不工作。为什么?谢谢
2条答案
按热度按时间qncylg1j1#
您更改了代码。
Buf[0] == '1'
的含义与strcmp(serialCopy, "1") == 0
不同,因为后者假定字符串以空结尾。通过串行总线发送的字符不是以空结尾的,除非您显式发送它们。此外,从PC终端输入的字符串后面会跟一个换行符
\n
(类似 * nix的系统)或\r\n
(Windows),这意味着即使字符串正确地以空结尾,strcmp("1", "1\n");
也会失败。您应该使用调试器查看接收缓冲区中的接收数据,看看实际得到了什么。
dhxwm5r42#
已解决。问题是usbd_cdc_if. c文件中的memcpy()仅复制数据一次,但main. c文件中的循环会不断检查。需要使用全局变量....
usbd_cdc_if. c文件:
main. c文件:
现在,它起作用了。我不知道为什么我所有的尝试都不起作用。谢谢。