2011-10-18 31 views
5

Tôi không thể nhìn thấy để thiết lập cổng nối tiếp một cách chính xác bằng cách sử dụng cấu trúc termios vì vậy tôi đang xem thư viện của bên thứ ba.Có thể đánh dấu dấu cách và dấu cách bằng boost.asio không?

Tôi đã được khuyên nên thử boost.asio nhưng khi xem xét các ví dụ có vẻ như nó không hỗ trợ dấu chẵn và khoảng trống không gian, điều này có đúng không?

Nếu có thể ai đó có thể hiển thị mã ví dụ về cách thực hiện đánh dấu và không gian chẵn lẻ trong boost.asio. Tôi đang sử dụng 8 databits, 115220 baud rate và 1 stop bit.

Có ai biết thư viện của bên thứ ba nào hỗ trợ tính chẵn lẻ đánh dấu và không gian trên linux mà tôi có thể sử dụng thay vì tăng không?

Trả lời

5

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

+0

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

+0

@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

+0

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

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