2012-01-21 27 views
5

Hiện nay, tôi đang đọc CTS và tín hiệu DSR của một cổng nối tiếp theo cách sau:Làm thế nào để có hiệu quả chờ CTS hoặc DSR của RS232 trong Linux?

bool get_cts(int fd) { 
    int s; 
    ioctl(fd, TIOCMGET, &s); 
    return (s & TIOCM_CTS) != 0; 
} 

Bây giờ tôi muốn đợi cho đến khi get_cts() trả về true. Một vòng lặp đơn giản không phải là giải pháp tốt nhất mà tôi nghĩ (vì nó cực kỳ tốn nhiều tài nguyên).

void wait_cts(int fd) { 
    while(1) { 
     if(get_cts(fd)) { 
      return; 
     } 
    } 
} 

Có giải pháp nào tốt hơn khi sử dụng C hoặc C++ trên Linux không? (Tôi không thể sử dụng bất kỳ điều khiển luồng phần cứng nào vì tôi không cần dòng dữ liệu nối tiếp.)

+0

Bất kỳ lý do tại sao bạn không thể ngủ một chút trong vòng lặp đó? – Mat

+1

Tôi có thể làm điều đó nhưng không có giải pháp nào khác? – SecStone

Trả lời

8

Có ioctl TIOCMIWAIT chặn cho đến khi một bộ tín hiệu nhất định thay đổi.

Đáng buồn là ioctl này không được ghi lại trong trang tty_ioctl(4) cũng như trong ioctl_list(4).

tôi đã học được về ioctl này trong câu hỏi này:

Python monitor serial port (RS-232) handshake signals

1

Cuộc gọi hệ thống chọn có nghĩa là cho các ứng dụng tương tự. Bạn có thể làm công việc khác hoặc ngủ, sau đó định kỳ kiểm tra trạng thái của FD_SET. Nó thậm chí có thể là quá mức cần thiết cho những gì bạn đang làm, nếu chương trình của bạn không làm gì khác ngoài việc lấy dữ liệu.

Các vấn đề liên quan