> Есть ли в ней серьезные ошибки?Не уверен насчет серьезности, но если вам нужно сделать code review, то см. ниже
> #define PORT "/dev/ttyS0" //Здесь указывается с каким портом будем работать
> #define BAUDRATE B9600 //Скорость работы по порту
> system ("/home/user/runremote.sh");
Я бы сделал передачу этих значений через командную строку. Это можно легко сделать с помощью getopt(). См. man 2 getopt. Я делал так:
https://gitorious.org/send-arp/send-arp/source/49789e4b75050...
> int main(){
Нестандартная сигнатура main(), лучше main(void) сделать, или main(int argc, char *argv[]), если будут обрабатываться параметры командной строки (через getopt() например).
> while (a >= 0)
у вас "a" -- это unsigned int, так что "a" никогда не будет меньше нуля. Если нужен вечный цикл -- пишите просто while (1) или for (;;)
> unsigned int val,val2, a, ret; //инициализация переменных
1. область видимости ret можно уменьшить, т.е. внести ret в цикл
2. это не инициализация, это их объявление (я насчет комментария); комментарии (и строки, которые выводятся на экран тоже) лучше писать на английском языке, кстати: тогда программа будет ASCII файлом, не будет никогда проблем с кодировками, и самое главное -- вашу программу смогут читать все люди на Земле :)
> ret = write(fd, &val, 1); // пишем в порт
> int ret2 = read(fd, &val2,1); //пытаемся прочитать из порта
системные вызовы read() и write() возвращают ssize_t, т.е. ret и ret2 должны быть signed. Т.е. уберите unsigned в их декларации.
> if (!isatty(fd))
> return 2;
и все остальные return: перед этими return нужно закрывать файловый дескриптор fd.
Также перед тем, как выйти из программы по ошибке, неплохо бы писать пользователю (в д.с. самому себе), какая ошибка произошла. Писать надо в поток вывода ошибок: fprintf(stderr, ...). Или использовать perror(), если тот вызов при ошибке устанавливает значение errno (надо смотреть маны).
Ну и еще номера ошибок лучше сделать константами, чтобы не было magic numbers.
> val=11111; //задание значения переменных - эти данные будут посылаться в порт
лучше сделать это константой (например с помощью #define), иначе получается magic number.
> a++,//увеличение значения на 1
> printf ("a=%d \n\n",a);
я бы сделал "a++;"
и да, лучше не ставить таких комментариев, которые дублируют код, они только мешают
> printf ("ret=%d \n",ret);
> printf ("val=%d \n",val);
> printf ("a=%d \n\n",a);
Здесь выводятся беззнаковые переменные, но используется %d. Для беззнаковых надо использовать %u. Или как вариант -- эти переменные не должны быть беззнаковые.
> ret = write(fd, &val, 1); // пишем в порт
> if (ret!=1) return 5;
в случае ошибки write() всегда вернет -1, лучше на него и проверять (а то измените когда-нибудь кол-во отправляемых байт, и уже не будет работать); и еще перед выходом по этой ошибке лучше через perror() выводить строку ошибки. Тоже самое для всех остальных системных вызовов. Читайте "man 2 write", "man 2 read" и т.д.
> usleep(30000000); //30 секунд
> usleep(1000000); // 1 секунда
Из man 3 usleep:
POSIX.1-2001 declares this function obsolete; use nanosleep(2) instead
> return 0;
> close(fd);
Наоборот.
> return 0;
лучше вместо 0 использовать EXIT_SUCCESS из stdlib.h.
Ну что еще можно улучшить -- разбить на функции, чтобы не всё было в main(). Стиль кодирования взять нормальный, например этот: https://www.kernel.org/doc/Documentation/CodingStyle . Неплохо бы ловить и обрабатывать Ctrl+C (SIGINT). А вообще мне кажется что всё это можно было сделать на bash, через stty/echo/cat, или поискать готовую тулзовину. Хотя как пример работы с serial console полезно, только код тогда нужно подрихтовать.