Sida 1 av 1

Rpi zero W, magisk bug seriekommunikation

Postat: 30 augusti 2017, 14:36:31
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

Re: Rpi zero W, swap UART's ?

Postat: 30 augusti 2017, 14:57:09
av Borre

Re: Rpi zero W, swap UART's ?

Postat: 30 augusti 2017, 21:10:20
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.

Re: Rpi zero W, swap UART's ?

Postat: 30 augusti 2017, 21:22:55
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);

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 30 augusti 2017, 21:52:05
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.

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 07:42:32
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?

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 09:26:24
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

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 10:18:47
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

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 11:43:15
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

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 12:08:56
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.

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 12:12:31
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

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 31 augusti 2017, 18:55:38
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.

Re: Rpi zero W, magisk bug seriekommunikation

Postat: 3 september 2017, 12:19:52
av maDa
När jag skulle ha igång seriell konsoll på min RPizw så satte jag bara bootargs console=ttyAMA0 sen fungera det.