Почему FT_Read() терпит неудачу в дочернем процессе, но работает в родительском процессе?
У меня есть следующая программа, которая использует библиотеку 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 действует как эхо: каждый полученный байт немедленно отправляется обратно.
- Я проверил с помощью анализатора протокола, что переданные байтовые значения верны.
- Версия библиотеки ftd2xx - 1.1.12.
2 ответа
То, что вы описываете, звучит как ошибка в библиотеке ftd2xx - возможно, библиотека выполняет некоторую инициализацию при загрузке, которая становится недействительной при изменении идентификатора процесса.
Библиотека ftd2xx имеет закрытый исходный код и распространяется по лицензии, запрещающей реверс-инжиниринг, поэтому я не могу точно сказать, что происходит. Вы можете попробовать использовать библиотеку FTDI с открытым исходным кодом, такую как libftdi.
Библиотека странная - у меня была такая же проблема. Для меня это помогло загрузить библиотеку динамически после вызова fork()
, Проверьте этот пост /questions/3667885/zagruzka-razdelyaemoj-biblioteki-po-puti-vo-vremya-vyipolneniya/3667901#3667901 чтобы увидеть, как динамически загрузить функцию из библиотеки.