Skip to content
/ uart Public

UART (Universal Asynchronous Receiver Transmitter)

License

Notifications You must be signed in to change notification settings

iotkitv3/uart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UART (Universal Asynchronous Receiver Transmitter)


Home

Das untere Diagramm zeigt die dazu invertierten Spannungspegel auf der RS-232-Schnittstelle. Quelle Wikipedia


Universal Asynchronous Receiver Transmitter, kurz UART, ist eine elektronische Schaltung, die zur Realisierung digitaler serieller Schnittstellen dient. Dabei kann es sich sowohl um ein eigenständiges elektronisches Bauelement (ein UART-Chip bzw. -Baustein) oder um einen Funktionsblock eines höherintegrierten Bauteils (z. B. eines Mikrocontrollers) handeln.

Eine UART-Schnittstelle dient zum Senden und Empfangen von Daten über eine Datenleitung und bildet den Standard der seriellen Schnittstellen an PCs und Mikrocontrollern. Auch im industriellen Bereich ist die Schnittstelle mit verschiedenen Interfaces (z. B. RS-232 oder EIA-485) sehr verbreitet.

Die Daten werden als serieller digitaler Datenstrom mit einem fixen Rahmen übertragen, der aus einem Start-Bit, fünf bis maximal neun Datenbits, einem optionalen Parity-Bit zur Erkennung von Übertragungsfehlern und einem Stopp-Bit besteht. Um dem Empfänger eine Synchronisationszeit auf den Takt der empfangenen Daten einzuräumen, kann das Stopp-Bit auf das 1,5 oder 2-fache der normalen Übertragungszeit eines Bits verlängert werden. Das wird als 1,5 bzw. 2 Stopp-Bits bezeichnet.

In einfachen Mikrocontroller-Systemen werden Daten häufig über UART-Schnittstellen ausgetauscht, die ohne Handshake, nur über Rx und Tx, verwirklicht sind. Diese für kurze Entfernungen geeignete, auch CMOS-UART bzw. TTL-UART genannte Implementierung wird von praktisch allen Mikrocontrollern unterstützt und kann bei entsprechend geringen Übertragungsraten auch über Software realisiert werden.

Um den CMOS-UART bzw. TTL-UART Pegel für den USB Bus verfügbar zu machen, kann ein USB Serial Adapter verwendet werden. Boards haben diesen, in der Regel, integriert (mbed - Ja, Arduino UNO - Ja, Arduino Mini - Nein )

Die Standardeinstellungen für den Seriellen Port (USB) sind 9600 baud, 8 bits, 1 stop bit, no parity (aka 9600-8-N-1).

Um Daten auf die Serielle Schnittstelle auszugeben, sind keine zusätzlichen Objekte erforderlich. Die Serielle Schnittstelle wird automatisch geöffnet und Daten können mittels printf ausgegeben und mittels scanf ausgelesen werden.

Anwendungen

  • Ausgabe von Debug Informationen
  • Fernsteuerung des Gerätes z.B. wie bei 3D Druckern
  • Board - PC Kommunikation
  • Ansprechen von Modems wie Bluetooth, WLAN, GPS

Beispiele

Für die Beispiele muss mbed Studio oder ein Terminalemulations Programm (siehe Links) und für Windows 10, zusätzlich ein Treiber installiert werden.

Die Konfiguration und der Firmware Update des ESP8266 WLAN Modems ist weiter unten beschrieben.

Demonstriert die verschiedenen Ausgabemöglichkeiten mit printf.

Serielle Eingabe

Demonstriert die verschiedenen Eingabemöglichkeiten mit scanf.

main.cpp
#include "mbed.h"

int i;
float f;
char s[6];      // max. 5 Zeichen + \0

int main()
{
    printf  (" Eingabe int: " );
    scanf   ( "%d", &i );
    // Integer: Standard, genau 4-stellig, 4-stellig mit Vornullen
    printf  ( "\nint %d, %4d, %04d\n", i, i, i );

    printf  ( "Eingabe float: " );
    scanf   ( "%f", &f );
    // float: Standard, Vor-/Nachkommastellen gerundet
    printf  ( "\nfloat %f, %4.2f\n", f, f );

    printf  ( "Eingabe string (max 5 Zeichen): " );
    scanf   ( "%5s", s );
    // String: Standard, mit Anzahl der auszugebenden Zeichen
    printf  ( "\nstring %s, %.*s\n", s, 3, s );

    //////////////////// String nach Integer, Float
    char sint[] = "123";
    char sfloat[] = "1.235";

    sscanf  ( sint, "%d", &i );
    printf  ( "int %d\n", i );

    sscanf  ( sfloat, "%f", &f );
    printf  ( "float %f\n", f );

    /////////////////// Parsen z.B. von HTTP Adressen mit Parametern
    // http://<IP-Adresse>/?servo1=0.5&servo2=0.1 scannen. sscanf liefert die Anzahl erkannter %f Argumente
    char addr[] = "GET /?servo1=0.1&servo2=0.9";
    float s1, s2;

    // sscanf liefert die Anzahl erkannten Argumente
    if  ( sscanf( addr, "GET /?servo1=%f&servo2=%f", &s1, &s2 ) == 2 )
        printf  ( "Servo1 %f, Servo2 %f\n", s1, s2 );
}

