gpt4 book ai didi

c - 为什么 FT_Read() 在子进程中失败,但在父进程中有效?

转载 作者:太空狗 更新时间:2023-10-29 11:12:54 28 4
gpt4 key购买 nike

我有以下程序,它使用 ftd2xx 库向 USB 设备写入一个字节,然后读取回复。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include "../ftd2xx.h"

void fatal (const char *format,...) {
va_list argp;
fprintf(stderr, "FATAL: ");
va_start(argp, format);
vfprintf(stderr, format, argp);
va_end(argp);
fprintf(stderr, "\n");
exit(3);
}

int main(int argc, char* argv[]) {
int pid = fork();
if (pid > 0) { //replace with: if (pid == 0) {
FT_STATUS ftStatus;
printf("before FT_OpenEx\n");
FT_HANDLE ftHandle;
if ((ftStatus = FT_OpenEx("DA011SCV", FT_OPEN_BY_SERIAL_NUMBER, &ftHandle)) != FT_OK) fatal("FT_OpenEx failed");
printf("before FT_Write\n");
uint8_t buffer[1];
buffer[0] = 0x55;
DWORD bytesWritten;
if ((ftStatus = FT_Write(ftHandle, buffer, sizeof(buffer), &bytesWritten)) != FT_OK) fatal("FT_Write failed");
printf("before FT_Read\n");
DWORD bytesRead;
if ((ftStatus = FT_Read(ftHandle, buffer, 1, &bytesRead)) != FT_OK) fatal("FT_Read failed");
if (bytesRead > 0) {
printf("FT_Read data=0x%02X\n", buffer[0]);
} else {
printf("FT_Read no data\n");
}
printf("before FT_Close\n");
if ((ftStatus = FT_Close(ftHandle)) != FT_OK) fatal("FT_Close failed");
printf("press Enter to exit\n");
}
getchar();
exit(0);
}

如图所示的代码产生以下输出:

//Output if (pid > 0)
before FT_OpenEx
before FT_Write
before FT_Read
FT_Read data=0x55
before FT_Close
press Enter to exit

但是,如果我将第一个 if 的条件从 (pid > 0) 更改为 (pid == 0),即如果我在子进程中进行 USB 通信,则程序在 FT_Read() 函数中挂起,输出为:

//Output if (pid == 0)
before FT_OpenEx
before FT_Write
before FT_Read

为什么会这样?

一些细节:

  • 设备中的 USB 芯片是出厂设置的 FT240X。
  • USB 设备就像一个回声:它接收到的每个字节都会立即发回。
  • 我用协议(protocol)分析器检查了传输的字节值是否正确。
  • ftd2xx 库版本为 1.1.12。

最佳答案

您所描述的听起来像是 ftd2xx 库中存在错误——该库可能在​​加载时执行一些初始化,当进程 ID 更改时该初始化变得无效。

ftd2xx 库是封闭源代码并根据禁止逆向工程的许可证分发,因此我无法确定发生了什么。您可能想尝试使用开源 FTDI 库,例如 libftdi , 而不是。

关于c - 为什么 FT_Read() 在子进程中失败,但在父进程中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164253/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com