[英]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.