Guten Tag,
versuche über die serielle Schnittstelle (c Code) einen Sensor
anzusprechen.
Dieser liefert mir anschließend seine Messdaten zurück.
Starte ich den Code auf dem Linux Laptop funktioniert die Verbindung
einwandfrei.
Nun mache ich ein cross compile für meinen Embedded Linux Controller.
Code ist der gleiche nur Port ändert sich.
Der recv buffer bleibt jedoch leer. Daten werden gesendet. Verkabelung
stimmt ebenfalls.
1
#include<errno.h>
2
#include<fcntl.h>
3
#include<stdio.h>
4
#include<stdlib.h>
5
#include<string.h>
6
#include<termios.h>
7
#include<unistd.h>
8
#include<sys/select.h>
9
#include<sys/time.h>
10
#include<sys/types.h>
11
#include<sys/ioctl.h>
12
13
intset_interface_attribs(intfd,intspeed)
14
{
15
structtermiostty;
16
17
if(tcgetattr(fd,&tty)<0){
18
printf("Error from tcgetattr: %s\n",strerror(errno));
Laß' dir mal fd und FD_SETSIZE ausgeben (fd muß kleiner sein, sonst
tut's nicht).
select() kann auf den "großen" Linuxen normalerweise bis zum
File-Deskriptor 255 benutzt werden, es kann aber durchaus sein, daß das
beim embedded Linux beschnitten wurde.
Dann bliebe nur, stattdessen poll() zu benutzen (ist wahrscheinlich
sowieso die bessere Idee).
Markus F. schrieb:> Laß' dir mal fd und FD_SETSIZE ausgeben (fd muß kleiner sein, sonst> tut's nicht).>> select() kann auf den "großen" Linuxen normalerweise bis zum> File-Deskriptor 255 benutzt werden, es kann aber durchaus sein, daß das> beim embedded Linux beschnitten wurde.>> Dann bliebe nur, stattdessen poll() zu benutzen (ist wahrscheinlich> sowieso die bessere Idee).
Ich bin noch sehr am Anfang mit meinen Kenntnissen.
Habe nun folgendes versucht:
Führe den Sende Code auf dem Rechner aus und den Empfangscode auf dem
Embedded Controller. -> Daten werden auf dem Controller empfangen.
Nun das gleiche anders herum. Und die Daten werden auf dem Rechner
empfangen.
Der Code müsste als soweit stimmen.
Nur wenn Senden und Empfangen auf dem Controller läuft kackt er ab.
Abgesehen von der potentiellen select() Problematik: Dir ist bewußt, daß
Du Software-Handshake eingeschaltet hast (IXON)?
Das schließt eigentlich Binärdatenübertragung (die wohl - wie die
auskommentierte Senderoutine zu implizieren scheint - gewünscht ist?)
aus...
Markus F. schrieb:> Abgesehen von der potentiellen select() Problematik: Dir ist bewußt, daß> Du Software-Handshake eingeschaltet hast (IXON)?>> Das schließt eigentlich Binärdatenübertragung (die wohl - wie die> auskommentierte Senderoutine zu implizieren scheint - gewünscht ist?)> aus...
Nein das war mir nicht bewusst. Habe es nun auf OFF
fd liefert mir eine 3.
Trotzdem läuft es auf dem Controller nicht.
Hallo,
wie schon erwähnt funktioniert die Schnittstelle schon. Und der Port ist
ebenfalls richtig.
Wenn ich den Code nur auf die Read Funktion reduziere und dann auf dem
Embedded ausführe werden Daten empfangen. (PC<-->EmbController).
Wenn ich den Code nur auf die Write Funktion reduziere und auf dem
Embedded ausführe werden Hex Daten(Binär)
gesendet.(PC<-->EmbController).
Wenn der Code vollständig ist. Also write dann anschließend read.
Funktioniert es nicht.
Mit der shell habe ich es auch schon probiert. Dies funktioniert
ebenfalls.
Und mit einem normalen Terminalprogramm auf der seriellen Schnittstelle
funktioniert alles?
Es könnte auch am Treiber der seriellen Schnittstelle liegen.
Chris schrieb:> Und mit einem normalen Terminalprogramm auf der seriellen Schnittstelle> funktioniert alles?> Es könnte auch am Treiber der seriellen Schnittstelle liegen.
ich kann über diese Schnittstelle Daten empfangen. Also Daten (binär)
die ich vom PC sende.
wenn ich rein diesen code Ausführe
1
dlen=read(fd,buf,sizeof(buf)-1);
das gleiche auch in die andere Richtung.
Habe es noch zusätzlich mit dem Oszi überprüft. Stimmt soweit alles.
habe es auch über das Terminal versucht:
cat /dev/ttyS2
Daten werden empfangen vom PC.
Sobald write and read (Code erster Post) ausgeführt wird bleibt der
Buffer leer.
Ich habe das schon an einer 2ten ser Schnittstelle versucht. Gleiches
Ergebnis.
Habe etwas gelesen über die poll Funktion. Kann mir da jmd eine Hilfe
dazu geben.
Habe das alles nun auch über das Terminal versucht.
echo -ne "\xde\x01..usw." > /dev/ttyS2
über 2tes Terminal Fenster
cat /dev/ttyS2
Gesendet und empfangen wird etwas (Oszi). Jedoch zeigt die cat Funktion
nichts an.
Führe ich rein cat /dev/ttyS2 aus. Und sende die Daten über den PC
funktioniert es.
So habe alles nochmal als python script getestet. Auf dem Rechner läufts
wieder und auf dem Controler nicht (buffer LEER)