У меня очень странная проблема, которую я не могу понять. К сожалению, я даже не знаю, как описать это, не описывая мое приложение. То, что я пытаюсь сделать, это: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 сохраняет только самый последний символ в любое время.
Любая помощь абсолютно будет признательна. Благодарю.
Где и как вы определяете tagBuffer? – 2008-11-09 07:59:57
char tagBuffer [8]; // содержит идентификатор тега int i = 0; // index для tagBuffer – Steve 2008-11-09 08:04:56