LINUX.ORG.RU

Сообщения Titan_2014

 

Не работает оператор возврата return язык чистый си

Форум — General

Всем привет. У меня проблема с функцией. Она должна открывать JSON файл, по
ключу, доставать значение, засовывать это значение в массив и возвращать
ссылку на первый элемент массива... Она работала, но я переставил
линукс, переустановил codeblocks и она теперь не фурычит... На этапе возврата значения, где стоит return bufer она ничего не возвращает...
Да, и не задавайте вопросов почему я сканирую строчки по 50 символов, у меня json такой... Вся проблема в операторе возврата... Но вот какая?

int JSON_parse_key (char *open_file,char *key,int size_key){
    FILE *in_file=fopen(open_file,"r");
    char word1[50];
      while (fscanf(in_file,"%s",&word1)>0) {
            if (strstr(word1,key)) {
                    int dlina = strlen(word1);
                    int sizess = dlina-size_key-6;
                    int i = size_key + 4;
                    usleep(1000);
                    int ert =0;
                    unsigned char eee[sizess];
                    for (;i<dlina-2;i++,ert++) {eee[ert]=word1[i];}
                    uint8_t *dd = &eee;
                    int a=0; int ee=0;
                    char buf [2];
                    unsigned char bufer [sizess/2];
                    for (;a<sizess;a+=2) {
                            sprintf(buf,"%c%c",*(dd+a),*(dd+a+1));
                            int ar = strtol(buf,NULL,16);
                            char us = 0x00;
                            us=ar;
                            bufer[ee] = us;
                            ee++;
                                          }
                            fclose(in_file); return bufer;

                                    }

                                              }


                                                                    }


void chegoto () {
      char kluch [30];
      sprintf(kluch,"%s[%i]","IEEE",key);
      char *dd = JSON_parse_key("output.JSON",&kluch,strlen(kluch));
    /*ВОТ так раньше *dd возвращал  ссылку на первый элемент массива значения...
Тоесть в json есть число 892040, я его распарсиваю и получаю массив {89,20,40}  Апотом пишу *dd  и получаю ссылку на число 89...  А сейчас не работает ничего, вообще ума не приложу что могло случиться с кодом, я всеголишь переставил линукс....*/
}

Titan_2014
()

COM порт, буфер чтения заполняется частями... Язык чистый C

Форум — General

Всем привет) В общем я на форуме не давно, не знаю даже как спросить, чтоб вы меня не завалили письмами типо я идиот и т.д. Так что спрошу как есть...
Пишу программу для Асинхронного считывания данных с ком порта...
Ну как пишу, написал) Всё работает, НО, не так как хочется...
Скажем устройство передаёт мне пакет из 18 байт. Моя программа принимает его кусками, сначала там 4, потом 10, потом опять 4 И каждый раз эти цыфры произвольные...
Никогда не приходит пакет целиком, для того чтобы его собрать приходится создавать второй поток и вобщем там я и завис, но я думаю что проблема где-то в конфигурации...
Вот код:

#include "putt1.h" 
/*Этой мой заголовок в нём лежит:*/
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <pthread.h>
#include "stdint.h"
#define FALSE 0
#define TRUE 1
/*Импортируемые функии лучше не задумывайтесь зачем они, это к делу отношения не имеет*/
extern int FCS(char *rf,int len );
extern void sbor_adresov (char *bufer);
extern void Active_EP_Request_JSON (char *bufer);
extern  void Simple_desc_request_JSON (char *bufer);
extern void ZDO_IEEE_ADDR_req_JSON (char *bufer);
void signal_handler_IO (int status);   /* объявление обработчика сигнала */
volatile int STOP=FALSE;
volatile int flags;
int wait_flag=TRUE;                    /* TRUE до получения сигнала */
int res;

struct termios options,options_old;
struct sigaction saio;
char SEND[256];
char bufer [256];
unsigned char buf[256];
char *ports2[]= {
               "/dev/ttyUSB0",
               "/dev/ttyUSB1",
               "/dev/ttyUSB2",
               "/dev/ttyUSB3",
               "/dev/ttyUSB4",
               "/dev/ttyUSB5",
               } ;

