将字符串变量从一个文件传递到另一个文件,STM32CubeIDE

flseospp  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(123)

此代码正在通过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不工作。为什么?谢谢

qncylg1j

qncylg1j1#

您更改了代码。Buf[0] == '1'的含义与strcmp(serialCopy, "1") == 0不同,因为后者假定字符串以空结尾。通过串行总线发送的字符不是以空结尾的,除非您显式发送它们。
此外,从PC终端输入的字符串后面会跟一个换行符\n(类似 * nix的系统)或\r\n(Windows),这意味着即使字符串正确地以空结尾,strcmp("1", "1\n");也会失败。
您应该使用调试器查看接收缓冲区中的接收数据,看看实际得到了什么。

dhxwm5r4

dhxwm5r42#

已解决。问题是usbd_cdc_if. c文件中的memcpy()仅复制数据一次,但main. c文件中的循环会不断检查。需要使用全局变量....
usbd_cdc_if. c文件:

uint8_t newVariable = 0;

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  newVariable = Buf[0];
  return (USBD_OK);
}

main. c文件:

extern uint8_t newVariable;

while (1)
{
    if(newVariable == '1'){
        HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET);
    }
    else if(newVariable == '0'){
        HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_RESET);
    }
}

现在,它起作用了。我不知道为什么我所有的尝试都不起作用。谢谢。

相关问题