Запись на последовательный (Com) порт в Visual C ++ - PullRequest
1 голос
/ 23 сентября 2009

У меня есть устройство, которое подключено к порту COM4 (115200 бод, 8-N-1). На основании примеров, которые я нашел здесь я открываю порт с помощью:

                    Keyboard_Handle=CreateFile("\\\\.\\COM4",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); 
                    if(GetLastError() !=0 || Keyboard_Handle == INVALID_HANDLE_VALUE)
                    {
                        AfxMessageBox("Error opening connection to Keyboard");
                        exit(1);
                    }


                    char buffer[100];
     strcpy(buffer,"baud=115200 parity=N data=8 stop=1");
     BuildCommDCB((char*)&buffer,&dcb)) 

     if(GetCommState(Keyboard_Handle, &dcb))
     {
      dcb.BaudRate = CBR_115200;
      dcb.ByteSize = 8;
      dcb.Parity = 0;
      dcb.StopBits = 1;
      SetCommState(Keyboard_Handle, &dcb);
     } 


Позже в моем коде я вызываю WriteFile для порта с:

    LPDWORD bytes_written;
    LPDWORD bytes_read;
    LPOVERLAPPED OVERLAP;
    char write_buf[10];

    write_buf[0] = 's';
    write_buf[1] = '\0';

    if(Keyboard_Handle != NULL) {
    WriteFile(Keyboard_Handle, (LPCVOID)write_buf , strlen(write_buf), bytes_written, OVERLAP); 
    }

И каждый раз, когда я запускаю код, я получаю отладчик JIT с жалобой на необработанное исключение (хотя WriteFile находится внутри блока Try / catch).

Что-то не так с тем, как я это делаю?

Ответы [ 2 ]

8 голосов
/ 23 сентября 2009

bytes_written должен быть адресом переменной; компилятор не скомпилирует опубликованное вами заявление.

Аналогично, "OVERLAP" не имеет смысла.

Вы проверили, удалось ли CreateFile?

Что в write_buf, когда вы звоните strlen на это?

Попробуйте скопировать и вставить фактический код, который вы используете.

Кроме того, это не похоже на очень хороший / информативный образец, который вы используете. Попробуйте Программирование последовательного порта Windows и http://msdn.microsoft.com/en-us/library/ms810467.aspx

Также начните с примера программы с сайта Microsoft, протестируйте ее перед изменением (чтобы убедиться, что она работает на вашем компьютере) и затем измените ее.

0 голосов
/ 23 сентября 2009

При вызове SetCommState возвращается ли значение 0? Это может быть ошибка, которая может вызвать больше проблем.

Кроме того, вы пошагово проходили строку за строкой, чтобы убедиться, что именно вызов WriteFile приводит к сбою?

Наконец, у вас может быть какое-то антивирусное или другое программное обеспечение, которое может вызывать эти проблемы (ищите неизвестные dll, загруженные в ваш список модулей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...