为什么FT_Read()在子进程中失败但在父进程中工作?

时间:2016-02-02 21:37:33

标签: c linux fork ftdi

我有以下程序,它使用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通信,则程序会挂起{ {1}}函数,输出为:

FT_Read()

为什么会这样?

一些细节:

  • 设备中的USB芯片是出厂设置的FT240X。
  • USB设备的作用类似于回声:它收到的每个字节都会立即发回。
  • 我使用协议分析器检查传输的字节值是否正确。
  • ftd2xx库版本为1.1.12。

2 个答案:

答案 0 :(得分:2)

你所描述的内容听起来像ftd2xx库中有一个错误 - 库可能会在加载时执行一些初始化,当进程ID发生变化时它会变为无效。

ftd2xx库是封闭源代码,并且在禁止逆向工程的许可下分发,所以我无法确定是什么发生了。您可能希望尝试使用开源FTDI库,例如libftdi

答案 1 :(得分:0)

图书馆很奇怪 - 我遇到了同样的问题。对我来说,在调用fork()之后,它有助于动态加载库。请查看此帖子https://stackoverflow.com/a/7626550/907675,了解如何从库中动态加载函数。