2012-10-16 48 views
5

Tôi đã cài đặt chương trình đơn giản tốc độ truyền cho cổng nối tiếp (RS232). Tôi đang đặt tỷ lệ đầu vào và đầu ra một cách độc lập bằng cách sử dụng các hàm cfsetospeed()cfsetispeed(). Theo man page, điều này sẽ có thể cung cấp tôi sử dụng các chức năng và một hằng số thích hợp:Tại sao tốc độ truyền đầu vào và đầu ra luôn giống nhau?

cfsetispeed() sets the input baud rate stored in the termios structure to speed, which must be specified as one of the Bnnn constants listed above for cfsetospeed(). If the input baud rate is set to zero, the input baud rate will be equal to the output baud rate.

cfsetospeed() sets the output baud rate stored in the termios structure pointed to by termios_p to speed, which must be one of these constants: ... B600 ... B19200

Vấn đề của tôi ở đây là bất cứ điều gì tôi đặt thứ hai (đầu vào hay đầu ra) có vẻ là giá trị cuối cùng cho cả hai. Tôi đang cố gắng thiết lập hai tốc độ độc lập.

Mã sản phẩm:

int main() { 
    int fd, ret; 
    char buf[100] = {0}; 
    char buf2[100] = {0}; 
    struct termios options; 

    // Open the serial-USB device driver 
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY); 
    if(fd < 0){ 
     perror("open_port: Unable to open port - "); 
     return 1; 
    } 

    tcgetattr(fd, &options); //Get the current settings 

    cfsetospeed(&options, B9600); //Set input speed as 9600 Baud Rate 
    cfsetispeed(&options, B19200); //Set output speed as 19200 Baud Rate 

    ret= tcsetattr(fd, TCSANOW, &options); //Get the return to make sure it worked 

    sleep(3); // Just for kicks, let it "settle" 

    tcgetattr(fd, &options); //Read back the values 

    getBRate(buf, cfgetispeed(&options)); 
    getBRate(buf2, cfgetospeed(&options)); 

    printf("return code was: %d, ispeed %s, ospeed %s\n", ret, buf, buf2); 

    //Clean up 
    memset(buf, '0', 100); 
    memset(buf2, '0', 100); 
    close(fd); 

    return 0; 
} 

chức năng My getBRate() chỉ là một đơn giản (xấu xí) chuyển sang trả về một chuỗi phiên bản của tốc độ truyền:

void getBRate(char rate[], speed_t brate) 
{ 

    switch(brate) { 
     case B0: strcpy(rate,"none"); break; 
     case B50: strcpy(rate,"50 Baud");break; 
     case B110: strcpy(rate,"110 Baud");break; 
     case B134: strcpy(rate,"134 Baud");break; 
     case B150: strcpy(rate,"150 Baud");break; 
     case B200: strcpy(rate,"200 Baud");break; 
     case B300: strcpy(rate,"300 Baud");break; 
     case B600: strcpy(rate,"600 Baud");break; 
     case B1200: strcpy(rate,"1200 Baud");break; 
     case B1800: strcpy(rate,"1800 Baud");break; 
     case B2400: strcpy(rate,"2400 Baud");break; 
     case B4800: strcpy(rate,"4800 Baud");break; 
     case B9600: strcpy(rate,"9600 Baud");break; 
     case B19200: strcpy(rate,"19200 Baud");break; 
     default: strcpy(rate, "No valid baud found\n");break; 
    } 
    return; 
} 

Sản lượng ở đây sẽ là:

return code was: 0, ispeed 19200 Baud, ospeed 19200 Baud 

Nếu tôi đảo ngược hai et" dòng như vậy:

cfsetispeed(&options, B19200); //Set output speed as 19200 Baud Rate 
cfsetospeed(&options, B9600); //Set input speed as 9600 Baud Rate 

đầu ra của tôi sẽ thay đổi để:

return code was: 0, ispeed 9600 Baud, ospeed 9600 Baud 

ý tưởng Bất kỳ?

EDIT:
Kể từ khi câu hỏi đã đưa ra, mã này sẽ được chạy trên một tấm ván bằng một Coldfire 528X (hoặc 5280 hoặc 5282). Bất kể, RX và TX sẽ có thể có tốc độ khác nhau theo hướng dẫn tài liệu tham khảo cho UART:

23.3.4 UART Clock Select Registers (UCSRn)
The UCSRs select an external clock on the DTIN input (divided by 1 or 16) or a prescaled internal bus clock as the clocking source for the transmitter and receiver. See Section 23.4.1, “Transmitter/Receiver Clock Source.” The transmitter and receiver can use different clock sources.

+6

Trong tất cả các chip tôi đã xử lý, phần cứng cổng nối tiếp thực sự chỉ có một bộ tạo tốc độ truyền đơn, và do đó không có cách nào để xử lý các tốc độ truyền Tx và Rx khác nhau. – TJD

+0

@TJD - Lạ lùng nếu đó là trường hợp không có lỗi xảy ra khi cố đặt hai mức giá khác nhau cho Tx/Rx. _a_ tỷ lệ đã mất, nhưng lệnh (thiết lập hai mức giá khác nhau) về mặt kỹ thuật không thành công. – Mike

+0

nhưng không có chính xác một điểm xảy ra lỗi. Mỗi khi bạn gọi để đặt tốc độ, nó thành công (nhưng chỉ áp dụng cho cả hai). Vì vậy, bạn còn lại với bất kỳ tỷ lệ bạn đặt cuối cùng. – TJD

Trả lời

0

Để bây giờ tôi sẽ chấp nhận @ câu trả lời TJD như thực tế In all the chips I have dealt with, the serial port hardware actually only has a single baud rate generator, and therefore has no possible way to handle different Tx and Rx baud rates.

Thực tế là tôi không thấy bất kỳ lỗi nào, đó là vì ít nhất một trong các hoạt động được yêu cầu của tcsetattr() đã thành công như this page tiểu bang:

Vì vậy, bây giờ, tôi đoán phần cứng không có khả năng hỗ trợ điều này, nhưng tôi nhận được một sự trở lại thành công từ các chức năng thiết lập bởi vì nó đặt một trong hai điều tôi yêu cầu.

+0

@TJD câu trả lời chắc chắn là chính xác. Tôi cũng chưa bao giờ thấy bất kỳ triển khai phần cứng UART nào có tốc độ truyền tx/rx khác nhau. Nếu bạn cần chức năng này vì một số lý do không rõ ràng, tôi đề xuất hai bộ điều hợp nối tiếp USB và một cáp đặc biệt lấy dòng tx từ một bộ chuyển đổi và đường rx từ bộ điều hợp kia. Tx đến một cổng và rx từ cổng kia. –

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