2012-04-12 5 views
0

Nach stundenlangem Stöbern und Lesen kann ich immer noch nicht herausfinden, warum mein Code nicht funktioniert. Ich habe ähnliche Code-Snippets auf verschiedenen Websites gesehen, aber ich kann es nicht funktionieren lassen. Der Schreibteil funktioniert, aber das Lesen geht schief. Auf jedes "echte Zeichen" folgen drei Null-Terminatoren. Das Schreiben einer Folge von 19 Zeichen funktioniert und das FPGA, das ich verwende, liefert die korrekten Daten auf dem Display. Der FPGA sollte die Eingabe umkehren und dieses Paket an den seriellen Port senden. Im Hyperterminal funktioniert das ohne Probleme.Serielle Kommunikation funktioniert nicht. Readfile geht schief

Kann mich jemand auf meinen Fehler hinweisen und mir sagen, was ich falsch mache?

Vielen Dank im Voraus =)

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <time.h> 
#include <commdlg.h> 
//#include <windef.h> 
#define BUFFERLENGTH 19 

void writeToSerial(char *line, HANDLE hSerial, DWORD dwBytesWritten); 
void printBuffer(char * buffRead, DWORD dwBytesRead); 


int main(){ 
    HANDLE hSerial; 
    COMMTIMEOUTS timeouts; 
    COMMCONFIG dcbSerialParams; 
    char *line, *buffWrite, *buffRead; 
    DWORD dwBytesWritten, dwBytesRead; 
    /* Create a handle to the serial port */  
    hSerial = CreateFile("COM3", 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING, 
          FILE_ATTRIBUTE_NORMAL, 
          NULL); 
    /* Check if the handle is valid */       
    if(hSerial == INVALID_HANDLE_VALUE){ 
     if(GetLastError() == ERROR_FILE_NOT_FOUND){ 
      printf("Serial port does not exist \n"); 
     }else{ 
      printf("Port occupied. Please close terminals!\n"); 
     } 
    }else{ 
     printf("Handle created\n");  
     /* Check the state of the comm port */ 
     if(!GetCommState(hSerial, &dcbSerialParams.dcb)){ 
      printf("Error getting state \n"); 
     }else{ 
      printf("Port available\n"); 
      /* Configure the settings of the port */ 
      dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb); 
      /* Basic settings */  
      dcbSerialParams.dcb.BaudRate = CBR_57600; 
      dcbSerialParams.dcb.ByteSize = 8; 
      dcbSerialParams.dcb.StopBits = ONESTOPBIT; 
      dcbSerialParams.dcb.Parity = NOPARITY; 
      /* Misc settings */ 
      dcbSerialParams.dcb.fBinary = TRUE; 
      dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_DISABLE; 
      dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_DISABLE; 
      dcbSerialParams.dcb.fOutxCtsFlow = FALSE; 
      dcbSerialParams.dcb.fOutxDsrFlow = FALSE; 
      dcbSerialParams.dcb.fDsrSensitivity= FALSE; 
      dcbSerialParams.dcb.fAbortOnError = TRUE; 
      /* Apply the settings */ 
      if(!SetCommState(hSerial, &dcbSerialParams.dcb)){ 
      printf("Error setting serial port state \n"); 
      }else{ 
      printf("Settings applied\n"); 
      GetCommTimeouts(hSerial,&timeouts); 
       //COMMTIMEOUTS timeouts = {0}; 
      timeouts.ReadIntervalTimeout = 50; 
      timeouts.ReadTotalTimeoutConstant = 50; 
      timeouts.ReadTotalTimeoutMultiplier = 10; 
      timeouts.WriteTotalTimeoutConstant = 50; 
      timeouts.WriteTotalTimeoutMultiplier= 10; 

      if(!SetCommTimeouts(hSerial, &timeouts)){ 
        printf("Error setting port state \n"); 
      }else{ 
       /* Ready for communication */ 
       line = "Something else\r"; 
       //****************Write Operation*********************// 
       writeToSerial(line, hSerial, dwBytesWritten); 
       //***************Read Operation******************// 
       if(ReadFile(hSerial, buffRead, BUFFERLENGTH, &dwBytesRead, NULL)){ 
        printBuffer(buffRead, dwBytesRead);      
       } 
      }   
      } 
     } 
    } 
    CloseHandle(hSerial); 
    system("PAUSE"); 
    return 0; 

} 
void printBuffer(char * buffRead, DWORD dwBytesRead){ 
    int j; 
    for(j = 0; j < dwBytesRead; j++){ 
     if(buffRead[j] != '\0'){  
      printf("%d: %c\n", j, buffRead[j]); 
     } 
    } 
} 

void writeToSerial(char *line, HANDLE hSerial, DWORD dwBytesWritten){ 
    WriteFile(hSerial, line, 19, &dwBytesWritten,NULL); 
    if(dwBytesWritten){ 
     printf("Writing success, you wrote '%s'\n", line); 
    }else{ 
     printf("Writing went wrong =[\n");  
    } 
} 

Antwort

0

Hyper Terminal wahrscheinlich Null-Zeichen nicht angezeigt wird, so dass es möglich ist, dass Ihr fpga tatsächlich sie sendet.

Sie könnten versuchen, es mit Br @ y Terminal im Hex-Modus zu testen, oder die Zeile mit einem Oszilloskop betrachten.

+1

In Br @ y Terminal sehe ich tatsächlich die 3 Nullzeichen, die nicht im HyperTerminal angezeigt werden. Ich kann mir das Oszilloskop nicht ansehen, da ich ein USB-Kabel verwende. Ich denke, mein Echo-Programm auf dem FPGA funktioniert dann nicht richtig, also sollte ich das beheben, bevor ich es in C arbeiten lassen kann. – JQadrad

2

In dieser Zeile:

if(ReadFile(hSerial, buffRead, BUFFERLENGTH, &dwBytesRead, NULL)) 

der buffRead Parameter ist ein uninitialised Zeiger. Ändern Sie die Deklaration zu:

+0

Vielen Dank für Ihre Antwort. Ich reserviere den Speicher jetzt vorher. 'Zeichenkette [BUFFERLENGTH]; char buffWrite [BUFFERLENGTH]; char buffRead [BUFFERLENGTH + 1]; ' aber das ändert nichts. Das Problem ist, dass ich nur BUFFERLENGTH + 1 für die Ausgabe der Seriennummer zuteile. Da es nach jedem 'echten' Zeichen das '\ 0 \ 0 \ 0' enthält, passt die Eingabe der Länge 19 nicht in den Puffer der Länge 19 + 1. Ich dachte, es würde (BUFFERLENGTH * 4) -4 char erfordern, aber das ist zu groß. Ich möchte die Null-Zeichen nachträglich korrigieren, indem ich den "Dirty Buffer" in eine neue Zeichenfolge reinige, indem ich das "\ 0" vernachlässige, aber das scheint nicht zu funktionieren. – JQadrad