2008-11-09 3 views
1

У меня очень странная проблема, которую я не могу понять. К сожалению, я даже не знаю, как описать это, не описывая мое приложение. То, что я пытаюсь сделать, это:sprintf() и WriteFile() влияющие на строку Buffer

 
1) read a byte from the serial port 
2) store each char into tagBuffer as they are read 
3) run a query using tagBuffer to see what type of tag it is (book or shelf tag) 
4) depending on the type of tag, output a series of bytes corresponding to the type of tag 

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

линии являются две линии в самом низу:

sprintf(buf,"%s!\n", tagBuffer); 
    WriteFile(hSerial,buf,strlen(buf), &dwBytesWritten,&ovWrite); 

Если я пытаюсь удалить их, «tagBuffer» будет хранить только последний символ, как противостоять быть буфером. То же самое со следующей строкой, WriteFile().

Я думал, что sprintf и WriteFile являются функциями ввода/вывода и не влияют на переменные. Я застрял, и мне нужна помощь, чтобы исправить это.

//keep polling as long as stop character '-' is not read 
while(szRxChar != '-') 
{ 
    // Check if a read is outstanding 
    if (HasOverlappedIoCompleted(&ovRead)) 
    { 
     // Issue a serial port read 
     if (!ReadFile(hSerial,&szRxChar,1, 
       &dwBytesRead,&ovRead)) 
     { 
      DWORD dwErr = GetLastError(); 
      if (dwErr!=ERROR_IO_PENDING) 
       return dwErr; 
     } 
    } 

    // resets tagBuffer in case tagBuffer is out of sync 
    time_t t_time = time(0); 
    char buf[50]; 
    if (HasOverlappedIoCompleted(&ovWrite)) 
    { 
     i=0;          
    } 

    // Wait 5 seconds for serial input 
    if (!(HasOverlappedIoCompleted(&ovRead))) 
    { 
     WaitForSingleObject(hReadEvent,RESET_TIME); 
    } 

    // Check if serial input has arrived 
    if (GetOverlappedResult(hSerial,&ovRead, 
      &dwBytesRead,FALSE)) 
    { 
     // Wait for the write 
     GetOverlappedResult(hSerial,&ovWrite, 
      &dwBytesWritten,TRUE); 

     if(strlen(tagBuffer) >= PACKET_LENGTH) 
     { 
      i = 0; 
     } 

     //load tagBuffer with byte stream 
     tagBuffer[i] = szRxChar; 
     i++; 
     tagBuffer[i] = 0; //char arrays are \0 terminated 

     //run query with tagBuffer 
     sprintf(query,"select type from rfid where rfidnum=\""); 
     strcat(query, tagBuffer); 
     strcat(query, "\""); 
     mysql_real_query(&mysql,query,(unsigned int)strlen(query)); 

     //process result and send back to handheld 
     res = mysql_use_result(&mysql); 
     while(row = mysql_fetch_row(res)) 
     { 
      printf("result of query is %s\n",row[0]); 

      string str = ""; 
      str = string(row[0]); 

      if(str == "book") 
      { 
       WriteFile(hSerial,BOOK_INDICATOR,strlen(BOOK_INDICATOR), 
       &dwBytesWritten,&ovWrite); 
      } 
      else if (str == "shelf") 
      { 
       WriteFile(hSerial,SHELF_INDICATOR,strlen(SHELF_INDICATOR), 
       &dwBytesWritten,&ovWrite); 
      } 
      else //this else doesn't work 
      { 
       WriteFile(hSerial,NOK,strlen(NOK), 
       &dwBytesWritten,&ovWrite); 
      } 
     } 


     mysql_free_result(res); 

     // Display a response to input 
     //printf("query is %s!\n", query); 
     //printf("strlen(tagBuffer) is %d!\n", strlen(tagBuffer)); 

     //without these, tagBuffer only holds the last character 
     sprintf(buf,"%s!\n", tagBuffer); 
     WriteFile(hSerial,buf,strlen(buf), &dwBytesWritten,&ovWrite); 

    } 
} 

С этими двумя линиями, мой результат выглядит следующим образом: ы ш она Shel полка shelf0 shelf00 BOOKCODE shelf0001

Без них, я понял, что tagBuffer и Buf сохраняет только самый последний символ в любое время.

Любая помощь абсолютно будет признательна. Благодарю.

+0

Где и как вы определяете tagBuffer? – 2008-11-09 07:59:57

+0

char tagBuffer [8]; // содержит идентификатор тега int i = 0; // index для tagBuffer – Steve 2008-11-09 08:04:56

ответ

1

Где вы указываете tagbuffer, насколько он большой?
Возможно, вы переписываете «buf», потому что вы пишете конец конца тегабуфера.

1

Кажется маловероятным, что эти две линии повлияют на правильную программу - возможно, вы не выделили достаточное пространство в buf для всей длины строки в tagBuffer? Это может вызвать переполнение буфера, которое маскирует реальную проблему?

1

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

Здесь очень маловероятно, что sprintf() и WriteFile() изменят состояние переменной массива «buf». Однако эти две строки тестового кода записываются в «hSerial», в то время как ваш основной цикл также читается из «hSerial». Это похоже на рецепт для изменения поведения вашей программы.

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

0

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

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

Это может показаться более сложным, чем ваш текущий дизайн, но на самом деле это не так, как объясняет Newcomer.

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^