Ubuntu 16.04
Имеется преобразователь USB-UART к нему подключен микроконтроллер STM32, который принимает и посылает набор данных по UART.
В системе преобразователь определяется как ttyUSB.
Ниже представлен код, который выполняет определение последовательного порта, его открытие, настройку и отправку/чтение тестовых данных:
#include <stdio.h> /* Стандартные объявления ввода/вывода */
#include <fcntl.h> /* Объявления управления файлами */
#include <termios.h> /* Объявления управления POSIX-терминалом */
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <pthread.h>
#define ERROR_CREATE_THREAD -11
int fd;
void* test_write (void *args) {
unsigned char buf[5];
char n;
printf("thread for write test started\n");
buf[0]=1;
buf[1]=1;
buf[2]=0x17;
buf[3]=0;
buf[4]=0;
n = write(fd, buf, 5);
printf("write_test n = %d\n", n);
return EXIT_SUCCESS;
}
int main (void)
{
struct termios options; /*структура для установки порта*/
pthread_t thread;
int status, t;
char n, count;
char ch[5];
char str_dev[80];
char polling = 1;
int i;
//***** определение номера ком-порта *****//
i = 0;
while (polling){
sprintf(str_dev, "/dev/ttyUSB%d", i);
printf("%s\n", str_dev);
fd = open(str_dev, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) { // ** Could not open the port.
perror("open_port: Unable to open port - ");
//return 0;
}
else {
//fcntl(fd, F_SETFL, 0);
tcgetattr(fd, &options); //читает пораметры порта
cfsetispeed(&options, B57600); //установка скорости порта
cfsetospeed(&options, B57600); //установка скорости порта
options.c_cflag &= ~PARENB; //выкл проверка четности
options.c_cflag &= ~CSTOPB; //выкл 2-х стобит, вкл 1 стопбит
options.c_cflag &= ~CSIZE; //выкл битовой маски
options.c_cflag |= CS8; //вкл 8бит
options.c_cc[VMIN] = 60;
options.c_cc[VTIME] = 1; // таймаут 0 с (0*100мс)
t = tcsetattr(fd, TCSANOW, &options); //сохранения параметров порта
fcntl(fd, F_SETFL, 0);
if (t == -1) { // ** Could not open the port.
perror("set_paramet: Unable to set /dev/ttyUSB0 - ");
}
else
printf ("Start 57600 8n1\n");
}
status = pthread_create(&thread, NULL, test_write, NULL); // В потоке пишем 5 байт
if (status != 0) {
printf("main error: can't create thread, status = %d\n", status);
exit(ERROR_CREATE_THREAD);
}
printf("Reading response\n");
n = read(fd, ch, 1);
if (n > 0){
printf ("n = %d data = %x\n", n, ch[0]);
if (ch[0] == 1){
polling = 0;
}
printf("device %s\n", str_dev);
}
else { // сработал timeout
printf ("timeout\n");
count = 0;
i++;
if (i > 3){
polling = 0;
printf ("error find device\n");
exit (1);
}
else {
polling = 1;
}
}
fflush (stdout);
}
// ****************************************
return 0;
}
При выполнении программа повисает на команде чтения данных. При этом если открыть и закрыть порт(не важно до или во время выполнения программы) утилитой minicom или Cutecom программа начинает работать правильно, т.е. читаются данные от микроконтроллера.
Пользователь под которым происходит выполнение программы добавлен в группу dialout, также программа запускалась с правами root, но безуспешно.
В чем может быть проблема?