Как WriteFile может быть успешным без записи каких-либо данных? - PullRequest
1 голос
/ 24 февраля 2012

Я звоню WriteFile для отправки данных на модем:

BOOL writeResult = WriteFile(m_hPort, p_message, length, &numOut, NULL);

где:

  • m_hPort является действительным HANDLE
  • p_message представляет собой unsigned char*, содержащий ate0\r
  • длина представляет собой int со значением 5
  • numOut - это unsigned long, инициализированный 0

Иногда я вижу, что этот метод успешен, но numOut! = Length

Как WriteFile может вернуть успех без отправки каких-либо данных?

Редактировать Вот как я создаю дескриптор:

HANDLE hPort = CreateFileA("\\\\.\\COM5", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

Я проверил возврат, и он не INVALID_HANDLE_VALUE, что говорит о том, что он действителен.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

В конце концов, оказалось, что это аппаратная проблема.

Выключение и включение питания преобразователя очистило бы аппаратный буфер, что заставило нас подозревать, что это были проблемы с драйверами для этого устройства.По предложению Ганса мы сократили время ожидания, а затем начали более детально изучать отчеты об ошибках.

Сокращение времени ожидания до чего-то разумного означало, что мы смогли определить, что буферы заполняются до тех пор, пока они не могут «взять на себя».Больше!Вот почему выключение и включение питания преобразователя исправили его (мы попытались перенаправить питание с помощью разработки и изменения полярности, но необычно, но не решили проблему).

Основной причиной было неадекватное аппаратное управление потоком, вызывающее программное обеспечениеблокировать на неопределенный срок.Отключение управления потоком решило проблему.

1 голос
/ 24 февраля 2012

В документации говорится:

При записи в неблокирующий дескриптор канала байтового режима с недостаточным буферным пространством WriteFile возвращает TRUE с * lpNumberOfBytesWritten .

Может ли быть так, что модем работает аналогично, когда вы отправляете данные быстрее, чем можно передать?

...