WLAN Modem ESP8266 lowlevel

Ansprechen des ESP8266 WLAN Modems via AT-Befehlen (nur IoTKit K64F Board). Nicht getestet!

main.cpp
/** ESP 8266 WLAN Modem initialisieren 
 *  - muss als erstes erfolgen, damit die Verbindung zum AP steht
 *  - wenn das Modem nicht sauber oder zu langsam funktoniert, wait Zeiten erhoehen
*/
#include "mbed.h"

UnbufferedSerial  pc( USBTX, USBRX );
UnbufferedSerial  dev( PTC15, PTC14 );
// Reset Modem
DigitalOut rst( PTA19 );
DigitalOut led1( D11 );
DigitalOut led4( D12 );

/** Lesen von Modem, Ausgabe auf UART USB */
void recvChar()
{
    char c;

    led1 = !led1;
    // Read the data to clear the receive interrupt.
    if ( pc.read(&c, 1) ) 
        dev.write( &c, 1 );
}

/** Schreiben auf Modem ab UART USB */
void sendChar()
{
    char c;

    led4 = !led4;
    if ( dev.read( &c, 1) ) 
        pc.write( &c, 1 );    
}

/** Senden eines Strings an das Modem */
void send( char* out )
{
    dev.write( out, strlen( out ) );
    dev.write( "\r\n", 2 );
}

int main()
{
    rst = 0;
    // 1. Teil: Initialisierung - Baudraten muessen identisch sein
    pc.baud( 115200 );
    dev.baud( 115200 );
    thread_sleep_for( 1000 );
    rst = 1;

    // Register a callback to process a Rx (receive) interrupt.
    pc.attach( &sendChar, SerialBase::RxIrq );
    dev.attach( &recvChar, SerialBase::RxIrq );
    
    send( (char *) "AT+RST" );       // RESET Modem
    thread_sleep_for( 2000 );
    
    send( (char *) "AT+GMR" );       // Ausgabe Firmware Version - optional
    thread_sleep_for( 2000 );    
    
    send( (char *) "AT+CWMODE=1" );  // Station Mode, d.h. Modem = Client zu AP
    thread_sleep_for( 1000 ); 
    
    //send( "AT+CWLAP" );     // List AP - optional
    //wait( 10.0f );     
    
    send( (char *) "AT+CWJAP=\"LERNKUBE\",\"l3rnk4b3\"" );  // Verbindung AP (SSID, PW)
    thread_sleep_for( 10000 );    
    
    send( (char *)"AT+CIFSR" );  // Ausgabe IP-Adresse
    thread_sleep_for( 1000 );
    
    // 2. Teil: Webseite von google.com holen
    send( (char *) "AT+CIPMUX=1" );  // Mehrere Verbindungen aktivieren
    thread_sleep_for( 1000 );    
    
    send( (char *) "AT+CIPSTART=4,\"TCP\",\"httpbin.org\",80" );  // Socket zu google.com oeffnen
    thread_sleep_for( 1000 ); 
    
    send( (char *) "AT+CIPSEND=4,18" );  // 18 Zeichen senden
    thread_sleep_for( 1000 );     
    
    send( (char *) "GET / HTTP/1.0\r\n" );  // HTTP GET
    thread_sleep_for( 1000 ); 

    exit( 0 );    
}  

Links

Konfiguration ESP8266


Der IoTKit K64F wird mittels dem ESP8266 WLAN Modem ans Internet angeschlossen.

Ab mbed OS V5.10 ist der ESP8266 Driver Bestandteil von mbed und keine separate Library mehr.

Um auf die neuste Version von mbed OS zu updaten ist wie folgt Vorzugehen:

Der IoTKit V3 kommuniziert mittels UART mit dem ESP8266 dabei werden folgende Pins verwendet:

  • TX - PTC15
  • RX = PTC14

Die eigentliche Konfiguration der Schnittstelle erfolgt in der Datei mbed_app.json. Die sehen Einträge wie folgt aus:

{
    "config": {
        "wifi-shield": {
            "help": "Options are internal, WIFI_ESP8266, WIFI_ISM43362, WIFI_IDW0XX1",
            "value": "WIFI_ESP8266"
        },
        "wifi-ssid": {
            "help": "WiFi SSID",
            "value": "\"LERNKUBE\""
        },
        "wifi-password": {
            "help": "WiFi Password",
            "value": "\"l3rnk4b3\""
        },
        "wifi-tx": {
            "help": "TX pin for serial connection to external device",
            "value": "PTC15"
        },
        "wifi-rx": {
            "help": "RX pin for serial connection to external device",
            "value": "PTC14"
        },
        "wifi-debug": {
            "value": true
        }
    }
}

