Как я могу прочитать два байта в правильном порядке с последовательного порта с помощью Win32 API? - PullRequest
1 голос
/ 23 января 2011


Я использую Win32 API, Visual Studio 2008. Я могу читать байты из последовательного порта, но не так, как я предполагаю, я передаю данные из Arduino в формате X, Y. Но мой код ниже иногда читается у сначала, а потом х. Как я могу прочитать данные в правильном порядке, я имею в виду в порядке х, у. в случае, если кто-то заинтересован, координаты будут переданы другой функции, и курсор мыши будет соответственно перемещаться. Вот мой код:

int _tmain( int argc, TCHAR *argv[] )

{   
    HANDLE hComm;
    DWORD bytesRead = 0;
    POINT mouseCoords;  /*structur to hold mouse coordinates*/
    DCB dcb = {0};      /*Device Control Block, used to configure serial port settings
                          here we initialize dcb structure to zero. Good practice!*/
    COMMTIMEOUTS ct;

    int loop = 1;
    int counter = 10;

    /*get handle to serial port*/
    hComm = CreateFile(g_pcCommPort, 
                       GENERIC_WRITE | GENERIC_READ,
                       0,                           /* must be opened with exclusive-access */
                       NULL,                        /* default security attributes*/
                       OPEN_EXISTING,               /*  must use OPEN_EXISTING for serial ports*/
                       0,                           /*non overlapped I/O, blocking*/
                       NULL );                      /*hTemplate must be NULL for comm devices*/

    /*Make sure that serial port is successfuly opened*/
    if ( hComm == INVALID_HANDLE_VALUE ) {
            errMsg(TEXT("Cannot access serial port!"));
        return 0;   
    }

    ASSERT("Serial port access successful!");

    /*get serial port status i.e default settings and make
      sure we can access them*/
    if ( !(GetCommState(hComm, &dcb))) {
        errMsg(TEXT("Cannot access current DCB settings!"));
        return 0;
    }

    ASSERT("DCB settings access successful!");

    /*print dcb settings so that we can get an idea of default settings*/
    printCommSettings(dcb);


    /*Since we were successful in accessing the com port
      we can go ahead and set it manually to our desired
      settings*/
    if ( !(setupSerialPort(&dcb))) {
        errMsg(TEXT("Cannot setup serial port!"));
        return 0;
    }

    ASSERT("DCB config successful!");


    /*lets print configuration after setting up the
      serial port just to make sure everything is ok*/
    printCommSettings(dcb);

    ct.ReadIntervalTimeout = 50;
    ct.ReadTotalTimeoutConstant = 50;
    ct.ReadTotalTimeoutMultiplier = 10;
    ct.WriteTotalTimeoutConstant = 50;
    ct.WriteTotalTimeoutMultiplier = 10;

    if(SetCommTimeouts(hComm, &ct) == 0) {
         errMsg(TEXT("Cannot setup comm timout!"));
    }

while (loop) 
{
  if ( !(ReadFile(hComm,g_buffer,5,&bytesRead,NULL)) ) {    loop = 0; }
    printf("Message Read: %s==%d\r", g_buffer, bytesRead);

} /*while loop*/


    if ( !(CloseHandle(hComm))) {
        errMsg(TEXT("Serial port handle error!"));
    }

    NEWLINE;

    return 0;
}

EDIT: это настройки последовательного порта: "9600, N, 8,1"

Я передаю 10,12, и вот что я получаю: ВЫВОД:
Прочитанное сообщение:, 12
Прочитанное сообщение: 10,12
Прочитанное сообщение: 12
Прочитано сообщение: 0,12
Прочитанное сообщение: 2
Прочитанное сообщение:, 12
Прочитанное сообщение: 10,12
Прочитанное сообщение: 12
Прочитанное сообщение: 0,12
Прочитанное сообщение: 2
Прочитанное сообщение:, 12
Прочитанное сообщение: 10,12

1 Ответ

2 голосов
/ 23 января 2011

Похоже, вы выяснили, что вы не передаете два байта через последовательный порт, но на самом деле вы отправляете ASCII. И, исходя из вашего примера вывода, я не вижу Y перед X (который будет отображаться как 12,10 вместо 10,12.

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

Вам нужно синхронизировать передачу с некоторыми символами, не найденными в тексте вашего сообщения. Например, если вы отправите (10,12), вы узнаете, что ( было началом ваших номеров, а ) - концом. Таким образом, вы можете прочитать достаточно символов в вашем буфере, пока у вас не будет (, за которым следует ), затем проанализировать символы между ними и отбросить часть буфера, заканчивающуюся символом ).

...