2014-10-29 3 views
0

Эта программа предназначена для приема и передачи данных через последовательный порт.Последовательный порт считывает неверные данные по окнам

После установки серийного номера прочитайте байты из серийного номера (я использую инструмент, называемый putty для отправки символов), если это «a», прочитайте 16 байт из файла, а затем отправьте на серийный номер, а затем прочитайте a 'b', и продолжает выпускать 'p'. всего 16 петель.

но теперь, я могу иметь первые две петель работают, когда речь идет о третьем цикле, после того, как ReadFile(), то readBuff является 50h, в то время как это то, что он считывает из последовательных в течение первых 2-х петель, как 'a', 'b'. он всегда терпит неудачу в третьем цикле.

Странно, есть ли у кого-нибудь подсказка?

hSerial = CreateFile("COM1",        
     GENERIC_READ | GENERIC_WRITE,  
     0, 
     0, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL, 
     0 
     ); 

if(hSerial==INVALID_HANDLE_VALUE){ 
    if(GetLastError()==ERROR_FILE_NOT_FOUND){ 
     printf("create serial handle file failed!-1"); 
     return 0; 
    } 
    printf("create serial handle file failed!-2"); 
    return 0; 
} 
DCB dcbSerialParams = {0}; 
dcbSerialParams.DCBlength = sizeof(dcbSerialParams); 
dcbSerialParams.fBinary = TRUE; 
dcbSerialParams.BaudRate = CBR_9600; 
dcbSerialParams.ByteSize = 8; 
dcbSerialParams.StopBits = ONESTOPBIT; 
dcbSerialParams.Parity  = NOPARITY; 
if(!SetCommState(hSerial, &dcbSerialParams)){ 
    printf("set serial state failed"); 
    return 0; 
} 
    COMMTIMEOUTS cmt; 

cmt.ReadIntervalTimeout = 1; 
cmt.ReadTotalTimeoutMultiplier = 100000000; 
cmt.ReadTotalTimeoutConstant = 100000000; 
cmt.WriteTotalTimeoutConstant = 10; 
cmt.WriteTotalTimeoutConstant = 10; 

if(!SetCommTimeouts(hSerial, &cmt)){ 
    printf("set timeout failed"); 
    return 0; 
} 
char readBuff; //read 1 byte from serial which indicate the send loop 
DWORD dwBytesRead; //number of bytes read from binary 
char writeBuff[16]; /*read 16bytes from spd binary to write to serial */ 
DWORD dwBytesWrite; /*stores actual number of bytes writen*/ 
for(int i = 0; i<=15; i++){ 
    //initial the variables to 0 incase some weird behavior 
    readBuff = 0; 
    dwBytesRead = 0; 
    dwBytesWrite = 0; 
    for(int j=0; j<=15; j++) 
     writeBuff[j] = 0; 

    if(!ReadFile(hSerial, &readBuff, 1 , &dwBytesRead, NULL)){ 
     if(dwBytesRead != 1){ 
      printf("read failed, please check!\n"); 
      return 0; 
     } 
    } 
//when it comes to the 3rd loop, readfile() reads a 50h, even if i didn't send anything to serial line. 
    if(readBuff != ('a' + i)){ 
     printf("failed the %dth loop\n", i); 
     return 0; 
    } 
    else{ 
     //read spd binary then puts to serial 

     if(fread(writeBuff, 1, 16, file) != 16){ 
      printf("read binary failed, please check!\n"); 
      return 0; 
     } 
     //send to serial 
     if(!WriteFile(hSerial, writeBuff, 16, &dwBytesWrite, NULL)){ 
      if(dwBytesWrite != 16){ 
       printf("write to serial failed, please check!\n"); 
       return 0; 
      } 
     } 
     printf("%c", readBuff); 

    } 
}//end of for loop 

ответ

2

Если сбой ReadFile вам необходимо прочитать снова, пока не найдете правильные данные. Но вместо этого вы проверяете dwBytesRead и принимаете решение продолжить, основываясь на том, что находится в этой переменной. Когда ReadFile терпит неудачу, я не буду доверять dwBytesRead, чтобы содержать допустимое значение. Предположим, что UART прочитал 1 байт, но получил ошибку переполнения/кадрирования?

Изменение программы

while(!ReadFile(...)) 
    ; 
+0

большое спасибо @Lundin, я попробовал ваше предложение, которое действительно решает проблему, я изменить программу, чтобы постоянно читать, пока она не читает то, что, как ожидается, для этого экземпляра , 'c' находится через 50 часов. хотя он все равно получает 50 часов, но теперь он может работать так, как ожидалось. –

+0

@svenwang Вы просто не можете доверять содержимому входного буфера, прежде чем ReadFile вернет true. – Lundin

+0

, хотя это не важно для меня, но 50h все еще срабатывает в третьем цикле. это действительно странно для меня, может быть, мне нужно больше узнать о том, как работает последовательный порт Windows, чтобы понять это. –

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