- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: serielle Schnittstelle

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    Anzeige

    E-Bike
    Oder geht es vielleicht um den c code fürden AVR ?
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  2. #12
    Gast
    Hallo Blackbird

    Ich habe fast den selben code wie du zusammengestellt zum senden.
    Bekomme es aber nicht hin die Schnittstelle auszulesen.

    konntest du mir da vieleicht helfen??

    Gruß Stefan

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    Hier ist ein funktionierender Code zum Empfangen und Senden von zeichen über die serielle Schnittstelle. Die einzelnen Code-Teile (Initialisieren, Empfangen, Senden und Schließen) sind je nach Programm/Aufgabenstelleung in einem anderen Kontext zu verwenden.
    Das Proggi hier ist nur ein Beispiel, wie man das macht.

    Code:
    // DOS32-Programm zum Senden/Empfangen von Bytes über COM2 (9600-8N1)
    // Alle empfangenen Bytes werden zurückgesendet.
    // OS: W95, W98, W98SE, WinME, WinNT, Win2000, WinXP
    // Note: Keine Fehlerbehandlung implementiert!
    #include <windows.h>
    #include <stdio.h>
    
    #define COM_BUFFER_SIZE 16       // Read- und Write-Buffer-Size
    #define BD_RATE         CBR_9600 // 9600 Baud
    
    
    int main (void)
    {
    	DCB           dcb;    
    	DWORD         iBytesWritten;
    	BOOL          bRet      = true;
    	DWORD         dwRead    = 0;
    	DWORD         dwSetMask = EV_RXCHAR | EV_ERR; 
    	DWORD         dwEvtMask; 
    	OVERLAPPED    o;
    	COMMTIMEOUTS  ct;
    	unsigned char InString[COM_BUFFER_SIZE + 1];
    
    	memset (&o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
    	o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten
    
    	HANDLE hCom = CreateFile ("COM2", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, &o);                     
    	
    	dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
    	GetCommState (hCom, &dcb);    // COM-Einstellungen holen und aendern
    	dcb.BaudRate  = BD_RATE;      // Baudrate
    	dcb.ByteSize  = 8;            // Datenbits
    	dcb.Parity    = NOPARITY;     // Parität
    	dcb.StopBits  = ONESTOPBIT;   // Stopbits
    	SetCommState (hCom, &dcb);    // COM-Einstellungen speichern
    	
    	GetCommTimeouts (hCom, &ct);
    	// Warte-Zeit [ms] vom Beginn eines Bytes bis zum Beginn des nächsten Bytes 
    	ct.ReadIntervalTimeout         = 1000 / BD_RATE * (dcb.ByteSize + 
    		                                                 (dcb.Parity == NOPARITY ? 0 : 1) + 
    																										 (dcb.StopBits == ONESTOPBIT ? 1 : 2)) * 2;
    	ct.ReadTotalTimeoutMultiplier  = 0;  // [ms] wird mit Read-Buffer-Size multipliziert
    	ct.ReadTotalTimeoutConstant    = 50; // wird an ReadTotalTimeoutMultiplier angehängt
    	ct.WriteTotalTimeoutMultiplier = 0;
    	ct.WriteTotalTimeoutConstant   = 0;
    	SetCommTimeouts (hCom, &ct);
    
    	// Zwischenspeicher des serial-Drivers einstellen (für read und write):
    	SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);
    
    	SetCommMask (hCom, dwSetMask); // Empfangssignale definieren
    
    	do  // in Endlos-Schleife auf Empfangssignale warten:
    	{
    		WaitCommEvent (hCom, &dwEvtMask, &o); // Event mit Empfangssignalen verknüpfen
    
    		if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
    		{
    			if (dwEvtMask & EV_RXCHAR) // Zeichen an RxD empfangen:
    			{
    				bRet = ReadFile (hCom, &InString, sizeof (InString), &dwRead, NULL);
    
    				if (!bRet)
    				{ // Fehlerausgabe:
    					LPVOID lpMsgBuf;
    					FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    													FORMAT_MESSAGE_FROM_SYSTEM | 
    													FORMAT_MESSAGE_IGNORE_INSERTS,
    													NULL, GetLastError(),
    													MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    													(LPTSTR) &lpMsgBuf, 0, NULL);
    					MessageBox (NULL, (LPCTSTR)lpMsgBuf, "Error: ReadFile", 
    											MB_OK | MB_ICONINFORMATION);
    					LocalFree (lpMsgBuf);
    				}
    				else
    				{ // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
    					InString[dwRead] = '\0';
    					printf (TEXT("\r\n\tRxD (%d Byte(s)): %s"), dwRead, InString);
    					WriteFile (hCom, &InString, dwRead, &iBytesWritten, &o); // Senden eines Bytes
    				}
    			}
    
    			if (dwEvtMask & EV_ERR) 
    			{
    				MessageBox (NULL, "Error empfangen", "Error: ReadFile", MB_OK);
    				break; // Schleifen-Abbruch
    			}
    		}
    	}
    	while (1);
    
    	CloseHandle (hCom);     // COM schließen
    	CloseHandle (o.hEvent); // Event-Handle zurückgeben
    
    	return (0);
    }
    Viel Spaß beim proggen.


    Blackbird

  4. #14
    Gast
    Hallo Blackbird
    Vielen dank für deine Hilfe!!!!!!!!!!!!!!!!!!!!!!

Seite 2 von 2 ErsteErste 12

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress