繁体   English   中英

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

[英]Passing a string variable from one file to another. STM32CubeIDE

此代码通过 usb 串行 com 端口接收“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 */
}

但是相反,我想在“main.c”文件而不是“usbd_cdc_if.c”文件中包含 if 语句。 所以两者看起来像这样:

“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 不工作。 为什么? 谢谢

您更改了代码。 Buf[0] == '1'strcmp(serialCopy, "1") == 0的含义不同,因为后者假定以 null 结尾的字符串。 通过串行总线发送的字符不会以 null 终止,除非您明确地这样发送它们。

此外,从 PC 终端输入的字符串后跟一个换行符\n (*nix 类系统)或\r\n (Windows)。 意思是strcmp("1", "1\n"); 即使字符串正确地以 null 终止,也会失败。

您应该使用调试器在 rx 缓冲区中查看接收到的数据,以查看您实际得到了什么。

解决了。 问题是 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);
    }
}

现在,它正在工作。 我不确定为什么我的所有尝试都不起作用。 谢谢你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM