Моделирование устройства на COM-порту - PullRequest
3 голосов
/ 22 марта 2012

У меня есть устройство, которое отправляет данные в COM-порт.И я хотел бы смоделировать это устройство, когда оно не подключено. Я подумал, что это можно сделать, просто отправив данные на определенный COM-порт:

int main() {
    char *port = "\\\\.\\COM40";

    HANDLE hCom = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom==INVALID_HANDLE_VALUE) return 0;

    DWORD writeBytes;
    int buffer = 0xDEADBEAF;
    BOOL success = WriteFile(hCom, &buffer, 4, &writeBytes, NULL);

    FlushFileBuffers(hCom);
    Sleep(1000);

    HANDLE hCom2 = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom2==INVALID_HANDLE_VALUE) return 0; // Exit. GetLastError() == 5

    DWORD readBytes;
    success = ReadFile(hCom2, &buffer, 4, &readBytes, NULL);

    CloseHandle(hCom);
    CloseHandle(hCom2);
    return 0;
}

К сожалению, это не работает, и второй CreateFile() устанавливает последнюю ошибку на ERROR_ACCESS_DENIED.Чего мне не хватает?

Ответы [ 4 ]

5 голосов
/ 22 марта 2012

Для симуляции установите драйвер виртуального COM-порта, например com0com . Затем вы можете определить 2 COM-порта, которые связаны в драйвере. Аппаратное обеспечение не требуется. Все, что записано в один порт, доступно для чтения на другом порту. Затем вы можете открыть дескриптор для каждого порта с отдельными вызовами CreateFile ().

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

0 голосов
/ 22 марта 2012

вы можете использовать два разных COM-порта для этого теста. используйте один в качестве симулятора устройства, а другой - в качестве хост-системы, получающей данные. Для этого вам не нужно дважды CreateFile на одном и том же порту.

0 голосов
/ 22 марта 2012

Последовательный порт не является каналом IPC.Если вы хотите петлю, это либо должно быть смоделировано в драйвере, либо вы должны включить аппаратный режим петли.Я думаю, что драйвер препятствует открытию двух дескрипторов на устройстве, несмотря на то, что флаги общего доступа переданы CreateFile.(Мне никогда не удавалось заставить два последовательных приложения в Windows открывать один и тот же последовательный порт.)

http://msdn.microsoft.com/en-us/library/ms810467.aspx

Я не вижу никаких флагов в DCBструктура для настройки обратной петли, хотя чипы, такие как 16550 UARTS, имеют такую ​​возможность.

Таким образом, это внешняя петлевая петля через нуль-модемный кабель.

0 голосов
/ 22 марта 2012

Нельзя отправлять сообщения через последовательный порт, дважды открыв один и тот же порт.Последовательный порт имеет два разных физических провода, один для передачи и один для приема.Если к порту ничего не подключено, эти два провода не идут никуда, и сигналы не переходят автоматически от одного к другому.соединяет контакты TX и RX вместе и получает те же байты, которые вы пишете.Это физический компонент, но вы не можете сделать это только программно (ну, если вы не создали драйвер COM-порта «петлевого устройства», который даже не требует взаимодействия с оборудованием).и физический ключ, и петлевой драйвер получить не сложно.

...