Язык C последовательный порт: чтение неканонического режима - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь получить данные с ядерной панели STM32 (но это не имеет большого значения ^^).Я хочу получить необработанные данные и использовать неканонический режим, и все настроено для.Я установил VMIN на 7, чтобы ждать, пока 7 символов не будут прочитаны, а чтение ожидает 7 символов.Однако мое чтение возвращает значение, прежде чем получить 7 значений, и я не понимаю, почему.Есть ли у вас какие-либо идеи ?Я неправильно понимаю VMIN?Спасибо за помощь!

Мой код:

int main(){
int r=-1;
char * device = "/dev/ttyS3";
pt = open(device, O_RDWR | O_NOCTTY | O_SYNC);
if(pt == -1){
    perror("open");
    exit(-1);
}
printf("open : %d\n",pt);
ioctl(pt, I_SRDOPT, RMSGD);
tcgetattr(pt, &old);
atexit(reset_tty);

tcgetattr(pt, &tty); // Get the current attributes of the Serial port

//cfmakeraw(&tty);
tty.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON | IXOFF);
tty.c_oflag &= ~(OPOST);
tty.c_cflag |= (CS8);
tty.c_cflag &= ~(CSIZE|PARENB);
tty.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
tty.c_cc[VMIN] = 7; // wait 7 characters
tty.c_cc[VTIME] = 0;
cfsetispeed(&tty,B9600); // Setting the Baud rate 
cfsetospeed(&tty,B9600);

sleep(1);
r = tcflush(pt, TCIFLUSH);
printf("tcflush : %d\n",r);

r = tcsetattr(pt, TCSANOW, &tty);
printf("tcsetattr : %d\n",r);
int i = 0;
char end[20];

int count = 0;
char line[20];
memset(line,0,sizeof(line));
char forWrite[2]={'A','\0'};

while(count<10){
    r = read(pt ,line,7);
    printf("number of characters : %d\n",r);
    printf("line = %s\n",line);
    //printf("l = %c\n",line[0]);
    count++;
    memset(line,0,sizeof(line));
    printf("\n");
}
return 0;
}

Мой вывод:

number of characters : 1
line =

number of characters : 2
line = 12

number of characters : 2
line = 33

number of characters : 5
line = 456ab

number of characters : 5
line = cdefg

number of characters : 1
line = a

number of characters : 4
line = bcde

number of characters : 2
line = fg

number of characters : 1
line = 1

number of characters : 3
line = 233

И я отправляю с моего STM32 "abcdefg", а затем "1234567"

РЕДАКТИРОВАТЬ: код и вывод, который я опубликовал, совпадали, я только что изменил свои распечатки, чтобы быть более понятным для вас ... и я потерпел неудачу ^^, теперь редактируется thx:)

1 Ответ

0 голосов
/ 11 февраля 2019

Я не знаю, происходит ли это так, но read() (и другие интерфейсы ввода / вывода) на «медленных» устройствах (таких как последовательные порты) немедленно вернутся, если будет получен сигнал, пока они ожидают завершения,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...