#include <pthread.h>
#include <string.h>
#define FALSE 0
#define TRUE 1
int fd;
void signal_handler_IO (int status)[br]
      {
        wait_flag = FALSE;
      
      }



int open_ports(){

    fd=open(ports2[0],O_RDWR|O_NOCTTY| O_NDELAY|O_NONBLOCK);

    if (fd<0){ return 1;}
    printf("\nPort Open - 1  \n");
    int fres = tcflush(fd, TCIFLUSH);
    if (fres < 0){printf("tcflush() error %d\n", fres);}
saio.sa_handler = signal_handler_IO;
sigemptyset(&saio.sa_mask);
saio.sa_flags = saio.sa_flags|SA_SIGINFO;
saio.sa_restorer = NULL;
saio.sa_sigaction = signal_handler_IO;
sigaction(SIGIO,&saio,NULL);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&options_old);
 options.c_cflag |= (B115200 | CS8 | CLOCAL | CREAD| CRTSCTS  );
 options.c_cflag &= ~( ICANON );
     options.c_iflag |= IGNPAR|IGNBRK;
     options.c_cflag &= ~(CS5 | CS6 | CS7 );
     options.c_cflag |= CS8;
     options.c_iflag &= ~(IXON | IXOFF | IXANY );
	 options.c_cflag &= ~(PARENB | PARODD | ECHO | ECHOE |ISIG ); 
      options.c_oflag &= ~OPOST;
      options.c_lflag = 0;
     options.c_cc[VMIN] = 0;     
      options.c_cc[VTIME] = 0;
      options.c_cflag &= ~ CSTOPB;
       options.c_cflag &= ~CSIZE;
     tcflush(fd, TCIFLUSH);
     tcsetattr(fd,TCSANOW,&options);



                                    }

void* read_only () {
  open_ports() ;

  while (STOP==FALSE) {[br] /*Это бесконечный цикл неосновного потока, раньше программа была однопоточная и было удобно, пока я не заметил, что буфер мой рассыпается на части*/[br]

    if (wait_flag==FALSE) { 
          int  ee=0;
            res = read(fd,buf,255);
           
          for (;ee<res;ee++) {
             printf("buf[%i]:%x \n",ee, buf[ee]);
             bufer[ee]=buf[ee];

                             }
           
printf ("---\n");

            wait_flag = TRUE;
            int fres = tcflush(fd, TCIFLUSH);
            if (fres < 0){printf("tcflush() error %d\n", fres);}


                                  }


                        }

        tcsetattr(fd,TCSANOW,&options_old);


                }
int reads () {
    pthread_t t1;
    pthread_create(&t1,NULL,read_only,NULL);
/*Ну это запуск неосновного потока*/
             }
int write_read (char *Send_buf,int len){ /*Запись в порт работает прекрасно*/
int e=4;
unsigned char result =0x00;
for (;e<len;e++){result ++;}
Send_buf[1] = result;
int i=0;
    int resFCS = FCS(Send_buf,len);
    for (;i<len;i++){
        SEND [i] = Send_buf [i];
                     }
        SEND [len] = resFCS;

int foll;
usleep(500);
foll = write(fd, SEND, sizeof(SEND));
usleep(500);
if (foll < 0){printf("write error %d\n", foll);}


                                        }
Вобщем я перепробовал и канонический и неканонический ввод,
кучу разных настроек из интернета и сам побредил чуток с конфигурацией А буфер как рассыпался так и рассыпается
FE 45 56 87 DD 55 AA 44 99 11 88 11 88 00 11 - должен быть такой,
а приходит
FE 45 56 87 потом
DD 55 AA 44 99 потом
11 88 11 88 00 11
Вот это я называю рассыпается)
А так как у меня это в бесконечном цикле нужен второй поток чтобы исправить, а это накладки на проц и оперативку...
А мне они не к чему)
Да и не люблю я сишные потоки)

Titan_2014
()

RSS подписка на новые темы