Я разрабатываю приемник для небольшого аппаратного проекта. Я работаю на небольшой плате, которая использует UART для передачи данных.
Код приемника показан полностью ниже, я кратко объясню неисправные бит отдельно.
#define TTY "/dev/ttys002"
#include <stdio.h>
#include <string.h>
#include <unistd.h> //Unix standard functions
#include <fcntl.h> //File controls
#include <errno.h> //Error numbers
#include <assert.h>
#include <termios.h> //Posix terminal
int open_port(const char * tty) {
int fd;
fd = open(tty, (O_RDWR | O_NOCTTY | O_NDELAY));
assert("__failed to open port__" && fd != -1);
//Block until read
fcntl(fd, F_SETFL, 0);
return fd;
}
void configure_port(int fd) {
struct termios options;
//Get current options
tcgetattr(fd, &options);
//9600 Baud
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
//Receive & local mode
options.c_cflag |= (CLOCAL | CREAD);
//Raw output
options.c_oflag &= ~OPOST;
//No hardware flow control
options.c_cflag &= ~CRTSCTS;
//No parity, 1 stop bit
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
//8 data bits
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//Write options back, set them immediately
tcsetattr(fd, TCSANOW, &options);
}
int main(int argc, const char * argv[]) {
int fd = open_port(TTY);
const size_t count = 8;
char buf[count + 1];
ssize_t n;
configure_port(fd);
while (1) {
n = read(fd, buf, count);
buf[count] = '\0';
if (n > 0) {
printf("%s\n", buf);
}
}
return 0;
}
Поскольку в настоящее время у меня нет моего оборудования, я решил проверить свой приемник на регулярной tty (#define TTY "/dev/ttys002"
). Чтобы протестировать его, я просто скомпилировал и выполнил вышеуказанный код, а затем открыл отдельный терминал и:
echo "text" >> /dev/ttys002
Все это прекрасно работает, и я получаю все данные, которые я повторяю в tty.
Однако проблема возникает при вводе длинного сообщения в tty:
echo "this is a longer test message" >> /dev/ttys002
Я получаю все сообщение в виде одной строки в своем программном выпуске. Почему это так? Я бы ожидал, что текст будет разбит на блоки из 8 символов (const size_t count = 8;
).
Если это важно, я использую это руководство в качестве моего варианта конфигурации.
Изменить: Пожалуйста, просмотрите комментарии для дальнейшего обсуждения проблемы.