filipe3632 Posted June 12, 2013 at 09:39 AM Report #512231 Posted June 12, 2013 at 09:39 AM Bom dia tenho um programa em c que lê dados da porta rs232, e que traz dados de um arduino. E neste momento o que estou a receber é isto: Luminosidade: 450 Temperatura: 18 e isto tem um delay, e isto vai mandando sempre de novo conforme o que medir o sensor. O que eu precisava era de tratar aquilo da seguinte forma: Ter num lado a temperatura e noutro a luminosidade, e guardar o valor de cada uma em variáveis diferentes. Alguém me pode ajudar? Aqui está o meu código #include <errno.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdio.h> int set_interface_attribs (int fd, int speed, int parity) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { perror("error from tcgetattr"); return -1; } cfsetospeed (&tty, speed); cfsetispeed (&tty, speed); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars // disable IGNBRK for mismatched speed tests; otherwise receive break // as \000 chars tty.c_iflag &= ~IGNBRK; // ignore break signal tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls, // enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= parity; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if (tcsetattr (fd, TCSANOW, &tty) != 0) { perror("error from tcsetattr"); return -1; } return 0; } void set_blocking (int fd, int should_block) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { perror("error from tggetattr"); return; } tty.c_cc[VMIN] = should_block ? 1 : 0; tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout if (tcsetattr (fd, TCSANOW, &tty) != 0) perror("error setting term attributes"); } int main () { char *portname = "/dev/ttyACM0"; int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { perror("Impossivel abrir a porta: "); //error_message ("error %d opening %s: %s", errno, portname, strerror (errno)); return; } set_interface_attribs (fd, 9600, 0); // set speed to 115,200 bps, 8n1 (no parity) set_blocking (fd, 0); // set no blocking //write (fd, "hello!", 7); // send 7 character greeting char c, buf [100]; int n=1, i=0; while(1) { n = read (fd, &c, sizeof(char)); //printf("%c",c); if(n>0) { buf[i]=c; i++; } else { if(i==0) printf("VAzia\n"); else { buf[i]='\0'; i=0; printf("(%s)", buf); } } } } Peace, Love & Empathy by: Kurt Cobain
HappyHippyHippo Posted June 12, 2013 at 09:42 AM Report #512233 Posted June 12, 2013 at 09:42 AM qual é exactamente os dados que tens na string que queres separar ? os dados estão na variável "buf" ? 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Loira Posted June 12, 2013 at 09:48 AM Report #512236 Posted June 12, 2013 at 09:48 AM http://www.linguagemc.xpg.com.br/strings.html manipulaçao de strings.. ve la se ajuda :pp NAO TE ESQUEÇAS NUNCA DAS BIBLIOTECAS* (eu vi que as tens, mas nunca e demais confirmar ahah) 1 Report "Hello guys. You don't know me, but I know you. I want to play a game. Here's what happens if you lose" "Só erra quem produz... Mas só produz quem não tem medo de errar" irc @Login NickServ Acesso a Number1 autorizado
filipe3632 Posted June 12, 2013 at 10:01 AM Author Report #512246 Posted June 12, 2013 at 10:01 AM Sim happy, é no buf Obrigado, é que preciso mesmo desta parte pra depois poder mandar pra base de dados. Peace, Love & Empathy by: Kurt Cobain
HappyHippyHippo Posted June 12, 2013 at 10:30 AM Report #512255 Posted June 12, 2013 at 10:30 AM qual é exactamente os dados que tens na string que queres separar ? tens de dizer o que tens na variável buf (exactamente, sem tirar nem por !!), sem isso é impossível te dizer o que fazer !! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
filipe3632 Posted June 12, 2013 at 10:34 AM Author Report #512261 Posted June 12, 2013 at 10:34 AM É isto só que recebo: Luminosidade: 450 Temperatura: 18 e durante o delay que não recebe nada ele escreve Vazia e quando lê aquilo acima lê assim: (Luminosidade: 450 Temperatura: 18 ) Peace, Love & Empathy by: Kurt Cobain
HappyHippyHippo Posted June 12, 2013 at 10:38 AM Report #512264 Posted June 12, 2013 at 10:38 AM int lum, temp; //printf("(%s)", buf); if (sscanf(buf, "Luminosidade: %d\nTemperatura: %d", &lum, &temp) != 2) { printf("Erro de leitura de dados\n"); } else { printf("Luminosidade: %d\nTemperatura: %d\n", lum, temp); // do stuff with "lum" and "temp" ... } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
filipe3632 Posted June 12, 2013 at 10:46 AM Author Report #512270 Posted June 12, 2013 at 10:46 AM só uma coisa, tu comentaste o printf do buf não vou precisar de imprimir isso já pois nao? Peace, Love & Empathy by: Kurt Cobain
HappyHippyHippo Posted June 12, 2013 at 10:50 AM Report #512271 Posted June 12, 2013 at 10:50 AM eu comentei para saberes onde colocar o código, o que tens de fazer só tu é que sabes 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
filipe3632 Posted June 12, 2013 at 11:17 AM Author Report #512284 Posted June 12, 2013 at 11:17 AM Obrigado 🙂 Só mais uma coisa, como eu não tenho o arduino em casa, tenho de testar isto de outra forma, e eu ja fiz uma especie de programa, mas dá-me uma sério de warnings, e quando faço ./a.out ele aparece isto: segmentation fault (core dumped). Alguém sabe o que pode ser? Aqui está o código #include<stdio.h> #include<string.h> int main (){ int lum; int temp; char str = "(luminosidade: 30O\ntemperatura:18\n)"; sprintf("%s",str); if (sscanf(str, "Luminosidade: %d\nTemperatura: %d", &lum, &temp) != 2) { printf("Erro de leitura de dados\n"); } else { printf("Luminosidade: %d\nTemperatura: %d\n", lum, temp); } } Peace, Love & Empathy by: Kurt Cobain
pikax Posted June 12, 2013 at 11:18 AM Report #512286 Posted June 12, 2013 at 11:18 AM //char str = "(luminosidade: 30O\ntemperatura:18\n)"; //tas a declarar um char mas estas a instanciar como um array de char... char *str = "(luminosidade: 30O\ntemperatura:18\n)"; Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
filipe3632 Posted June 12, 2013 at 11:30 AM Author Report #512291 Posted June 12, 2013 at 11:30 AM Sim isso estava mal, tens razão, obrigado, mas ainda da um warning, e depois a fazer ./a.out dá o mesmo erro :x já descobri porque, tinha sprintf, e era printf, pq ja era um char só que o programa está a dar: Erro de leitura de dados e não devia dar Peace, Love & Empathy by: Kurt Cobain
pikax Posted June 12, 2013 at 11:36 AM Report #512300 Posted June 12, 2013 at 11:36 AM @tu só que o programa está a dar: Erro de leitura de dados e não devia dar @happy tens de dizer o que tens na variável buf (exactamente, sem tirar nem por !!), sem isso é impossível te dizer o que fazer !! @tu É isto só que recebo:Luminosidade: 450 Temperatura: 18 como tens no teu programa de teste: "(luminosidade: 30O\ntemperatura:18\n)"; como e' que estas a ler: if (sscanf(str, "Luminosidade: %d\nTemperatura: %d", &lum, &temp) != 2) //... 1 Report Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
filipe3632 Posted June 12, 2013 at 11:54 AM Author Report #512307 Posted June 12, 2013 at 11:54 AM Continua a dar erro de leitura de dados, acho que agora esta certo, mas não deve estar, o programa tem sempre razao xD #include <stdio.h> #include <string.h> int main (){ int lum; int temp; char *str = "(luminosidade:30O\ntemperatura:18\n)"; printf("%s",str); if (sscanf(str, "(luminosidade:300\ntemperatura:18\n)", &lum, &temp) != 2) { printf("Erro de leitura de dados\n"); } else { printf("luminosidade:300\ntemperatura:18\n", lum, temp); } } Peace, Love & Empathy by: Kurt Cobain
pikax Posted June 12, 2013 at 11:57 AM Report #512308 Posted June 12, 2013 at 11:57 AM (edited) 30O o que esta' escrito: tres, zero, O maisculo. mete assim: char *str = "(luminosidade:300\ntemperatura:18\n)"; EDIT: (sscanf(str, "(luminosidade:300\ntemperatura:18\n)", &lum, &temp) != 2) isto esta' mal!! Edited June 12, 2013 at 11:58 AM by pikax Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
filipe3632 Posted June 12, 2013 at 12:02 PM Author Report #512310 Posted June 12, 2013 at 12:02 PM enganei-me em cima no 300 A condição está mal? Peace, Love & Empathy by: Kurt Cobain
pikax Posted June 12, 2013 at 01:14 PM Report #512324 Posted June 12, 2013 at 01:14 PM (sscanf(str, "(luminosidade:300\ntemperatura:18\n)", &lum, &temp) != 2) qual e' a diferenca? (sscanf(str, "Luminosidade: %d\nTemperatura: %d", &lum, &temp) != 2) Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender. A beleza de um código está em decompor problemas complexos em pequenos blocos simples. "learn how to do it manually first, then use the wizzy tool to save time." "Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now