Всем привет) В общем я на форуме не давно, не знаю даже как спросить, чтоб вы меня не завалили письмами типо я идиот и т.д. Так что спрошу как есть...
Пишу программу для Асинхронного считывания данных с ком порта...
Ну как пишу, написал) Всё работает, НО, не так как хочется...
Скажем устройство передаёт мне пакет из 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
Вот это я называю рассыпается)
А так как у меня это в бесконечном цикле нужен второй поток чтобы исправить, а это накладки на проц и оперативку...
А мне они не к чему)
Да и не люблю я сишные потоки)