Weitere nützliche Informationen zum ESP8266 sind in diesem Blog zu finden. Ausserdem existiert eine ESP8266 Gruppe.

WLAN Modem Konfiguration (UART)

Zum Konfigurieren oder Update der Firmware eignet sich am Besten der PL2303HX Converter USB To RS232 TTL der wie folgt mit dem Modem zu verbinden ist:

  • Grünes Kabel - mit TXD0 (Transmit) verbinden
  • Weisses Kabel - mit RXD0 (Receive) verbinden

Das Rote und Schwarze Kabel wird nicht benötigt. Die Baudrate ist auf 115200 einzustellen.

SDK Version ab 1.5.4:

Modem mit Access Point verbinden:

  • AT+RST - Reboot Modem
  • AT+GMR - Ausgabe SW Version
  • AT+CWMODE=1 - WLAN Modem als Client (Station) konfigurieren
  • AT+CWJAP_CUR="mcbmobile_2EX","android%123" - mit Access Point mcbmobile_2EX verbinden
  • AT+CIFSR - Ausgabe der IP-Adresse

Firmware Update

Dazu ist das Modem mit einem USB To RS232 TTL Converter zu Verbinden und eine Drahtbrücke von GND nach GPIO0 zu legen.

Die Software und Firmware wie in ESP8266 Firmware Update beschrieben herunterladen.

Mittels eines Drahtes GND und RESET für eine Sekunde kurzschliessen und mittels des Flash Download Tools die Firmware updaten.

Die beschriebene Schaltung "serial passthrough" hat nicht funktioniert, so dass der Update mittels USB To RS232 TTL Converter erfolgt ist. Auf der mbed MCU ist vorher ein einfaches Programm, z.B. DigitalOut zu uploaden, welche das ESP8266 nicht verwendet und auch nicht stört.

Links

Übungen


Nach oben

AT Commands

Ändern Sie das ESP8266 Beispiel so, dass Ihre Webseite geholt wird.

Lösung

Folgende Zeile in WLAN Modem ESP8266 lowlevel Beispiel ändern

send( (char *) "AT+CIPSTART=4,\"TCP\",\"httpbin.org\",80" );  // Socket zu google.com oeffnen

ATCmdParser

Verwenden Sie den ATCmdParser von mbed um eine Webseite zu holen.

  • Anwendungen: Kommunikation mit AT Befehlsatz kompatiblen Modems.
Lösung
/* ATCmdParser usage example
 */

#include "mbed.h"
#include "platform/ATCmdParser.h"

#define   ESP8266_DEFAULT_BAUD_RATE   115200

UnbufferedSerial *serial;
ATCmdParser *parser;

int main()
{
    printf( "\nATCmdParser with ESP8266 example" );

    serial = new UnbufferedSerial( MBED_CONF_IOTKIT_ESP8266_TX, MBED_CONF_IOTKIT_ESP8266_RX );
    serial->baud( ESP8266_DEFAULT_BAUD_RATE );
    parser = new ATCmdParser( serial );
    parser->debug_on( 1 );
    parser->set_delimiter( "\r\n" );

    //Now get the FW version number of ESP8266 by sending an AT command
    printf( "\nATCmdParser: Retrieving FW version" );
    parser->send( "AT+GMR" );
    int version;
    if ( parser->recv( "SDK version:%d", &version ) && parser->recv( "OK" ) )
    {
        printf( "\nATCmdParser: FW version: %d", version );
        printf( "\nATCmdParser: Retrieving FW version success" );
    }
    else
    {
        printf( "\nATCmdParser: Retrieving FW version failed" );
        return -1;
    }

    parser->send( "AT+CWMODE=1" );  // Station Mode, d.h. Modem = Client zu AP
    if  ( parser->recv( "OK" ) )
    {
        parser->send( "AT+CIFSR" );  // Ausgabe IP-Adresse
        parser->recv( "OK" );
        parser->send( "AT+CIPMUX=1" );  // Mehrere Verbindungen aktivieren
        parser->recv( "OK" );
        parser->send( "AT+CIPSTART=4,\"TCP\",\"httpbin.org\",80" );  // Socket zu google.com oeffnen
        parser->recv( "OK" );
        parser->send( "AT+CIPSEND=4,18" );  // 11 Zeichen senden
        parser->recv( "OK" );
        parser->send( "GET / HTTP/1.0\r\n" );  // HTTP GET
        parser->recv( "OK" );
    }

    printf( "\nDone\n" );
}

About

UART (Universal Asynchronous Receiver Transmitter)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages