Frage nur, weil im Datenblatt für den Transreceiver 4,5-5,5V als Versorgungsspannung angegeben sind. Theoretisch könnte man ja Rx und Tx mit Levelschiftern versehen und den MCP2551 mit 5V von Pi versorgen.
Druckbare Version
Frage nur, weil im Datenblatt für den Transreceiver 4,5-5,5V als Versorgungsspannung angegeben sind. Theoretisch könnte man ja Rx und Tx mit Levelschiftern versehen und den MCP2551 mit 5V von Pi versorgen.
Ja muss mal schauen wie ich das mache.
Eine Aufsteckplatine ist bereits in Planung......nur der UART nervt mich noch ein bischen.
Auf der Platine befindet sich dann ein Mega128 als Slave der Befehle per UART bekommt.
Aber das ist im Moment erstmal nur eine Idee auf Papier :)
Hmm, ich hab mir jetzt erst einmal einen CAN-Transceiver von Maxim bestellt. Der arbeitet auch beim 3,3V. Mit einem Gedanken bzgl. Slave habe ich auch gespielt, allerdings braucht man dazu ja auch kein RasPi sondern da täte es ja auch jeder beliebige Rechner.
Wollte eher im Userspace per Daemon, Daten via CAN und Funk einsammeln/verschicken und entweder mit dem Pi dann als Webinterface darstellen oder via Socket nach draußen pusten. Mal sehen eventuell auch beides.
Ja genau sowas habe ich mir auch vorgestellt.
Das Pi soll dann halt als Zentrale für die Knoten dienen und ein Webinterface usw. bereit stellen.
Wenn am Anfang und / oder am Ende der Übertragung Raspi<>AVR Murks ankommt, in der Mitte der Übertragung die Daten jedoch komplett sind, hilft als Workaround auch ein eigenes Protokoll. Z.B. Zum Start mehrmals ein CHR(8) senden, welche die Gegenstelle immer als "Jetzt kommen neue Daten" versteht und am Ende der Übertragung ein CHR(9) und der Empfänger weiß dann: Datensatz vollständig und verarbeitet diesen und ignoriert alles, bis zum nächsten CHR(8).
Messwerte müssten dann halt z.B. als String übertragen werden.
Z.B. so (nicht getesteter angepasster Code meiner Empfangsroutine):
Den Gegenpart Raspi>>AVR kann man genauso lösen. Da weiß ich aber nicht, welche Programmiersprache du nutzt.Code:// Compile with: gcc /var/scripte/empfangen.c -o /var/scripte/empfangen
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#define BAUDRATE B19200
char MODEMDEVICE[]= "/dev/ttyAMA0"; // Schnittstelle
char eingang[255]=""; //Empfangenes
int anzahl=0; //Anzahl Einträge in der Senderliste
int laenge=0; //Anzahl empfangener Zeichen
int fd; // UART File descriptor
struct termios newtio={};
char WEBDEVICE[]="/tmp/webif.daten"; //Datei, wo die Empfangenen Daten abgespeichert werden, um sie dann per php auszulesen
unsigned char eingangleer() //Eingang nullen
{
int i;
for(i=0; i < laenge; i++){
eingang[i] = 0;
}
strcpy(eingang,"");
laenge==0;
c=0;
}
unsigned char receive() //Zeichen empfangen
{
int res;
unsigned char buffer;
res = read(fd, &buffer, 1);
return buffer;
}
unsigned char auswerten()
{ int fd1;
char ret;
if ((strcmp(eingang,"resetreset") ==0 )){
system("reboot");
}else{
/* Zum Schreiben öffnen */
if (laenge > 0){ // F
fd1 = open (WEBDEVICE, O_WRONLY|O_CREAT|O_TRUNC); //|O_TRUNC, S_IRUSR|S_IWUSR
if (fd1 == -1)
exit (-1);
write (fd1, eingang, laenge);
close (fd1);
system("chmod 644 /tmp/webif.daten");
}
}
}
int init()
{
/*** Init ***/
//O_RDONLY, O_WRONLY or O_RDWR -
//O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck)
// man 2 open fuer mehr Infos - see "man 2 open" for more info
// O_NOCTTY No ControllTeleType
/*fd1 = open(FILEDEVICE, O_WRONLY);
if (fd1 < 0){
printf("Fehler beim oeffnen von %s\n", FILEDEVICE);
exit(-1);
}*/
fd = open(MODEMDEVICE, O_RDONLY | O_NOCTTY);
if (fd < 0){
printf("Fehler beim oeffnen von %s\n", MODEMDEVICE);
exit(-1);
}
memset(&newtio, 0, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //setzt die neuen Porteinstellungen
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0; /* set input mode (non-canonical, no echo, ...) */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
return fd;
}
int main(int argc, char** argv)
{
char c;
int empfang=0;
init();
while (1)
{
c=receive();
if(c==8){ //Init-Zeichen >> Neuer Befehl trifft ein
strcpy(eingang,"");
eingangleer();
empfang=1;
}
if (empfang==1){
if((c==9)){ //Ende-Zeichen >> Datensatz fertig >> Auswerten
auswerten();
empfang=0;
eingangleer();
}else if(c>13&&c<128&&laenge<255){ //Keine Sonderzeichen nur ASCII Standard
eingang[laenge]=c; //empfangenes Zeichen anhängen
laenge++;
}
}
}
close (fd);
return 0;
}
Hey,
danke für den Tipp.
Ich denke mal um sowas werde ich auch nicht herum kommen. Ich finde einfach nicht die Ursache für das Problem....
Aber im Moment habe ich sowieso keine Zeit/Lust daran weiter zu basteln.... :(
- - - Aktualisiert - - -
Hey,
ich habe das Problem mit dem UART gelöst....ich habe heute mal die Baudraten durchprobiert und festgestellt, dass es bei 9600 Baud nicht mehr auftritt.
Damit ist die Ausgabe langer Texte zwar zu langsam, aber für meinen CAN-Adapter für das Raspberry Pi habe ich mir eh einen Mega128 ausgeguckt und der hat 2x UART....dann nehme ich einmal einen mit 9600 Baud für die Kommunikation mit dem Pi, wo ich dann nur kurze Befehle sende und den anderen mit 115200 Baud für die Kommunikation mit dem PC....sollte denk ich mal so klappen :/
Heyho,
meine Versuche mit dem Empfangen über UART klappen schon mal ganz gut (dank dem Beispiel von Peterfido).
Ich benutze zum Öffnen der temporäre Datei nun diesen Befehl:
File1 = open(FILEDEVICE, O_WRONLY | O_CREAT | O_APPEND);
Dadurch wird bei einem Enter der Text ans Ende der Datei angehängt, da die UART Ausgabe meines Knotens mehrere CRs besitzt.
Wie bekomme ich es nun hin, dass das CR + LF auch in der Textdatei erscheint?
Muss ich da einfach nur ein CR + LF in die Datei schreiben?
Kleiner Edit:
Die Kommunikation zwischen Pi und CAN-Bus klappt. Das Empfangsprogramm wird nun bei jedem Bootvorgang gestartet, lauscht und per Web kann das Empfangene ausgelesen werden (allerdings stimmt die Formatierung noch nicht ^.^).
Soll heißen, dass sich die Frage mit dem CR+LF erledigt hat? Hab letzte Woche Freitag auch mein Pi bekommen. Momentan funkt es mit einem RFM12-Modul (per Mega328 und USB/RS232-Wandler). Pustet mir die Daten auch via Ethernet raus und ich kann von jedem PC im Heimnetz die Daten auslesen. ;)
Nein die Frage mit dem CR+LF hat sich noch nicht erledigt :)
Aber ein Funkmodul an dem Pi ist auch ne tolle Idee.....ich hab noch ein Bluetoothmodul hier rumliegen :)
Hab auch schon ein bisschen an meiner Adapterplatine rumdesigned und da packe ich glaube ich auch noch ein BTM222 drauf ^.^
Muss nur gucken wie ich das mit der Pegelwandlung mache.....im Grunde kommuniziert der Mega128 Slave nur über UART mit dem Pi. Von daher brauche ich ja nur zwei Pins auf einen höheren Pegel bringen.....naja mal schauen ^.^
Edit:
Ok das mit dem CR + LF hat sich nun erledigt.
Das ganze sieht nun so aus (ist nur noch ein LF zuviel drin):
Bild hier
Die Frage ist jetzt nur warum kann ich durch einen Klick auf "Löschen" nicht die Datei löschen?
Der PHP Code sieht so aus:
Und weißt du wie ich das Textfeld auf der PHP Seite fixieren kann? Im Moment kann ich das Feld noch auseinander ziehen. Nur das würde ich gerne anders lösen.Code:if (isset($_REQUEST["Löschen"]))
{
shell_exec("sudo rm /tmp/UART_Empfang.txt");
};
hmm BTM ist langweilig ;) Da kannst du auch gleich nen USB-Dongle nehmen. Wenn du den Mega128 mit 5V betreiben willst, könnte die Pegelwandlung wie bei dem BTM-Mini-S von robotrack realisieren. Ansonsten halt 3,3V und nen CAN-Transceiver von Maxim nehmen. Die können mit 3,3V und CAN-Pegel von 5 und 12 V verarbeiten. Liegen bei mir auf Arbeit in der Post ;).