Có một bài viết rất hay về vấn đề này here.
Đặc biệt
MARK và SPACE chẵn lẻ, mặc dù thực hiện ở hầu hết các phần cứng, không phải là định nghĩa trong tiêu chuẩn POSIX. Ví dụ, manpage của thư viện thuật ngữ Unix/Linux không bị mất một từ đơn lẻ về các chế độ chẵn lẻ này. (Lưu ý rằng PARMRK không liên quan gì đến MARK chẵn lẻ.)
Đây là lý do tại sao, tôi nghĩ, các tùy chọn này không được thực hiện trong Boost.Asio.
Có một số giải pháp đề nghị: Ví dụ:
Chế độ 8M1 (8 bit dữ liệu, MARK chẵn lẻ, 1 stop bit) có thể được mô phỏng với 8N2. Thay vì gửi bit chẵn lẻ và bit dừng, hai bit dừng được truyền đi. Vì bit dừng luôn là 1 (bit đánh dấu), hai chế độ tương đương nhau.
Nếu những điều này không khớp với yêu cầu của bạn thì bạn có thể có được bản trình bày gốc của cổng nối tiếp của bạn trong asio tăng. Từ các tài liệu:
basic_serial_port::native_handle
Get the native serial port representation.
native_handle_type native_handle();
This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided.
Để có được một ý tưởng về việc sử dụng có một cái nhìn tại
boost_1_45_0/boost/asio/serial_port_base.hpp
và đặc biệt là các mã để làm với chẵn lẻ trên linux:
switch (value_)
{
case none:
storage.c_iflag |= IGNPAR;
storage.c_cflag &= ~(PARENB | PARODD);
break;
case even:
storage.c_iflag &= ~(IGNPAR | PARMRK);
storage.c_iflag |= INPCK;
storage.c_cflag |= PARENB;
storage.c_cflag &= ~PARODD;
break;
case odd:
storage.c_iflag &= ~(IGNPAR | PARMRK);
storage.c_iflag |= INPCK;
storage.c_cflag |= (PARENB | PARODD);
break;
default:
break;
}
Tôi nghĩ bạn muốn sử dụng số native_handle
để đặt đặt cờ giống như vậy:
cflag |= PARENB | CMSPAR // To select SPACE parity
cflag &= ~PARODD
cflag |= PARENB | CMSPAR | PARODD // to select MARK parity
(theo here, dù sao) Xem thêm wrong sequence of libserial received data
các ví dụ bạn đưa ra là cấu trúc termios mà tôi không thể có được để làm việc và CMSPAR là undefined trên hệ thống của tôi và không hoạt động. cảm ơn cho câu trả lời anyway bây giờ tôi biết tôi phải làm điều đó trong java: ( – Skeith
@Skeith - có một cái nhìn tại liên kết - bạn có thể thi đua cả Mark và không gian bằng cách sử dụng một bit dừng thêm (Mark là dễ dàng hơn) - Đây là trực tiếp được hỗ trợ bởi Boost.Asio mà không cần phải chơi với CMSPARs không được hỗ trợ.BTW - Tôi không chắc chắn chuyển đổi ngôn ngữ sẽ giúp đỡ nếu hạt nhân của bạn không hỗ trợ nó. – Tom
chúng tôi có một chương trình trong java giao tiếp với thiết bị ngoài nhưng được xây dựng bởi người tiền nhiệm của tôi. Tôi chỉ không muốn phải thử và cắt mã nối tiếp từ nó nếu có thể vì nó sẽ là một công việc chính để viết lại mã chức năng từ C++ cho java như tất cả chúng ta đang thiếu là mã nối tiếp cho linux nhưng tôi không có lựa chọn hiện nay. – Skeith