Я понимаю, что канонический режим для последовательного порта, чтение будет возвращаться только до тех пор, пока в очереди ввода не встретится символ новой строки.
Я подключил два PL2303 USB к последовательному устройству (TX -> RX, RX-> TX)
Написал два кода C, один для получения из / dev / ttyUSB0, а другой для записи из / dev / ttyUSB1
canonical_write.c:
#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>
#define SERIAL_DEVICE "/dev/ttyUSB1"
int main()
{
struct termios serial_port_settings;
int fd;
int retval;
char buf[256] = "hello world \n test \n";
char ch;
int i;
fd = open(SERIAL_DEVICE, O_RDWR);
if (fd < 0) {
perror("Failed to open SERIAL_DEVICE");
exit(1);
}
retval = tcgetattr(fd, &serial_port_settings);
if (retval < 0) {
perror("Failed to get termios structure");
exit(2);
}
//setting baud rate to B38400
retval = cfsetospeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 output baud rate");
exit(3);
}
retval = cfsetispeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 input baud rate");
exit(4);
}
serial_port_settings.c_lflag |= ICANON;
retval = tcsetattr(fd, TCSANOW, &serial_port_settings);
if (retval < 0) {
perror("Failed to set serial attributes");
exit(5);
}
printf("Successfully set the baud rate\n");
for (i = 0; buf[i] != '\0'; i++) {
ch = buf[i];
printf("Writing character :%c ASCII:%d\n", ch, ch);
retval = write(fd, &ch, sizeof(ch));
if (retval < 0) {
perror("write on SERIAL_DEVICE failed");
exit(6);
}
sleep(1);
}
close(fd);
return 0;
}
canonical_read.c
#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <fcntl.h>
#include <stdlib.h>
#define SERIAL_DEVICE "/dev/ttyUSB0"
int main()
{
struct termios serial_port_settings;
int fd;
int retval;
char buf[256];
int i, loop = 2;
fd = open(SERIAL_DEVICE, O_RDWR);
if (fd < 0) {
perror("Failed to open SERIAL_DEVICE");
exit(1);
}
retval = tcgetattr(fd, &serial_port_settings);
if (retval < 0) {
perror("Failed to get termios structure");
exit(2);
}
//setting baud rate to B38400
retval = cfsetospeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 output baud rate");
exit(3);
}
retval = cfsetispeed(&serial_port_settings, B38400);
if (retval < 0) {
perror("Failed to set 9600 input baud rate");
exit(4);
}
serial_port_settings.c_lflag |= ICANON;
//Disable ECHO
serial_port_settings.c_lflag &= ~(ECHO | ECHOE);
retval = tcsetattr(fd, TCSANOW, &serial_port_settings);
if (retval < 0) {
perror("Failed to set serial attributes");
exit(5);
}
printf("Successfully set the baud rate\n");
while (loop--) {
retval = read(fd, buf, sizeof(buf));
if (retval < 0) {
perror("Read on SERIAL_DEVICE failed");
exit(6);
}
printf("Read returned %d bytes\n", retval);
for (i = 0; i < retval; i++) {
printf("Read Character:%c \t ASCII:%d\n", buf[i], buf[i]);
}
}
close(fd);
return 0;
}
При запуске обеих программ первое чтение успешно возвращает «hello world», а второе чтение возвращает «\ n» ASCII 10.
Ожидаемое поведение:вернуть «тест» правильно.Я пропустил какие-либо настройки при настройке ttyUSB0 в canonical_read.c
Когда я заменяю буфер на
char buf[256] = "hello world \r test \n";
, я получаю правильный вывод.
Спасибо за вашу помощь ивремя