Новичок
Джуниор
Регистрация: 13.08.2015
Сообщений: 2
|
Чтение из Ардуины на СИ
Здравствуйте.
Я не торопливо изучаю язык СИ, и вот написал программу, которая открывает /dev/tty* и читает данные из Ардуины.
Собственно хочется чтоб уважаемое сообщество обратило свой взор на нижеследующий код и как следует покритиковало его.
PHP код:
#include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #define BUFSIZE 128
char bRead[BUFSIZE] = {0,}; char er_log_str[50]={0,}; char device[14]={0,}; char papka[30]={0,}; char str_iz_file[100] = {0,};
void error_log() { time_t t; time(&t); FILE *f; f = fopen("Error.log", "a"); fprintf(f, "%s. ", er_log_str); fprintf(f, "%s", ctime( &t)); printf("Write to Error.log\n"); fclose(f); exit(0); }
void error_to_filebd() { FILE *f; f = fopen(papka, "w"); fprintf(f, "%s", "8888"); fclose(f); printf("Zapisal Oshibky\n"); snprintf(str_iz_file, 100, "%s","Error"); }
int open_port(void) { int fd; fd = open(device, O_RDWR | O_NOCTTY |O_NONBLOCK); if(fd == -1) { snprintf(er_log_str, 50, "%s","Error - NOT open port"); error_log(); }
else { struct termios options; tcgetattr(fd, &options); cfsetispeed(&options, B57600); cfsetospeed(&options, B57600); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cc[VMIN] = 1; options.c_cc[VTIME] = 1; options.c_lflag = ICANON; options.c_oflag = 0; options.c_oflag &= ~OPOST; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &options); } return fd; }
void main(int argc, char *argv[]) { if(argc!=3) { printf("Primer zapyska - ./port /dev/ttyACM1 /var/www/tim/filebd\n"); snprintf(er_log_str, 50, "%s","Not use device (/dev/tty*)"); error_log(); } snprintf(device, 14, "%s", argv[1]); snprintf(papka, 30, "%s", argv[2]); int d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, thum, hum, pir1, knop1, knop2, ar_summ; int err_count1 = 0; int err_count2 = 0; unsigned int i; int fd = open_port(); sleep(2); if (fd < 0) return; tcflush(fd, TCIFLUSH);
while(!VINTR) { usleep(490000); read(fd, bRead, BUFSIZE);
for(i = 0; i<=strlen(bRead); i++) { if(bRead[i] == '\r' || bRead[i] == '\n') { bRead[i] = '\0'; tcflush(fd, TCIFLUSH); break; } } ////// Проверка A-Z /////// char first_sim = '0'; if(bRead[0] == 'A' && bRead[strlen(bRead)-1] == 'Z') { sscanf(bRead,"%c %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &first_sim, &ar_summ, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &thum, &hum, &pir1, &knop1, &knop2); err_count1 = 0; }
else { tcflush(fd, TCIFLUSH); memset(bRead, 0, sizeof(bRead)); err_count1++; if(err_count1 > 10) { err_count1 = 0; snprintf(er_log_str, 50, "%s","Error 6 - err_count1_8"); error_to_filebd(); } continue; } ///////// Проверка суммы //////// int summa = d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 + d11 + d12 + d13 + thum + hum + pir1 + knop1 + knop2; if(summa != ar_summ) { tcflush(fd, TCIFLUSH); memset(bRead, 0, sizeof(bRead)); summa=0; ar_summ=999; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; d8=0; d9=0; d10=0; d11=0; d12=0; d13=0; thum=0; hum=0; pir1=0; knop1=0; knop2=0; err_count2++; if(err_count2 > 10) { err_count2 = 0; snprintf(er_log_str, 50, "%s","Error 7 - err_count2_8"); error_to_filebd(); } continue; } else { err_count2 = 0; } ////// Сравнение строк ////// if(strcmp(bRead, str_iz_file)==0) { memset(bRead, 0, sizeof(bRead)); summa=0; ar_summ=999; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; d8=0; d9=0; d10=0; d11=0; d12=0; d13=0; thum=0; hum=0; pir1=0; knop1=0; knop2=0; continue; }
else { FILE *f; f = fopen(papka, "w"); fprintf(f, "%s", bRead); fclose(f); memcpy(str_iz_file, bRead, sizeof(str_iz_file)); memset(bRead, 0, sizeof(bRead)); summa=0; ar_summ=999; d2=0; d3=0; d4=0; d5=0; d6=0; d7=0; d8=0; d9=0; d10=0; d11=0; d12=0; d13=0; } } }
Зараннее благодарю.
istarik.ru
Последний раз редактировалось istarik.ru; 14.08.2015 в 01:03.
|