Rpi zero W, magisk bug seriekommunikation

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6888
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Rpi zero W, magisk bug seriekommunikation

Inlägg av Marta »

Det lär vara möjligt att skippa BT och använda ttyAMA0 på GPIO, men hittar ingen vettig beskrivning på hur denna konfiguration skall gå till. Frågar därför forumet om hjälp med detta. Mycket tacksam om detta kan lösas.

Använder Debian Jessie lite.

cat /proc/version
Linux version 4.4.50+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #970 Mon Feb 20 19:12:50 GMT 2017
Senast redigerad av Marta 30 augusti 2017, 21:23:50, redigerad totalt 1 gång.
Borre
Inlägg: 4564
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Rpi zero W, swap UART's ?

Inlägg av Borre »

Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6888
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Rpi zero W, swap UART's ?

Inlägg av Marta »

Tack! Där fanns rättstavad info hur ttyAMA0 sätts till GPIO.

Tyvärr är där mer problem kvar. screen /dev/ttyAMA0 57600 fungerar perfekt för att skicka manuellt och se vad som tas emot på skärmen.
Däremot fungerar inte mottagningen i programmet. Sändning funkar, det finns tecken in på UART checkat med scope, men read( returnerar noll efter timeout och inga tecken. Någon som har en fungerande init till serieport i gcc linux? Bör vara utan alla "hjälpsamheter". Det som programmet ser skall vara identiskt med det som porten kommunicerar.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6888
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Rpi zero W, swap UART's ?

Inlägg av Marta »

Här är en av de init jag provat, alla med samma resultat...

#define BAUDRATE B57600
#define MODEMDEVICE "/dev/ttyAMA0"

int fd,c, res;
struct termios oldtio,newtio;
char buf[255];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );


memset(&newtio, 0, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = 0 //IGNPAR; ändrad
newtio.c_oflag = 0;

/* set input mode (non-canonical, no echo,...) */
newtio.c_lflag = 0;

newtio.c_cc[VTIME] = 10 //ändrad 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 0 //ändrad 5; /* blocking read until 5 chars received */

tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av lillahuset »

Det var flera år sedan sedan jag programmerade serieport i Linux men jag har för mig att det rekommenderades att man läste termios först och sedan ändrade i den med or och and och slutligen skrev.
Förmodligen är det ingen hjälp men kanske kan vara värt att testa.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6888
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av Marta »

Är redan provat.

En egendomlighet är att "screen" för att skicka manuellt via porten endast funkar första gången den startas. Avslutas den och sedan startas på nytt så skickas tecknen, men ingen mottagning.

Måste ha en lösning på detta ganska så nu. En setup som fungerar och där allt "hjälpsamheter" är avstängda. Börjar bli smått desperat nu.

Kan man komma åt porten på någon lägre nivå utan så mycket "hjälpsam" dynga inblandad? ioctl?
Kulla
Inlägg: 1264
Blev medlem: 7 januari 2010, 10:06:11
Ort: Sandared
Kontakt:

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av Kulla »

Vad försöker du göra egentligen? Ha den på virtuell serie port över usb? Så har jag det idag, är ganska enkelt. Kopplas sen till den med minicom från linux över samma usb kabel, funkar klockrent. Om det är det du är efter bara skriv så jag förklarar hur man gör
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av adent »

Tveksamt om det är till hjälp, men detta har jag kört på en RPi, (inte 3) mot serieport.

http://electronics.chroma.se/servo.c

MVH: Mikael
ie
EF Sponsor
Inlägg: 1271
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av ie »

Hej.

Så här ser min init ut. Körs på en RPI2.

Kod: Markera allt

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
#include <limits.h>

FILE *uart_linux_str;

/* Use this variable to remember original terminal attributes. */
struct termios saved_attributes;

void reset_input_mode(void)
{
	tcsetattr(STDIN_FILENO, TCSANOW, &saved_attributes);
}

/* Set the O_NONBLOCK flag of desc if value is nonzero,
or clear the flag if value is 0.
Return 0 on success, or -1 on error with errno set. */
int set_nonblock_flag (int desc, int value)
{
	int oldflags = fcntl(desc, F_GETFL, 0);

	/* If reading the flags failed, return error indication now. */
	if (oldflags == -1)
		return -1;

	/* Set just the flag we want to set. */
	if (value != 0)
		oldflags |= O_NONBLOCK;
	else
		oldflags &= ~O_NONBLOCK;

	/* Store modified flag word in the descriptor. */
	return fcntl (desc, F_SETFL, oldflags);
}

int uart_linux_init(void)
{
	int uart_linux_str_fd;
	struct termios tattr;
	
	if (!(uart_linux_str = fopen("/dev/ttyAMA0","w+b")))
	{
		fputs("Error can't create uart_linux stream\n",stderr);
		return -1;
	}	

	uart_linux_str_fd = fileno(uart_linux_str);
	set_nonblock_flag (uart_linux_str_fd,1);
	tcgetattr(uart_linux_str_fd, &tattr);
	cfmakeraw(&tattr);
	cfsetospeed(&tattr,B9600);
	tcsetattr(uart_linux_str_fd, TCSAFLUSH, &tattr);
	
	return 0;
}
/Ingvar
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6888
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av Marta »

Tackar för detta. Allt sammantaget så ledde det på rätt spår och några missar i config blev avlägsnade. Det var flow control som låste det, samt att jag satte baudrate på fel sätt. Skall ju vara en fördefinierad konstant och inte ett tal rakt av... :oops: :oops: :oops: Väldigt vad lätt det är att läsa B i exemplen som 8 när siffra är i förväntan.
ie
EF Sponsor
Inlägg: 1271
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av ie »

:)

Jag var själv förvånad över hur knepigt det var att få igång "trivial" kommunikation, dvs skicka ut det jag skickar o ta emot det som kommer in (utan att anropande rutin "hänger" om det inte finns någon data).

/Ingvar
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6888
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av Marta »

Där var lite klabb, men det är bara att gilla läget. Blev inte vad jag förväntade med att sätta både timeout och max antal tecken innan den går vidare... Bäst att alltid läsa det finstilta noggrannt.
Användarvisningsbild
maDa
Inlägg: 4073
Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:

Re: Rpi zero W, magisk bug seriekommunikation

Inlägg av maDa »

När jag skulle ha igång seriell konsoll på min RPizw så satte jag bara bootargs console=ttyAMA0 sen fungera det.
Skriv svar