Tôi đang đọc dữ liệu qua kết nối USB làm cổng nối tiếp với trình điều khiển PL2303. Nó trả về thành công khi thực hiện một số open
và khi tôi đặt chúng tùy chọn TTY và không chặn. Khi tôi cố gắng đóng kết nối, nó bị treo. Trong trạng thái này nó đọc " " thay vì ký tự.Chương trình bị treo khi đóng kết nối cổng nối tiếp
Tôi có thể kết nối với thiết bị hoàn toàn tốt bằng cutecom. Đây là phần lạ:
- Nếu lần đầu tiên tôi kết nối với thiết bị qua cutecom (màn hình nối tiếp), chương trình của tôi sẽ kết nối và đóng hoàn toàn tốt đẹp mỗi lần sau đó. Nó đọc các ký tự như tôi mong đợi chúng được đọc. (Không ).
- Nếu tôi ngắt kết nối và kết nối lại phần cứng, chương trình của tôi sẽ treo lại cho đến khi tôi chạy cutecom.
Vì nó hoạt động sau khi tôi sử dụng cutecom, nó làm cho tôi nghĩ rằng tôi thiếu một cái gì đó trong kết nối ban đầu của tôi, hoặc cài đặt kết nối. Đây là những gì tôi sử dụng để kết nối:
baud_rate = 38400;
fd = open (device_path, O_RDONLY | O_NOCTTY);
Trong set_tty_options
chức năng của tôi:
struct termios tty_options;
memset (&tty_options, 0, sizeof(tty_options));
tcgetattr (fd, &tty_options);
cfsetispeed(&tty_options, baud_rate); // set baud rate
tty_options.c_cflag = (tty_options.c_cflag & ~CSIZE) | CS8; // 8 bit msgs
tty_options.c_cflag |= (CLOCAL | CREAD); // enable reading
tty_options.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty_options.c_cflag |= parity;
tty_options.c_cflag &= ~CSTOPB;
tty_options.c_cflag &= ~CRTSCTS;
if (tcsetattr (fd, TCSANOW, &tty_options) != 0)
{
printf("error %d from tcsetattr\n", errno);
return TTY_ERROR;
}
Trong set_blocking
chức năng:
if (tcgetattr (fd, &tty) != 0)
{
printf("error %d from tggetattr", errno);
return FAILURE;
}
// 0 or 1 byte is enough to return from read
tty.c_cc[VMIN] = should_block ? 1 : 0;
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
if (tcsetattr (fd, TCSANOW, &tty) != 0)
{
printf("error %d setting term attributes", errno);
return FAILURE;
}
Tôi thấy 2 vấn đề với mã của bạn. Đầu tiên là hàm 'set_tty_options' dường như không khởi tạo hoàn toàn cấu trúc' tty_options'. Điều đó có thể giải thích "chương trình của tôi hoạt động nếu tôi chạy X trước, nhưng bị treo/thất bại nếu chạy solo." Đó là triệu chứng cổ điển của một chương trình không đúng hoặc khởi tạo hoàn toàn môi trường của nó. Thứ hai, hàm 'set_blocking' đó là không có thật cho đầu vào chuẩn. 'c_cc [VMIN]' và 'c_cc [VTIME]' chỉ nên được sử dụng cho đầu vào ** không chính tắc ** (aka nguyên). Đối với một 'read()' không chặn của đầu vào chuẩn, sử dụng 'fcntl()' để thiết lập điều đó. – sawdust