Forum: PC-Programmierung serielle Schnittstelle SetCommState


von Christian (Gast)


Lesenswert?

Hallo Freunde,
ich möchte Daten (Zeichenketten) von meine PC zu einem µC (MSP430g2553) 
senden.
Da mein PC der eine RS232-Schnittstelle hat noch auf dem Weg zu mir ist 
benutze ich momentan ein PC mit USB->RS232 Wandler.
Mit einem Programm (Hercules) funktioniert die Kommunikation 
einwandfrei.
Allerdings möchte ich ein C-Programm verwenden, dass Daten zunächst 
einmal zum µC schickt. Wenn das dann klappt möchte ich über ein 
Echo-Programm Daten vom µC dann wieder Empfangen.

Einen Port(in meinem Fall COM15) kann ich "erstellen" und öffnen. Die 
Datei befindet sich in dem Ordner des C-Programmes.
In diese Datei kann ich auch was reinschreiben.

Problem ist wohl nur das der Befehl SetCommState nicht klappt.
Zumindestens bekomm ich den Fehler "Unable to configure the serial port"
Dies wird wohl auch der Grund sein warum der µC keine Daten Empfängt, da 
ich wohl die Bautrate und ByteSize nicht einstellen kann.

Hier mein Code:

/*******************************************
Kommunikation mit einer seriellen Schnittstelle

Win32-API
Datei öffnen      - CreateFile(...)
Datei beschreiben - WriteFile(...)
Datei lesen       - ReadFile(...)

*******************************************/

#include <stdint.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

int main (void)
{
  HANDLE hComm;
  DWORD  CtsStatus;
  DWORD dwRead;
  BOOL fWaitingOnRead = FALSE;
  OVERLAPPED osReader = {0};
  unsigned char sendBuff[255 + 1] = {0};
  int len;


//Datei öffnen - CreateFile(...)
//COM15 öffnen:
//nonoverlapped Betrieb.
  hComm =  CreateFile (TEXT("COM15"), GENERIC_READ | GENERIC_WRITE,
                       0, NULL, OPEN_EXISTING , 0, NULL);

 if(hComm==INVALID_HANDLE_VALUE)//error opening port; abort
 {
    MessageBox (NULL, TEXT("Unable to OPEN the serial port"), 
TEXT("Error"), MB_OK);
    getchar();
    return 0;
 }
 else{
    printf("opening port\n");
  }

    DCB PortDCB;
    // Initialize the DCBlength member.
    PortDCB.DCBlength = sizeof (DCB);
    // Get the default port setting information.
    GetCommState (hComm, &PortDCB);

  PortDCB.DCBlength=sizeof(PortDCB);
  PortDCB.BaudRate=CBR_9600;
  PortDCB.ByteSize=7;
  PortDCB.StopBits=ONESTOPBIT;
  PortDCB.Parity=ODDPARITY;

    //Configure the port according to the specifications of the DCB
    // structure.
    if (!SetCommState (hComm, &PortDCB))
    {
        DWORD dwError;
        // Could not configure the serial port.
        dwError = GetLastError ();
        MessageBox (NULL, TEXT("Unable to configure the serial port"), 
TEXT("Error"), MB_OK);
    }

  DWORD myBytesRead = 0;
  strcpy ((char *) sendBuff, "abc");
  len = strlen ((char *) sendBuff);

  printf("Bits gesendet: %i \n",len);
  printf("Uebertragene Daten: %s \n",sendBuff);

  WriteFile(hComm, sendBuff, len, &myBytesRead, NULL);



//Schließen den Ports
  CloseHandle (hComm);


  getchar();
   return 0;
}



Kann mir einer nen Tipp geben wieso die SetCommState nicht klappt?
Mein Betriebssystem ist übrigens Windows 8.

Danke im Vorraus!!
Christian

von Peter II (Gast)


Lesenswert?

TEXT("COM15")


das kann nicht funktionieren.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
To specify a COM port number greater than 9, use the following syntax: 
"\\.\COM10". This syntax works for all port numbers and hardware that 
allows COM port numbers to be specified.

von Peter II (Gast)


Lesenswert?

Nachtrag:
du hast also vermutlich eine Datei mit dem Namen Com15 irgendwo 
angelegt. Dort kann man dann keine Baudrate setzen.

von Christian (Gast)


Lesenswert?

"\\.\COM10" wird mir als Fehler angezeigt.

Genauso wie "\\\\.\\COM24" aus dem Bespiel:
http://www.daycounter.com/LabBook/Open-Com-Port.phtml

Ich habe ein Windows 8 PC.

von Christian (Gast)


Lesenswert?

Nachtrag:
Error: Das Argument vom Typ ""const char*"" ist mit dem Parameter vom 
Typ ""LPCWSTR"" inkomplatibel.

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:
> Nachtrag:
> Error: Das Argument vom Typ ""const char*"" ist mit dem Parameter vom
> Typ ""LPCWSTR"" inkomplatibel.

Na wie hast du denn im Originalcode den String mit dem Namen der 
SChnittstelle 'an dieser Fehlermeldung vorbeigebracht'?

Und genauso machst du das jetzt auch.
in
1
hComm = CreateFile (TEXT("COM15"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING , 0, NULL);

tauscht du den String "COM15", gegen den String "\\\\.\\COM15" aus. Das 
sollte doch wohl nicht so schwer sein.

von Christian (Gast)


Lesenswert?

Hatte mich nu an des Beispiel von Horst
Beitrag "Com Port Zugriff unter Windows 7 64 bit mit C++"
gehalten.. Der macht es wohl ohne TEXT() ??

Naja, klappt aufjedenfall!! Danke euch!!!

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:
> Hatte mich nu an des Beispiel von Horst
> Beitrag "Com Port Zugriff unter Windows 7 64 bit mit C++"
> gehalten.. Der macht es wohl ohne TEXT() ??

das kommt ganz drauf an, ob die Compilereinstellung derart ist, dass ein 
normaler String als "Wide Character String" erzeugt wird oder nicht.

Bei dir ist es das offenbar nicht. Bei ihm schon.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.