Toon posts:

[c] Via Seriele poort data sturen onder linux

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben voor mijn stage bezig met een universal communicator.

Het is een apparaat met een ethernet ingang/uitgang en een 8 tal seriele poorten.
Aan iedere poort hangen een x aantal display.

De communicator moet het tcp-ip pakketje ontvangen van een server(dit werkt al)

Vervolgens moet hij dit omzetten en vertalen naar hexadicmale getallen en die moeten op de seriele lijn gezet worden. (de displays checken zelf ieder berichtje af of het voor hun is)

Ik krijg het nu niet voor elkaar om die data goed op de lijn te zetten, ik gebruik deze code : (ps die communcator draait op een linux kernel)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define sPort = "/dev/ttyM0"
stuct termios tty;
int rs485Handler, verzondenbytes, ret;

int main()
{   unsigned int temp;

     rs485Handler = open(sPort, O_RDWR | O_NDELAY);

     tty.c_cflag = CREAD | CLOCAL | B9600 | CS8 | CRTSCTS;
     tty.c_oflag = 0;
     tty.c_lflag = 0;
     tty.c_iflag = 0;
     tty.c_cc[VMIN] = 0;
     tty.c_cc[VTIME] = 0;
     tcsetattr(rs485Handler, TCSANOW, &tty);

     ret = 0;
     temp = 0x00;

     verzondenBytes = write(rs485Handler, temp, ret);

     close(rs485Handler);
}

dit werkt dus niet. er gebeurt namelijk nix op de displays terwijl dit wel zo moeten gebeuren. De baudrate moet 9k6 zijn. Wat doe ik fout, kan je ook op een andere manier data op de seriele poort zetten. de poort bevindt zich overigens in /dev/ttyM0

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
raw modus zetten ? handshaking uit ?

Check of er wel data komt op de seriele lijn. Zo ja, check of er data komt op je 485 lijn. Duszzz... zoek waar de oorzaak zit.

[ Voor 65% gewijzigd door farlane op 09-11-2004 11:12 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Verwijderd schreef op 09 november 2004 @ 10:04:
dit werkt dus niet. er gebeurt namelijk nix op de displays terwijl dit wel zo moeten gebeuren. De baudrate moet 9k6 zijn. Wat doe ik fout, kan je ook op een andere manier data op de seriele poort zetten. de poort bevindt zich overigens in /dev/ttyM0
Ik heb iets dergelijks wel eens opgelost met het 'chat' tooltje dat bij 'pppd' hoort.

Dat is een simple scriptbaar send/response tooltje voor seriele communicatie, als je niet al te hoge eisen hebt is het wel bruikbaar. Ik gebruikte het ooit om SMS berichten te versturen over een inbel SMSC.

Maar wat is dat ttyM0 device?
Seriele poorten bestuur je toch via ttyS0???

Verwijderd

Topicstarter
Ja het is geen pc met normale linux distro waar we het over hebben, het is dit device
Afbeeldingslocatie: http://nnz-ipc.moxa.ru/images/products/uc7400.jpg

Ik ben nu tot de conclusie gekomen dat het fout gaat bij het versturen van de hexadicmale waardes. Als ik gewoon een char stuurt dan geeft hij geen problemen. maar bij hexadimale waardes wel.

plus ik denk dat "ret" de grote van de verstuurde data moet aangeven, in dit geval dus 4

Ik denk dat hij idd op raw data moet staan. Ik heb alleen nul ervaring met linux en het communiceren over de seriele poort. Dit is de eerst keer dat ik dit doe :S.

Ik heb heel veel gelezen op internet en hier ook het een en ander van opgestoken maar niet genoeg om de oplossing te vinden

[ Voor 39% gewijzigd door Verwijderd op 09-11-2004 11:31 ]


Verwijderd

Heb je setserial gebruikt?

Verwijderd

Topicstarter
nee nog niet ben nu ff hierna aan het searchen, lol er staat een mini-linux os op het apparaat dus setserial en get serial is niet aanwezig

[ Voor 51% gewijzigd door Verwijderd op 09-11-2004 11:55 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:16

Creepy

Tactical Espionage Splatterer

write() verwacht als 2de parameter een buffer (const void *buf) met daarin de te schrijven waarden. Je stopt hier nu een int in (temp)
De 3de parameter geeft het aantal bytes aan dat er uit de buffer geschreven moet worden. Jij geeft nu de waarde van ret mee, en die is 0. Dus zal er niks geschreven worden.

Als je wel wat had geschreven was het programma waarschijnlijk gecrasth aangezien een int niet gelijk is aan een const void *buf (zie: man 2 write).

[ Voor 3% gewijzigd door Creepy op 09-11-2004 12:15 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
hmm interessant hij verwacht inderdaad een buffer, ik moet wel echt die hexadecimale waarde zo zetten dat de displays op de lijn snappen dat het een hexadecimale waarde is.

hoe ga ik dit nu in een buffer verpakken? ben ook al zelf aan het googlen dus misschien kom ik er zo zelf op

--> hmmz dus ik kan alleen chars write-en als ik het goed begrijp

--> heb het net ff aangepast, zodat ie alleen strings stuurt maar er komt nix op het display, ik weet dus niet of hij de data wel uberhaupt op de lijn zet

[ Voor 30% gewijzigd door Verwijderd op 09-11-2004 12:30 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:16

Creepy

Tactical Espionage Splatterer

Strings? de buffer is een pointer naar een stuk geheugen. Niks meer, niks minder.
Een char betekent niet automatisch dat het een karakter moet zijn, je kan hier bijv. ook die 0x00 aan toekennen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

C:
1
2
char temp=0x00;
verzondenBytes = write(rs485Handler, &temp, sizeof(temp));

En meten of er data op je lijnen komt doe je met rs232-analyzers of (beter nog) oscilloscoop.
Verder zou ik ook even controleren of de poort wel wordt geopend (return value van open-functie). En hetzelfde voor tcsetattr.

Verwijderd

Topicstarter
bij open test ik dat al (heb er alleen ff if-loopje niet bij gezet.

En die ocsiloscoop is echt een goed idee!!!!

bedankt ga het meteen proberen

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Verwijderd schreef op 09 november 2004 @ 13:08:
En die ocsiloscoop is echt een goed idee!!!!
Volgens mij had ik al aangegeven dat je moest checken of er wel data op je lijn verschijnt.

Anywayz, je moet dus waarschijnlijk nog wel de raw modus inschakelen. ( dat kan met tcsetattr of met cfmakeraw )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
er komt idd geen data op de lijn helemaal nix.
Ik ga us proberen om op Raw-modus over te schakkelen (bedankt voor de tip)

zal zo het resultaat posten

Verwijderd

Topicstarter
hmm de poort openen gaat goed. (ik krijg een error als ik er bijv ttyS0 van maak. maar ik zie nog geen actie

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
JA ik heb echt alles gedaan zoals in de manual.
Volgens mij ligt het gewoon aan mijn kabel ofzo
Hij geeft namelijk precies aan dat ie alle bytes verzonden heeft maar ik zie geen activiteit op het apparaatje waarover de data zou gaan.

[ Voor 42% gewijzigd door Verwijderd op 09-11-2004 15:17 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Als je poorten in je box 485 zijn kan het nog goed zijn dat je moet handshaken om de transmitter in te schakelen.

Vaak moet dit met de RTS zijn.

Automatisch schakelen werkt vaak niet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Farlane ik zie dat je er veel verstand van hebt, heb je misschien ook een link over dat handshaken voor mij??

je zou me echt heel erg helpen
Pagina: 1