2017-11-01 7 views
0

Ich möchte binäre Daten von meinem PC zu meinem Mikrocontroller über die reale serielle Schnittstelle in meinem Computer übertragen. Zu diesem Zeitpunkt denke ich über die Verwendung von INB- und OUTB-Funktionen nach, damit ich Linux-tty-Zeichen nicht außer Kraft setzen muss.Baudrate von inb und outb Befehlen - linux

Frage ist, wie konfiguriere ich die Baudrate der seriellen Schnittstelle, wenn ich seine Adresse mit den INB und OUTB Funktionen verwende? Zum Beispiel, wenn ich auf COM1 (0x3F8) schreiben möchte, wie kann ich feststellen, dass die Daten der Baudrate geschrieben werden?

Hat Stty noch eine Art Hintergrundkontrolle mit INB und OUTB oder setserial oder was?

+2

„* Zu dieser Zeit, ich bin der Verwendung von INB und OUTB Denken Funktionen, damit ich nicht mit Linux tty Zeichenüberschreibungen setzen *.“ Sie machen Dinge * viel * komplizierter ohne guten Grund. Einen Port in den Rohmodus zu setzen ist trivial. –

+0

Wenn Sie diesen Bare Metal, auf DOS, usw. machen, dann lesen Sie einfach die Dokumentation. Aber du hast Linux getaggt, also benutzt du einfach die API-Aufrufe, um mit dem Uart umzugehen. –

Antwort

1

Zu diesem Zeitpunkt denke ich über die Verwendung von INB und OUTB Funktionen, so dass ich nicht mit Linux tty Zeichen überschreiben muss.

Dies ist eine schreckliche, nicht gut, sehr schlechte Idee, und es wird nicht funktionieren. Die vorhandenen seriellen Treiber werden sehr verwirrt, wenn Sie versuchen, die Portkonfiguration unter ihnen zu ändern.

Use standard UNIX APIs to interact with the serial port. Es ist nicht schwer.

0

Duskwuff hat natürlich Recht. Warum Low-Level und nicht die API verwenden?

Siehe http://www.tldp.org/HOWTO/text/IO-Port-Programming Abschnitt 6.3:

Wenn das Gerät Sie sprechen unterstützt so etwas wie RS-232, sollten Sie die serielle Schnittstelle verwenden können, um es zu sprechen. Der Linux serielle Treiber sollte für fast alle Anwendungen ausreichen (Sie sollten nicht den seriellen Port direkt programmieren müssen, und Sie würden wahrscheinlich einen Kernel-Treiber schreiben müssen, um es zu tun); es ist ziemlich vielseitig, so mit nicht-Standard-bps-Raten und so weiter sollte kein Problem sein.

Um dies zu veranschaulichen, hier die Antwort auf die ursprüngliche Frage ist „wie die Baudrate einstellen“:

Neben dem Port (zB 0x3F8 für COM1), die nächsten Portnummern verwendet werden, für verschiedene Kontrollzwecke. Um die Baudrate einzustellen, berechnen Sie zuerst den Divisor 115200/[gewünschte Baudrate]. Z.B. wenn Sie 38400 Baud wollen, ist der Divisor 3. Dann:

  • Stellen Sie die höchste Bit PORT + 3
  • senden das niedrigstwertige Byte des Divisors PORT
  • senden das höchstwertige Byte von der Divisors PORT + 1
  • Clear + das höchste Bit von PORT 3 (zur gleichen Zeit können die unteren Bits der Parität eingestellt werden, Stopbits usw.)

In Code:

outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) 
    outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud 
    outb(PORT + 1, 0x00); //     (hi byte) 
    outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit 

Quelle ist hier: http://wiki.osdev.org/Serial_Ports

Verwandte Themen