Oder geht es vielleicht um den c code fürden AVR ?
Druckbare Version
Oder geht es vielleicht um den c code fürden AVR ?
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
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.
Viel Spaß beim proggen.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);
}
Blackbird
Hallo Blackbird
Vielen dank für deine Hilfe!!!!!!!!!!!!!!!!!!!!!!