Raspberry Pi
Nach längerer Zeit starte ich
nochmal mit einem Projekt in ANSI-C,
UART, SD Card Lesen und Kommandos + Daten an externe MPU senden:
#C_Programm_UART_File_Befehle
#DHCP_Geht_nicht am Uni
Regensburg Netz. DHCP problem . IPV6 deaktivieren
Fundus:
Sehr gut brauchbare INFOs zum RaspBerry: https://www.elektronik-kompendium.de/sites/raspberry-pi/
https://www.notebookcheck.com/Iconikal-Diese-10-Dollar-Platine-ist-schneller-als-ein-Raspberry-Pi-und-bringt-Zubehoer-mit.493477.0.html
Projekte
HAM Clock
Uhr mit Weltkarte: https://www.youtube.com/watch?v=JTH1QKqCu3c
mit BCM2835
Multimedia Chip für Smartphones Tabletts oder Satreceiver
Model A
-
•
Modellbezeichnung:
Raspberry
Pi Mod A
-
•
Typ:
Mini-PC
-
•
Technologie:
ARM
-
•
Ausführung:
256
MB
-
•
USB:
ja
-
•
HDMI:
ja
-
•
Länge:
85,6
mm
-
•
Breite:
53,98
mm
-
•
Höhe:
17
mm
|
Model B
-
•
Modellbezeichnung:
Raspberry
Pi Mod B
-
•
Typ:
Mini-PC
-
•
Technologie:
ARM
-
•
Ausführung:
512
MB
-
•
USB:
ja
-
•
HDMI:
ja
-
•
Länge:
85,6
mm
-
•
Breite:
53,98
mm
-
•
Höhe:
17
mm
|
Raspberry_Pi_Model_A
(habe aber auch B als Bezeichnung gefunden)
PI Model B/ B+) 512MB
Anmerkung; RaspBerry P2 ist ohne WLAN....
Daher gleich P3, P4
PI-3 --> PI 3 Model B oder B+
Pi 4
PI -3
Projekte Fundus:
Projekt
Raspberry PI Radio ,it RTL USB2382U http:/ /www.watterott.net/
Raspberry Pi: UART senden und empfangen in C https://www.einplatinencomputer.com/raspberry-pi-uart-senden-und-empfangen-in-c/
Raspberry Pi: Serielle
Schnittstelle Sehr gute Beschreibung: http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Serial.html#:~:text=Sie%20rufen%20raspi%2Dconfig%20auf,zum%20Deaktivieren%20der%20seriellen%20Konsole.
Wichtige Kurzbefehle unter Linux
Betriebssystem:
Standard System und Password
pi
Password: raspberry
Note changed password!
sudo passwd root
This will set the root account password, so you can then use root
root = Der Systemverwalter
sudo raspi-config
Nice to Know
aus https://www.elektronik-kompendium.de/sites/raspberry-pi/2006071.htm
Folgendes
Kommando gibt aus, welches Modell genau verwendet wird.
cat /sys/firmware/devicetree/base/model
Um umfangreiche Hardware-Informationen zu bekommen eignet sich das Tool
"lshw", dass man in der Regel nachträglich installieren muss.
sudo apt-get install lshw
Informationen über dieNetzwerk-Schnittstelle:
sudo lshw | tail -n 9 | grep -iE "size|capacity|capabilities|speed"
Die aktuelle Konfiguration kann man sich wie folgt ausgeben lassen.
vcgencmd get_config int
WIE GEHT AUSSCHALTEN ? sudo
shutdown now
oder mit Batch in Textatei
"Runterfahren" schreiben und mit chmod als Ausführbar kennzeichnen
# chmod a+x /home/pi/Desktop/BASHs/Runterfahren
#! /bin/bash
echo Shutdown
sudo shutdown now
Mit Neustart sudo shutdown -r now
BATCH: Beispiel Datum
#! /bin/bash
# /home/pi/Desktop/BASHs
# chmod a+x /home/pi/Desktop/BASHs/Hello
cd /home/pi/Desktop/BASHs/
ls -l
PI=3.1415926
echo ..........................
echo "Hello World!"
echo "Datum="$(date "+%D Uhr=%H:%M:%S")
echo 'PI='$PI
echo ..........................
DHCP Geht nicht
Netzwerk Problem. DHCP (
an der Uni-Regensburg ) geht nicht. ? Warum? recherche->
1.
Analystool --> ethtool
Code
sudo apt-get update
sudo apt-get install ethtool
sudo ethtool eth0
iconfig
interface
LAN = eth0
Probiere:
sudo ifup eth0
oder
sudo dhclient -v eth0
Die IPv4-Adressen der folgenden Beispiel sind an die jeweiligen
Erfordernisse anzupassen.
IP-Adresse und Subnetzmaske:
sudo ip addr add 192.168.1.5/24 dev eth0
#Standard-Gateway:
sudo ip route add default via 192.168.1.1
#Oder:
sudo route add default gw 192.168.1.1 eth0
#Der DNS-Server muss fest in die Datei "/etc/resolv.conf" eingetragen
werden:
sudo echo "nameserver 192.168.0.1" >> /etc/resolv.conf
Bedeutung subnetmask
Die Netzmaske, Netzwerkmaske oder Subnetzmaske ist eine Bitmaske, die
im Netzwerkprotokoll IPv4 bei der Beschreibung von IP-Netzen angibt,
welche Bit-Position innerhalb der IP-Adresse für die Adressierung des
Netz- bzw. Host-Anteils genutzt werden soll.
Beispiel:
subnetmask=
255.255.248.0
IP Adresse Bsp: 132.199.100.88
255 = 0b1111 1111
248 = 0b1111 1000
100 = 0b0110 0100
NETZ 132
199
100 | 88 (Host)
IP Adresse = 132.199.100.88 =
10000100 - 11000111 - 01100100 - 01011000
subnetmask = 255.255.248.0
= 11111111 - 11111111 - 11111000 - 00000000
255
255
248
0
|...... NETZ.Anteil............... |
---- HOST -----|
es können also xxxxx000.000.0000
= 2047 PCs adressiert werden
neu -->/etc/dhcpcd.conf
Klassische
/etc/network/interfaces sieht so aus:
***************HierGehtDasLos**********************
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
***************HierIstDasZuEnde**********************
/etc/network/interfaces sieht so aus:
***************HierGehtDasLos**********************
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
***************HierIstDasZuEnde**********************
1. Statische IP4 Adresse einfügen
sudo nano /etc/dhcpcd.conf
# Example static IP configuration:
interface eth0
static ip_address=132.199.100.88
#99.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=132.199.103.254
#192.168.0.1
static domain_name_servers=194.94.152.1
#192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
2. und evtl noch: IPV6 entfernen
# NO --> IPV6
Entfernen, deaktivieren.
http://www.schroeter-edv.de/?Dokumentation___Raspberry_Pi___Diverse_Anleitungen_und_HowTo%27s___RPi_3_-_IPv6_Protokoll_dauerhaft_deaktivieren
TUE DAS NICHT --.. war sinnlos:
1. sudo nano /etc/modprobe.d/ipv6.conf
alias net-pf-10 off
alias ipv6 off
# disabled ipv6 module
options ipv6 disable_ipv6=1
# not loading ipv6 driver
blacklist ipv6
2. sudo nano /boot/cmdline.txt
ipv6.disable=1
..........................................
Ab dann ging Ipconf mit richtiger Adresse
sudo nano /etc/dhcpcd.conf
BATCH
#! /bin/bash
sudo ip addr add 132.199.100.88 dev eth0
#Standard-Gateway:
sudo ip route add default via 132.199.103.254
#Oder:
sudo route add default gw 132.199.103.254 eth0
#Der DNS-Server muss fest in die Datei "/etc/resolv.conf" eingetragen
werden:
sudo echo "nameserver 194.94.152.1" >>
/etc/resolv.conf
ifconfig
read -p Druecke_Taste
Wlan PassPhrase
sudo -i
wpa_passphrase "WLAN-NAME" "WLAN-PASSWORT" >>
/etc/wpa_supplicant/wpa_supplicant.conf
exit
Netzwerk DHCP testen
sudo service dhcpcd status
BEISPIEL:
RASPBERRY , for static routing use
sudo nano /etc/dhcpcd.conf
interface eth0=132.199.100.88
static routers=132.199.103.254
static domain _name_servers=194.94.152.1
sudo ip address show
sudo nano /etc/network/interfaces
# Ethernet
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 132.199.100.88
netmask 255.255.248.0
gateway 132.199.103.254
dns-nameservers 194.94.152.1
systemctl status dhcpcd
sudo netstat -ulpena | grep -i dhcp
ls -la /var/lib/dhcpcd5
dhcpcd -4 -U wlan0
cat /etc/dhcpcd.conf
Netzwerkmonitor
https://www.heise.de/ratgeber/Netzwerke-testen-mit-dem-Raspberry-Pi-4168922.html
https://www.raspberry-pi-geek.de/ausgaben/rpg/2018/04/das-lokale-netzwerk-immer-im-blick/
wget http://packages.ntop.org/apt/ntop.key
sudo apt-key add ntop.key
echo "deb http://apt.ntop.org/stretch_pi armhf/" | sudo tee -a
/etc/apt/sources.list
echo "deb http://apt.ntop.org/stretch_pi all/" | sudo tee -a
/etc/apt/sources.list
sudo apt update
sudo apt install ntopng nprobe
sudo systemctl enable ntopng
sudo systemctl start ntopng
Anschließend geben Sie den Befehl hostname ein, um den vollständigen
Domainnamen zu ermitteln. Auf die Weboberfläche gelangen Sie dann über
die URL http://Hostname:3000. Nach dem Aufruf der URL fordert Ntopng
Sie auf, sich anzumelden. Dazu nutzen Sie den Benutzernamen admin und
das gleichlautende Passwort.
Was tun bei Neuinstallation
Netzwerkkabel anschließen Netzwerk, WLAN Stick.
dann:
sudo
eingeben...
( WARTEN NACH ENTER, Dauert etwas )
Für
ein deutschsprachiges System braucht es de_DE.UTF-8
dort: de_DE.UTF-8 UTF-8 auswählen für
deutsch...
evtl. $ sudo dpkg-reconfigure locales
…ausführen und dann die nachfolgenden Dialoge entsprechend beantworten.
Aktiviert im ersten Dialog die Generierung der Lokalisierung für
“de_DE.UTF-8″
und im Zweiten wählt Ihr eure neue Sprache als Standard für das
komplette System aus,LOGIN:
Beachtet bitte, dass das Passwort ein “y” enthält, das System aber eine
englische Tastatur erwartet.Gebt also – wenn Ihr nicht sowieso mit
einer englischen Tastatur arbeitet – raspberrz als Passwort ein.
sudo login login: pi
password: raspberry
sudo shutdown now für
herunterfahren eingeben
$ sudo apt-get update
sudo apt-get update && sudo apt-get
upgrade -y
$ sudo apt-get dist-upgrade
EXPAND File System
sudo raspi-config
-> 7 Advanced Options
-> A1 Expand Filesystem
https://www.simon42.com/raspberry-pi-sd-karte-klonen-unter-raspbian/#gs.eiyf3l
$ sudo adduser christof
$ sudo adduser christof admin (
dies führt zu Meldung gruppe admin existiert nicht
???)
siehe http://wiki.ubuntuusers.de/Benutzer_und_Gruppen?highlight=adduser%20Gruppe
einen SSH Server sollte man auch gleich installieren
$ sudo apt-get install
openssh-server ist aber
in neuen Systemen schon drin
startx
--> die GUI Oberfläche
Admin muss in sudoers file
stehen !! http://wiki.ubuntuusers.de/sudo/Konfiguration
Die
Datei /etc/sudoers sollte immer mit dem Befehl visudo
bearbeitet
werden, da so eine Syntaxüberprüfung gewährleistet ist. Bei der
direkten Bearbeitung ohne Prüfung kann der kleinste Tippfehler dazu
führen, dass man sich aus dem System aussperrt und nur über den Recovery
Modus wieder Zugang erhalten kann.
Neuinstallation mit UART Nutzung
http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Serial.html#:~:text=Sie%20rufen%20raspi%2Dconfig%20auf,zum%20Deaktivieren%20der%20seriellen%20Konsole.
Auszug:
Per
Voreinstellung ist auf der Schnittstelle, die unter Linux auf /dev/ttyAMA0 angesprochen
wird, eine serielle Login-Konsole konfiguriert, auf der auch der
gesamte Bootvorgang protokolliert wird. Deshalb kann man diese
Schnittstelle nicht so ohne Weiteres für andere Zwecke verwenden. Das
bedeutet, dass Sie zuerst die serielle Konsole abschalten müssen.
Maßgeblich dafür sind zwei Dateien:
relevante Begriffe :
/dev/ttyAMA0
/boot/cmdline.txt
/etc/inittab
sudio nano /boot/cmdline.txt
Aus diesen Optionen müssen Sie nun die Angaben zur Konsole "ttyAMA0" löschen, aber alles andere unbedingt unverändert lassen.
Am Besten machen Sie zuerst ein Backup der Datei (cp /boot/cmdline.txt /boot/cmdline.bak).
Dann ändern Sie in der Originaldatei die Zeile:dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
in die folgende Zeile (oben sind die zu löschenden Teile farbig hervorgehoben):dwc_otg.lpm_enable=0
console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Bearbeiten /etc/inittab
Nun wird die Datei /etc/inittab bearbeitet. In ihr ist die serielle
Schnittstelle als Login-Schnittstelle definiert. Dazu Öffnen Sie die
Datei und bearbeiten den folgenden Eintrag:
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Ändern
Sie die Zeile durch ein davor gestelltes Kommentarzeichen in
#Spawn a getty on Raspberry Pi serial line
# T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Damit der User pi auch auf die Schnittstelle zugreifen darf, muss er zusätzlich in die Gruppe "dialout" aufgenommen werden.
Das erreichet man mit dem Kommando
sudo usermod -a -G dialout pi
WICHTIG REMOTE
https://tutorials-raspberrypi.de/raspberry-pi-remote-desktop-verbindung/
https://tutorials-raspberrypi.de/raspberry-pi-remote-desktop-verbindung/
REMOTE 132.199.100.92 .
sudo apt-get install xrdp
Installationen für UART
sudo apt-get update && sudo apt-get
upgrade -y
EXPAND
File System
sudo raspi-config
-> 7 Advanced Options
-> A1 Expand Filesystem
https://www.simon42.com/raspberry-pi-sd-karte-klonen-unter-raspbian/#gs.eiyf3l
sudo apt-get install xrdp
Terminal
sudo apt-get install minicom
Uasge:
minicom -b 9600 -o -D /dev/ttyS0
C-Compiler IDE
sudo apt-get install codelite
https://wiki.codelite.org/
https://developer-blog.net/raspberry-pi-cplusplus-entwicklungsumgebung
C_compiler installation sicherstellen
sudo apt-get install build-essential
PROBLEM
Codelite-Debugger-Fehler:
GDB konnte nicht gefunden werden! bei '/ usr / bin / gdb'
Lösung: https://stackoverflow.com/questions/28480199/codelite-debugger-error-failed-to-locate-gdb-at-usr-bin-gdb
Wenn Sie CodeLite 7.0 verwenden, wurde ein Fehler bei der automatischen Toolerkennung festgestellt
(der in Git Master behoben wurde).
Das Problem ist, dass der GDB-Pfad /usr/bin/gdb am Ende einen zusätzlichen Speicherplatz enthielt
Um dies zu beheben, entfernen Sie den zusätzlichen Speicherplatz und das Problem wird behoben
Bei mir stand da:
/usr/bin/arm-linux-gnueabihf-gdb
Das habe ich einfach gelöscht.
Dann ging es !!
WORKSPACE
home/pi/Documents/CodeLiteWorkSpace
Projekt Rechte Maus Active schalten
https://wiki.codelite.org/pmwiki.php/Main/FileSystemWorkspace
pi.codelite
home/pi/Document/CodeLiteWorkSpace.workspace
/home/pi/Documents/CodeLiteWorkSpace
WirningPi-Bibliothek
http://wiringpi.com/pins
Python RPi:GPIO http://pypi.python.org/pypi/RPi.GPIO
C WiringPi-Bibliothek http://wiringpi.com/pin
Alternative
Bcm2835
File Read von USB
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_017.htm
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_017.htm#mjd6205d099779f805fd974466f81d3e86
F:\texts\DasKapital.txt
/media/pi/USB16GERMER/texts/DasKapital.txt
Generelle Netzwerk-Einstellungen (Interfaces, IP, DNS, Gate) werden in der Datei interfaces abgelegt
Diese Datei /etc/network/interfaces sollte in etwa wie folgt aussehen:
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.0.244
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.1.255
gateway 192.168.0.1
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet static
address 192.168.0.245
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
WLAN-Einstellungen bzgl Verschlüsselung, SSID usw. werden in einer CFG-Datei unter /etc abgelegt
Diese Datei /etc/wpa_supplicant.conf sollte in etwa wie folgt aussehen:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="YOUR_SSID"
psk="YOUR_WLAN_KEY"
scan_ssid=1
id_str="home"
key_mgmt=WPA-PSK
proto=WPA RSN
pairwise=CCMP TKIP
group=CCMP TKIP
priority=5
}
Sammlung diverser Linsk und Informationen
zu erfolgreichen Modul mit ARM Prozessor
Spiegel Artikel
Tor-Router zum Selberbauen: Internet-Tarnkappe für 65 Euro
http://www.spiegel.de/netzwelt/gadgets/raspberry-pi-tor-router-onion-pi-anonymisiert-surfen-im-web-a-907567.html
http://www.spiegel.de/netzwelt/gadgets/raspberry-pi-bauanleitung-des-anonymisierenden-tor-routers-sponionpi-a-907568.html
Raspbmc
+ Xbpmc App als Fernbedinung
Mini-Rechner Raspberry Pi: So basteln Sie einen Smart-TV für 60
Euro
mit
der kostenlosen Linux-Distribution Raspbmc
und dem 40 Euro teuren Mini-Computer Raspberry Pi lassen sich
alte Fernseher leicht und schnell ans Netz bringen.
http://www.chip.de/downloads/Raspbmc_56704181.htmlhttp://www.spiegel.de/netzwelt/gadgets/raspbmc-dieser-multimediaplayer-kostet-60-euro-a-893773.html
http://www.raspbmc.com/download/
RPi Beginners
http://elinux.org/RPi_Beginners
EIN MUSS!
Diesen Text lesen und bei der ersten Installation und benutzung die
Tips durchführen !!!
http://linuxundich.de/de/hardware/klein-aber-fein-der-raspberry-pi-bei-linux-und-ich/
https://sourceforge.net/projects/mingw-w64/files/latest/download
Programm zur UART Kommunikation und
File-Read,
für eine externe Mikrocontrolleranbindung:
In diesem Fall eines AVR
Mikrocontrollersm der die empfangenen Textblöcke Morst:
PIng<CR> sendet PONG<CR> und evtl einen Wert oder Text
MAIN.c
/*
Christof Ermer 14.09.2020
*/
/*
https://wiki.codelite.org/pmwiki.php/Main/HomePage
http://www.netzmafia.de/skripten/hardware/RasPi/timer/index.html
https://tutorials-raspberrypi.de/raspberry-pi-autostart-programm-skript/
http://www.raspberry-projects.com/pi/programming-in-c/uart-serial-port/using-the-uart
UTF-8
sudo apt-get install minicom
inicom -b 96000 -o -D /dev/serial0
/dev/ttyS0 refers to the mini UART
/dev/serial0
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> //usleep
#include <stdint.h> //??
#include <bits/types.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
//Used for UART
#include <fcntl.h>
//Used for UART
#include <termios.h> //Used
for UART
#include "Uart_Rasp_Pi3.h"
#include "FileBlkRead.h"
#include "debug.h"
#include "Befehle.h"
#include "Service.h"
#include "main.h"
//GLOBALS
PROGFLAG_TYPE gbCtrlFlag;
//unsigned char gu8CtrlFlag = 0;
TextFile_TYPE gstTextFile;
char gcaStr[STRMAX+1];
char gcaNumStr[NUMSTRMAX+1];
unsigned long gulMS_Ticks = 0;
struct timeval sTime1;
//struct timespec sTimeSpec1, SClockResolution;
// **********************************************
int main(int argc, char **argv)
// **********************************************
{
unsigned long ulLoops=0;
static unsigned long ulTickComp = 0;
static unsigned long ulRxTickComp = 0;
InitUart();
printf("\r\nHello World\r\n");
printf("\r\nSend to Terminal COMx\r\n");
printf("\r\nKommandos im Terminal mit <CR> absenden\r\n");
uart_tx_string("\r\n");
uart_tx_string("JuniKaefer an Wallkuere\r\n");
uart_tx_string("Der Pirol pfeift heute Nacht\r\n");
Reset_TxtFileStruct( &gstTextFile ); //open EOF
etc
gbCtrlFlag.While_Run_Flag = 1;
sleep(1); // second
while( gbCtrlFlag.While_Run_Flag ) // HauptMainLoop
{
ulLoops++;
gettimeofday(&sTime1, NULL);
if( (sTime1.tv_usec - ulTickComp) > 1000UL)
{
ulTickComp = (unsigned
long)sTime1.tv_usec; //suseconds_t=long int
gulMS_Ticks++;
if( !(gulMS_Ticks % 1000) )
{
gbCtrlFlag.TICK_1S_Flag = 1;
};
};
///
----------------------------------------------
if( gbCtrlFlag.TICK_1S_Flag )
{
gbCtrlFlag.TICK_1S_Flag = 0;
// Versuche Textfile zu
Öffnen
if( (gstTextFile.u8FileFlags
& TXT_FILE_OPEN) == 0) // File NICHT offen !!
{
strcpy( gstTextFile.caFilePlaceName, STR_USB_TEXT_FILE_POS );
printf("Try to Open textfile: %s\r\n", gstTextFile.caFilePlaceName);
Reset_TxtFileStruct( &gstTextFile
);
OPEN_Textfile( &gstTextFile, gstTextFile.caFilePlaceName);
sleep(2); // second
};
if(
gbCtrlFlag.ShowInfo_Flag || gbCtrlFlag.LockInfo_Flag ) //Info
Lock Iwr dmit Wert 0 gelöscht
{
gbCtrlFlag.ShowInfo_Flag = 0; //einmalig ausführen
//Debugs
//sprintf(gcaStr, "\r\nPars:%d \tLength:%d\r\n",
gstRX.u8Parser,gstRX.tRxLength);
//printf( gcaStr
);
sprintf(gcaStr, "T:%lu \tMCU:%lu \r\n", (unsigned long)(gulMS_Ticks /
1000UL), ulLoops);
uart_tx_string( gcaStr );
printf("\r\nLoops:%lu %s",ulLoops, gcaStr);
};
ulLoops=0;
};
if( (gulMS_Ticks - ulRxTickComp) >
UART_RX_WIEDERHOL_MS )
{
ulRxTickComp =
gulMS_Ticks;
//uart_PutC('*');
if( CheckUart_RX_Pol() ==
ASCII_CR )
{
//printf("\r\n *Polling==13 Cmd:%s\t Val1:%d", gstRX.caCmd,
gstRX.iVal1);
Befehle();
ResetCmdVars(); //wichtig im Kontext nach Befehle
//printf("\r\n Befehl fertig");
};
//Text fertig, was tun ?
if( gstTextFile.u8FileFlags
& TXT_READY_READED )
{
gstTextFile.u8FileFlags &= ~TXT_READY_READED;
gbCtrlFlag.While_Run_Flag = 0;
};
};
}; // while
CLOSE_Textfile( &gstTextFile );
CloseUart();
printf("\r\n*** Programn Ende ***");
return 0;
}
main.h
#ifndef _MAIN_HEADER_
#define _MAIN_HEADER_
/*
* Christof Ermer 03.09.2020
*/
#include "Uart_Rasp_Pi3.h"
#include "FileBlkRead.h"
#include "Befehle.h"
#include "debug.h"
#define STR_USB_TEXT_FILE_POS
"/media/pi/USB16GERMER/texts/DasKapital.txt"
#define CR 13 // \r
#define LF 10 // \n
#define CRLF_STR {10,13,0}
#define STRMAX 253
#define NUMSTRMAX 50
#define UART_RX_WIEDERHOL_MS 10
//FLAGS
typedef struct
{
unsigned char While_Run_Flag : 1;
unsigned char TICK_1S_Flag : 1;
unsigned char Bell_CMD_Flag : 1;
unsigned char ShowInfo_Flag : 1;
unsigned char LockInfo_Flag : 1;
}PROGFLAG_TYPE;
//Globals
//EXTERNS
extern char gcaStr[STRMAX+1];
extern char gcaNumStr[NUMSTRMAX+1];
extern PROGFLAG_TYPE gbCtrlFlag;
extern unsigned long gulMS_Ticks;
extern TextFile_TYPE gstTextFile;
#endif
/*
Christof Ermer 14.09.2020
Uart_Rasp_PI3.c
*/
/*
CheckUart_RX_Pol(); Return 13 löst Befehle aus
if( CheckUart_RX_Pol() == ASCII_CR )
{ //printf("\r\n
*Polling==13 Cmd:%s\t Val1:%d", gstRX.caCmd,
gstRX.lVal1);
Befehle();
ResetCmdVars();
//wichtig im Kontext nach Befehle
};
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <bits/types.h>
#include <string.h>
#include <unistd.h>
//Used for UART
#include <fcntl.h>
//Used for UART
#include <termios.h> //Used
for UART
#include "Uart_Rasp_Pi3.h"
#include "main.h"
UART_RX_TYPE gstRX;
int uart0_filestream = -1;
// Prototype
// **********************************************
void ResetUartRxVars(void)
// **********************************************
{
*gstRX.au8RxStr = 0;
*(gstRX.au8RxStr + RX_BUF_SIZE) = 0;
*gstRX.caRxUartBuf = 0;
*(gstRX.caRxUartBuf+1) = 0; //Teerm
//gstRX.u8RxByte = 0;
gstRX.tRxLength = 0;
gstRX.u8Parser = 0;
};
// *************************
void ResetCmdVars(void)
// *************************
{
*gstRX.caCmd = 0;
*(gstRX.caCmd + COMMANDSIZEMAX) = 0;
gstRX.lVal1 = 0;
*gstRX.caValStr1 = 0;
*(gstRX.caValStr1 + VALUE_STRMAX) = 0;
};
// **********************************************
void InitUart(void)
// **********************************************
{
//-------------------------
//----- SETUP USART 0 -----
//-------------------------
//At bootup, pins 8 and 10 are already set to
UART0_TXD, UART0_RXD (ie the alt0 function) respectively
//OPEN THE UART
//The flags (defined in fcntl.h):
// Access modes (use 1 of these):
// O_RDONLY -
Open for reading only.
// O_RDWR -
Open for reading and writing.
// O_WRONLY -
Open for writing only.
//
// O_NDELAY / O_NONBLOCK (same
function) - Enables nonblocking mode. When set read requests on the
file can return immediately with a failure status
//
if there is no
input immediately available (instead of blocking). Likewise, write
requests can also return
//
immediately
with a failure status if the output can't be written immediately.
//
// O_NOCTTY - When set and path
identifies a terminal device, open() shall not cause the terminal
device to become the controlling terminal for the process.
close(uart0_filestream);
uart0_filestream = open( DEV_UART_USED, O_RDWR |
O_NOCTTY | O_NDELAY); //Open in
non blocking read/write mode
//printf("\r\nUartFileStream=%d", uart0_filestream );
if (uart0_filestream == -1)
{
//ERROR - CAN'T OPEN SERIAL PORT
printf("\r\nError - Unable to
open UART. Ensure it is not in use by another application");
}
//CONFIGURE THE UART
//The flags (defined in /usr/include/termios.h - see
http://pubs.opengroup.org/onlinepubs/007908799/xsh/termios.h.html):
// Baud rate:- B1200, B2400,
B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800,
B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000,
B2500000, B3000000, B3500000, B4000000
// CSIZE:- CS5, CS6, CS7, CS8
// CLOCAL - Ignore modem status
lines
// CREAD - Enable receiver
// IGNPAR = Ignore characters with
parity errors
// ICRNL - Map CR to NL on input
(Use for ASCII comms where you want to auto correct end of line
characters - don't use for bianry comms!)
// PARENB - Parity enable
// PARODD - Odd parity (else even)
struct termios options;
tcgetattr(uart0_filestream, &options);
options.c_cflag = B9600 | CS8 | CLOCAL |
CREAD; //<Set baud rate
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(uart0_filestream, TCIFLUSH);
tcsetattr(uart0_filestream, TCSANOW, &options);
ResetUartRxVars();
ResetCmdVars();
};
// **********************************************
void CloseUart(void)
// **********************************************
{
// ----- CLOSE THE UART -----
close(uart0_filestream);
};
// **********************************************
int RxUartStream(void)
// **********************************************
{
//----- CHECK FOR ANY RX BYTES -----
if (uart0_filestream != -1)
{
// Read up to 255 characters from the port if they
are there
*gstRX.caRxUartBuf = 0; //Nix
//Lese "EIN" Zeichen
gstRX.tRxLength = read(uart0_filestream,
(void*)gstRX.caRxUartBuf, 1);
//Filestream, buffer to store in, number of bytes to read (max)
gstRX.caRxUartBuf[1]=0;
if (gstRX.tRxLength < 0)
{
//An error occured (will
occur if there are no bytes)
*gstRX.caRxUartBuf =
0; //Nix
return -1;
}
else if (gstRX.tRxLength == 0)
{
//No data waiting
*gstRX.caRxUartBuf =
0; //Nix
return -1;
}
else
{
//1 Byte received
//printf("\r\n%i bytes read : %s", gstRX.tRxLength, gstRX.caRxUartBuf);
return
(int)*gstRX.caRxUartBuf ; //alles OK und nur 0.tes Byte
zurückgeben.
};
};
//else
//und hier ging dann was schief.
*gstRX.caRxUartBuf = 0; //Nix
return -1;
};
// **********************************************
int CheckUart_RX_Pol(void) // Polling in while(1)
// **********************************************
{
int iRxByte;
iRxByte = RxUartStream(); // NUR EIN BYTE
if( iRxByte != -1 )
{
iRxByte &= 0x7F; //<128
if( iRxByte == CMDSIG_CR ) // 13
{
//printf("\r\n ** Befehl
gefunden**:%s ln:%d", gstRX.au8RxStr, gstRX.tRxLength);
TokenRXStr(
(char*)gstRX.au8RxStr );
//printf("\r\n ** Befehl
%s\t Value=%d",
gstRX.caCmd,gstRX.lVal1);
/*
printf("\r\nRx:%d\t %c /tPars:%d /tStr%s\r\n",iRxByte,iRxByte,
gstRX.u8Parser,gstRX.au8RxStr);
printf("\r\nCMD%s Val:%d". gstRX.caCmd , gstRX.lVal1);
sprintf(gcaStr, "\r\nPars:%d \tLength:%d \tRxByte:%d rxStr%s\r\n",
gstRX.u8Parser,gstRX.tRxLength, gstRX.u8RxByte, gstRX.au8RxStr);
printf( gcaStr );
*/ ResetUartRxVars();
return
CMDSIG_CR;
}
else
{
//Suche unnütze Sonderzeichen
if( (iRxByte <
ASCII_NUMBERSTART) && \
(iRxByte != ASCII_KOMMA) && \
(iRxByte != ASCII_MINUS) ) {return -1; }; //weil "befehl,-123"
if( (iRxByte >
ASCII_BIG_Z_END) && (iRxByte < ASCII_SMALL_A_START) )
{return -1;};
//printf("\r\nRx:%d\t
%c\r\n",iRxByte,iRxByte);
if( iRxByte >
ASCII_SMALL_Z_END) {return -1;};
//printf("\r\nRx:%d\t %c /tPars:%d /tStr%s\r\n",iRxByte,iRxByte,
gstRX.u8Parser,gstRX.au8RxStr);
if(gstRX.u8Parser >
RX_BUF_SIZE)
{
ResetUartRxVars();
return -1;
};
*( gstRX.au8RxStr +
gstRX.u8Parser++) = (uint8_t)iRxByte;
*( gstRX.au8RxStr +
gstRX.u8Parser) = 0;
//printf("\r\nAkt RxStr:%s\r\n", gstRX.au8RxStr);
return 1;
};
}
return -1; // Bis hier war dan nix.
};
/* Diese Funktion zerlegt den Befehls-String in einzelne Module */
// *******************************************************************
void TokenRXStr(char *pcStrOrder)
// *******************************************************************
{ //INPUT ERWARTET "BEFEHL,WERT" BSP: "SFR,1000"
const char caDelimiter[]= ",";
char * pStrTok; // für strtok_r
if( (pStrTok = strtok( pcStrOrder, caDelimiter)) != NULL) // Trenne
1.Token in Command
{
strcpy( gstRX.caCmd, pStrTok);
}
else
{
*gstRX.caCmd = 0;
};
gstRX.caCmd[ COMMANDSIZEMAX ] = 0; //Sicherheitsterminierung
COMAMNDSIZEMAX=10
//für 1 fVal Variablen nach dem Kommando
gstRX.lVal1 = 0;
//gstRX.caCmd.i16CmdVal_2 = 0;
//HIER NULL POINTER
if( (pStrTok = strtok( NULL, caDelimiter)) != NULL) // Trenne 1.Token
in Command
{
//gstRX.caCmd.fCmdVal_1 = atof(pStrTok);// Und dann
TO Float
gstRX.lVal1 = atol(pStrTok);
};
if( (pStrTok = strtok( NULL, caDelimiter)) != NULL) // Trenne 1.Token
in Command
{
strcpy( gstRX.caValStr1, pStrTok );
*(gstRX.caValStr1 +VALUE_STRMAX) = 0;
}
else
{
*gstRX.caValStr1 = 0;
*(gstRX.caValStr1 + VALUE_STRMAX) = 0;
};
};
//************************************
//********** UART TX STRING **********
//************************************
// **********************************************
void uart_tx_string (char* tx_string)
// **********************************************
{
size_t u16StrLen = strlen(tx_string);
if (uart0_filestream != -1)
{
// write(uart0_filestream, (char*)tx_string.c_str(),
tx_string.length()); //Filestream,
bytes to write, number of bytes to write
write(uart0_filestream, tx_string,
u16StrLen); //Filestream, bytes to
write, number of bytes to write
};
};
// **********************************************
void uart_PutC(unsigned char ucC)
// **********************************************
{
char caToTx[2];
*caToTx = ucC;
*(caToTx+1) = 0;
if (uart0_filestream != -1)
{
// write(uart0_filestream, (char*)tx_string.c_str(),
tx_string.length()); //Filestream,
bytes to write, number of bytes to write
write(uart0_filestream, caToTx,
1); //Filestream, bytes to write,
number of bytes to write
};
};
Uart_Rasp_Pi3.h
#ifndef UART_RASP_HEADRER
#define UART_RASP_HEADRER
/*
* Christof Ermer 14.09.2020
Uart_Rasp_Pi3.h
https://de.wikipedia.org/wiki/Steuerzeichen
* */
#define DEV_UART_USED
DEV_UART_MINIUART_P3
#define DEV_UART_MINIUART_P3 "/dev/ttyS0"
#define DEV_STANDARD "/dev/serial0"
#define RX_BUF_SIZE 250 // Default
#define COMMANDSIZEMAX 31
#define ASCII_BEL 7 //BEL
#define ASCII_LF 10 //LF
#define ASCII_CR 13 //CR
#define ASCII_SPACE 32
#define ASCII_KOMMA 44
#define ASCII_MINUS 45
#define ASCII_NUMBERSTART 48
#define ASCII_BIG_A_START 65
#define ASCII_BIG_Z_END 92
#define ASCII_SMALL_A_START 97
#define ASCII_SMALL_Z_END 122
#define CMDSIG_BEL ASCII_BEL //BEL Anstelle von 13, was ja
ein zu sendendens Zeichen sein kann.
#define CMDSIG_CR ASCII_CR
#define VALUE_STRMAX 80
//Globals
typedef struct
{
char caRxUartBuf[2]; // 2 BYTE
uint8_t au8RxStr[RX_BUF_SIZE + 1]; //Sample
//uint8_t u8RxByte; //single
uint8_t u8Parser;
int tRxLength;
char caCmd[COMMANDSIZEMAX+1]; //Kommando
long lVal1;
char caValStr1[ VALUE_STRMAX +1 ];
}UART_RX_TYPE;
extern UART_RX_TYPE gstRX;
//Fuctions
extern void InitUart(void);
extern void ResetUartRxVars(void);
extern void ResetCmdVars(void);
extern void CloseUart(void);
extern int RxUartStream(void);
extern void TokenRXStr(char *pcStrOrder);
extern int CheckUart_RX_Pol(void); // Polling in while(1)
extern void uart_tx_string (char* tx_string);
extern void uart_PutC(unsigned char ucC);
#endif
FileBlkRead.c
/*
Christof Ermer
FileBlkRead.c
Datum 14.09.2020
https://stackoverflow.com/questions/3463426/in-c-how-should-i-read-a-text-file-and-print-all-strings
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_014.htm#mjff798e62f1469fc3901b349f005d6547
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <stddef.h> // size_t
#include <stdint.h> //??
#include "FileBlkRead.h"
#include "main.h"
//***********************
void Reset_TxtFileStruct(TextFile_TYPE * pstTFile)
//***********************
{
// NICHT LÖSCHEN char caFilePlaceName[ FILE_NAME_SIZE ]; //
SOLL DATEINAME
*pstTFile->caRxBuf = 0;
*(pstTFile->caRxBuf + FTREAD_BUF_SIZE) = 0;
pstTFile->TxtFileHndl = NULL;
pstTFile->lSeekPos = 0;
pstTFile->lCurrentSeekPos = 0;
pstTFile->u8FileFlags = 0; // TXT_FILE_OPEN TXT_EOF_DETECT
TXT_READY_READED etc.
pstTFile->tBlkSize = FTREAD_BUF_SIZE;
};
//***********************
int OPEN_Textfile(TextFile_TYPE * pstTFile, char* pcFilePosName)
//***********************
{
// FILE*
strcpy( pstTFile->caFilePlaceName, pcFilePosName );
pstTFile->TxtFileHndl = fopen( pcFilePosName, "r");
//"test.txt" "r+b"
if(pstTFile->TxtFileHndl != NULL)
{
fseek(pstTFile->TxtFileHndl, 0L, SEEK_END);
//Ende // Seek the last byte of the file
// Offset from the first to the last byte, or in
other words, filesize
pstTFile->ulFileSize =
ftell(pstTFile->TxtFileHndl);
rewind(pstTFile->TxtFileHndl);// go back to the
start of the file
//fseek(pstTFile->TxtFileHndl, 0L, SEEk_SET ;
//anfang
pstTFile->u8FileFlags = TXT_FILE_OPEN; //1
pstTFile->lSeekPos = 0L;
pstTFile->lCurrentSeekPos = 0L;
return 1; //OK
}
else
{
sprintf(gcaStr, "\r\n File %s Uart not Open \r\n",
pcFilePosName);
uart_tx_string( gcaStr ); //Switch To BELL CMD
= 7 \a
printf( gcaStr );
//Sonst geht es einfach weiter, weil File schon
offen SEEK_CUR
};
return -1;
};
//fseek(), rewind() und fsetpos()
// SEEK_SET SEEK_CUR SEEK_END
//***********************
long int Seek_TextFile(TextFile_TYPE * pstTFile, long int lSeekPos)
//***********************
{
if ( pstTFile->TxtFileHndl != NULL)
{ //int fseek (FILE *__stream, long int
__off, int __whence);
pstTFile->lCurrentSeekPos = fseek(
pstTFile->TxtFileHndl, lSeekPos, SEEK_CUR);
return
pstTFile->lCurrentSeekPos;
};
return -1;
};
//***********************
void CLOSE_Textfile(TextFile_TYPE * pstTFile )
//***********************
{
if(pstTFile->TxtFileHndl != NULL)
{
fclose(pstTFile->TxtFileHndl);
pstTFile->TxtFileHndl = NULL;
};
};
//***********************
char * Read_TextBlock( TextFile_TYPE * pstTFile, size_t tBlkSize )
//***********************
{
size_t tReadedSize = 0;
*pstTFile->caRxBuf = 0;
pstTFile->tBlkSize = tBlkSize;
if(pstTFile->TxtFileHndl != NULL)
{
tReadedSize = fread(pstTFile->caRxBuf, sizeof(char),
tBlkSize, pstTFile->TxtFileHndl);
if( tReadedSize <= FTREAD_BUF_SIZE )
{
*( pstTFile->caRxBuf + tReadedSize) = 0;
//terminierung
};
*( pstTFile->caRxBuf + FTREAD_BUF_SIZE) = 0;
};
if( tReadedSize < tBlkSize )
{
pstTFile->u8FileFlags |= TXT_EOF_DETECT |
TXT_READY_READED; // *** FLAG SETZEN ***;
//printf( "\r\n ** Text readed < Block **:
\tIST:%d\tSoll:%d", tReadedSize, tBlkSize);
pstTFile->lCurrentSeekPos = fseek(
pstTFile->TxtFileHndl, 0L, SEEK_SET); //Stelle auf
Anfang
}
else
{
pstTFile->u8FileFlags &=
~TXT_EOF_DETECT; // *** FLAG CLEAR ***;
}
return pstTFile->caRxBuf;
};
//fseek( gstTextFile.TxtFileHndl, gstTextFile.lSeekPos, SEEK_CUR);
FileBlkRead.h
/*
Christof Ermer
FileBlkRead.h
Datum 14.09.2020
*/
#ifndef _FILE_BLK_READ_H_
#define _FILE_BLK_READ_H_
#include <stdio.h>
#include <stdlib.h>
#define FTREAD_BUF_SIZE 250
#define TXT_FILE_OPEN 0x01
#define TXT_EOF_DETECT 0x02
#define TXT_READY_READED 0x04
#define FILE_NAME_SIZE 80
typedef struct
{
char caFilePlaceName[ FILE_NAME_SIZE ]; // SOLL DATEINAME
char caRxBuf[ FTREAD_BUF_SIZE + 1];
size_t tBlkSize;
FILE *TxtFileHndl;
long int lSeekPos;
long int lCurrentSeekPos;
unsigned long ulFileSize;
unsigned char u8FileFlags; //TXT_FILE_OPEN
}TextFile_TYPE;
//Globals
//Fuctions
extern void Reset_TxtFileStruct(TextFile_TYPE * pstTFile);
extern int OPEN_Textfile(TextFile_TYPE * pstTFile, char* pcFilePosName);
extern long int Seek_TextFile(TextFile_TYPE * pstTFile, long int
lSeekPos);
extern void CLOSE_Textfile(TextFile_TYPE * pstTFile );
extern char * Read_TextBlock( TextFile_TYPE * pstTFile, size_t tBlkSize
);
#endif
Befehle.c
/*
* Christof Ermer 14.09.2020
Befehle.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> //usleep
#include <stdint.h> //??
#include <bits/types.h>
#include <string.h>
#include "Uart_Rasp_Pi3.h"
#include "FileBlkRead.h"
#include "Service.h"
#include "debug.h"
#include "main.h"
// https://de.wikipedia.org/wiki/Steuerzeichen
// #define CMDSIG 0x07 //BEL Anstelle von 13, was ja ein zu
sendendens Zeichen sein kann.
// uart_PutC(CMDSIG); // 7 = BELL
// **********************************************
void Befehle(void)
// **********************************************
{
// gstRX.lVal1
if( !(strcasecmp( gstRX.caCmd, "RNT" ) ) ) //RD NEXT TEXT"
{
if(
!(gbCtrlFlag.Bell_CMD_Flag) )
{
uart_tx_string( "STB\r" );
usleep( 500
);
};//Switch To BELL CMD = 7
gstTextFile.tBlkSize =
RX_BUF_SIZE;
Read_TextBlock(
&gstTextFile, gstTextFile.tBlkSize );
//printf("\r\nText:/t%s **", gstTextFile.caRxBuf);
uart_tx_string(
gstTextFile.caRxBuf );
uart_PutC(ASCII_BEL);
return;
};
if( !(strcasecmp( gstRX.caCmd, "RNS" ) ) ) //RD NEXT TEXT mit SIZE"
{
if(
!(gbCtrlFlag.Bell_CMD_Flag) )
{
uart_tx_string( "STB\r" );
usleep( 500
);
};//Switch To BELL CMD = 7
if(gstRX.lVal1 == 0)
{
gstTextFile.tBlkSize = RX_BUF_SIZE;
}
else
{
gstTextFile.tBlkSize = gstRX.lVal1;
};
Read_TextBlock(
&gstTextFile, gstTextFile.tBlkSize );
//printf("\r\nText:/t%s **", gstTextFile.caRxBuf);
uart_tx_string(
gstTextFile.caRxBuf );
//uart_PutC(13);
uart_PutC(ASCII_BEL);
return;
};
if( !(strcasecmp( gstRX.caCmd, "SBPOS" ) ) )
{
gstTextFile.lSeekPos =
gstRX.lVal1;
fseek(
gstTextFile.TxtFileHndl, gstTextFile.lSeekPos, SEEK_CUR);
return;
};
if( !(strcasecmp( gstRX.caCmd, "SFN" ) ) )
{
if( *gstRX.caValStr1
)
{
strcpy( gstTextFile.caFilePlaceName, gstRX.caValStr1 );
printf( gstTextFile.caFilePlaceName );
return;
};
};
if( !(strcasecmp( gstRX.caCmd, "STB" ) ) ) //Switch To BELL CMD =
7 \a
{
gbCtrlFlag.Bell_CMD_Flag =
1;;
//printf("\r\nBell CMD\r\n");
uart_tx_string( "STB\r\a"
); //Switch To BELL CMD = 7
return;
};
if( !(strcasecmp( gstRX.caCmd, "STCR" ) ) ) //Switch To CR = 13
{
gbCtrlFlag.Bell_CMD_Flag =
0;;
//printf("\r\nCR CMD\r\n");
uart_tx_string( "STCR\a\r"
); //Switch To BELL CMD = 7 \a
return;
};
if( !(strcasecmp( gstRX.caCmd, "SBS" ) ) ) //Set Block Size
{
if(gstRX.lVal1 >
RX_BUF_SIZE) {gstRX.lVal1 = RX_BUF_SIZE;};
gstTextFile.tBlkSize =
(size_t)gstRX.lVal1;
printf("\r\nTNew ReadBlock
Size:%d **", gstTextFile.tBlkSize);
return;
};
if( !(strcasecmp( gstRX.caCmd, "GBS" ) ) ) //Get Block Size
{
printf("\r\nCurrent_ReadBlockSize:%d", gstTextFile.tBlkSize);
sprintf(gcaNumStr, "%d\r",
gstTextFile.tBlkSize);
uart_tx_string(gcaNumStr);
uart_PutC(13);
return;
};
if( !(strcasecmp( gstRX.caCmd, "PING" ) ) )
{
printf("\r\n ** PONG **");
uart_tx_string( "PONG\r" );
return;
};
if( !(strcasecmp( gstRX.caCmd, "STOP" ) ) )
{
gbCtrlFlag.While_Run_Flag =
0;
uart_tx_string( "STOP\r" );
printf("\r\n ** STOP **");
};
if( !(strcasecmp( gstRX.caCmd, "VV" ) ) )
{
printf("\r\nValue:\t%lu",
gstRX.lVal1);
sprintf(gcaStr,"%lu\r\n",
gstRX.lVal1);
uart_tx_string( gcaStr );
//uart_PutC(13);
return;
};
if( !(strcasecmp( gstRX.caCmd, "GFS" ) ) )
{
sprintf(gcaStr,"\r\nFileStat: Open:%d \tSeek:%lu \tCurSeek:%lu
\tBlockSize:%u \tFlags:%x \tFileSize:%lu\r\n", \
//
(gstTextFile.u8FileFlags & TXT_FILE_OPEN),
gstTextFile.u8FileFlags, \
gstTextFile.lSeekPos, \
gstTextFile.lCurrentSeekPos, \
gstTextFile.tBlkSize, \
gstTextFile.u8FileFlags, \
gstTextFile.ulFileSize \
);
uart_tx_string( gcaStr );
//uart_PutC(13);
return;
};
if( !(strcasecmp( gstRX.caCmd, "TT" ) ) ) //TEST
{
sprintf(gcaStr,"%lu\r\n",
gulMS_Ticks);
uart_tx_string( gcaStr
);
//sprintf(gcaStr,
"\r\nPars:%d \tLength:%d\r\n", gstRX.u8Parser,gstRX.tRxLength);
printf( gcaStr );
return;
};
if( !(strcasecmp( gstRX.caCmd, "II" ) ) ) //Info
{
gbCtrlFlag.ShowInfo_Flag = 1;
return;
};
if( !(strcasecmp( gstRX.caCmd, "LI" ) ) ) //LOCK Info, STaendiges
ausführen
{
gbCtrlFlag.LockInfo_Flag =
gstRX.lVal1;
return;
};
if( !(strcasecmp( gstRX.caCmd, "XX" ) ) )
{
gbCtrlFlag.While_Run_Flag =
0;
printf("\r\n ** stop
gefunden **");
return;
};
ResetCmdVars();
};
Befehle.h
ifndef _BEFEHLE_H_
#define _BEFEHLE_H_
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
extern void Befehle(void);
#endif
/*
debug.c
Christof Ermer
Verison 14.03.2020
*/
#include <stdint.h>
#include <stdlib.h>
#include "debug.h"
#ifdef BYTE_TO_BIN_USED
// *******************************************************************
char * ByteToBin(uint8_t u8Byte)
// *******************************************************************
{
static char caHex[9]; //groesse 8+1
char * pcParser = caHex;
int8_t i8NN=7;
do
{
if( u8Byte & (1 << i8NN) )
{
*pcParser = '1';
}
else
{
*pcParser = '0';
};
pcParser++;
}while(i8NN--);
caHex[8]=0; //Terminierung
return caHex;
};
#endif
//WORD Anzeige in Binaerer Form
#ifdef WORD_TO_BIN_USED
// *******************************************************************
char * WordToBin(uint16_t u16Word)
// *******************************************************************
{
static char ucaBin[18]; // Array zeigt Lücke 00000000 00000000
char * pcParser = ucaBin;
uint8_t u8NN=15;
do
{
/*
if(u8NN == 7)
{*pcParser =' '; pcParser++;}; //
Füge Lücke ein im BYTE
*/
if(u16Word & (1<<u8NN) )
{
*pcParser = '1';
}
else
{
*pcParser = '0';
};
pcParser++;
}while(u8NN--);
ucaBin[17]=0;
return ucaBin;
};
#endif
#ifdef FILL_TO_HEX_USED
static char caHex[5]; //groesse 8+1
// **************************
//Hilfsfuktion;
void FillHex(uint8_t u8Pos, uint8_t u8Mem)
// **************************
{
if(u8Mem > 9 )
{
switch(u8Mem)
{
case 10:
{
caHex[u8Pos]='A';
break;
};
case 11:
{
caHex[u8Pos]='B';
break;
};
case 12:
{
caHex[u8Pos]='C';
break;
};
case 13:
{
caHex[u8Pos]='D';
break;
};
case 14:
{
caHex[u8Pos]='E';
break;
};
case 15:
{
caHex[u8Pos]='F';
break;
};
};
}
else
{
caHex[u8Pos]=u8Mem+48; //ASCII ZAHL 0
};
}
// ******************************
char * ByteToHex(uint8_t u8Byte)
// ******************************
{
caHex[0]='0';
caHex[1]='x';
FillHex(2,(u8Byte & 0xF0) >> 4);
FillHex(3,u8Byte & 0x0F);
caHex[4]=0;
return caHex;
};
#endif
/*
debug.h
Christof Ermer
Verison 14.03.2020
*/
#ifndef DEBUG_TOOLS_HEADER
#define DEBUG_TOOLS_HEADER
/*
Beispiel:
uart_puts( ByteToBin( gu8DS1337_Status ));
uart_putc(13);
Toggle_Bit(2);
*/
// *** Schalte ein was du brauchst ***
// #define TOGGLE_STATIC_BIT_USED
#define BYTE_TO_BIN_USED
#define WORD_TO_BIN_USED
#define BYTE_TO_HEX_USED
//#define FILL_TO_HEX_USED
#ifdef BYTE_TO_BIN_USED
extern char * ByteToBin(uint8_t u8Byte);
#endif
#ifdef WORD_TO_BIN_USED
extern char* WordToBin(uint16_t u16Word);
#endif
#ifdef BYTE_TO_HEX_USED
extern char * ByteToHex(uint8_t u8Byte);
#endif
#ifdef FILL_TO_HEX_USED
void FillHex(uint8_t u8Pos, uint8_t u8Mem)
#endif
#endif //DEBUG_TOOLS_HEADER