2011-12-22 42 views
11

Tôi đang cố gắng đọc byte thô từ cổng nối tiếp được gửi bởi bộ mô phỏng giao thức win32 IEC 870-5-101 với chương trình được viết bằng C chạy trên Linux 32 bit.Đọc byte thô từ cổng nối tiếp

Tính năng này hoạt động tốt đối với các giá trị byte như 0x00 - 0x7F. Nhưng đối với các giá trị bắt đầu từ 0x80 đến 0xAF, bit cao là sai, ví dụ:

0x7F -> 0x7F //correct 
0x18 -> 0x18 //correct 
0x79 -> 0x79 //correct 
0x80 -> 0x00 //wrong 
0xAF -> 0x2F //wrong 
0xFF -> 0x7F //wrong 

Sau khi đào bới khoảng hai ngày, tôi không biết, điều gì gây ra điều này.

Đây là cấu hình của tôi về cổng nối tiếp:

cfsetispeed(&config, B9600); 
    cfsetospeed(&config, B9600); 

    config.c_cflag |= (CLOCAL | CREAD); 

    config.c_cflag &= ~CSIZE;        /* Mask the character size bits */ 
    config.c_cflag |= (PARENB | CS8);      /* Parity bit Select 8 data bits */ 

    config.c_cflag &= ~(PARODD | CSTOPB);     /* even parity, 1 stop bit */ 


    config.c_cflag |= CRTSCTS;        /*enable RTS/CTS flow control - linux only supports rts/cts*/ 


    config.c_iflag &= ~(IXON | IXOFF | IXANY);    /*disable software flow control*/ 

    config.c_oflag &= ~OPOST;        /* enable raw output */ 
    config.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /* enable raw input */ 

    config.c_iflag &= ~(INPCK | PARMRK);     /* DANGEROUS no parity check*/ 
    config.c_iflag |= ISTRIP;        /* strip parity bits */ 
    config.c_iflag |= IGNPAR;        /* DANGEROUS ignore parity errors*/ 

    config.c_cc[VTIME] = 1;         /*timeout to read a character in tenth of a second*/ 

Tôi đọc từ cổng nối tiếp với:

*bytesread = read((int) fd, in_buf, BytesToRead); 

Ngay sau khi hoạt động này "in_buf" chứa các byte sai, vì vậy Tôi đoán có cái gì đó sai với cấu hình của tôi, đó là một cổng từ một cấu trúc DC32 win32.

Cảm ơn mọi ý tưởng!

+0

Tôi lưu ý rằng bạn đã nói, “2 bit 4 sai…” nhưng dữ liệu của bạn dường như chỉ cho thấy rằng bit cao đang bị xóa. (& 0x7f) – BRFennPocock

+0

Tôi hơi bối rối về các quy ước đặt tên. Tất nhiên bit cao là sai. Thx để làm rõ. – punischdude

Trả lời

14

Dựa trên các ví dụ của bạn, chỉ bit thứ 8 (bit cao) là sai và sai khi luôn là 0. Bạn đang thiết lập ISTRIP trong kỷ luật của bạn ở phía Linux và điều đó sẽ gây ra điều này. ISTRIP không, như là bình luận trong các tuyên bố mã C, bit chẵn lẻ dải. Nó dải bit dữ liệu thứ 8.

Nếu ISTRIP được đặt, byte đầu vào hợp lệ trước tiên sẽ bị tước thành bảy bit; nếu không, tất cả tám bit sẽ được xử lý. IEEE Std 1003.1, 2004 Edition, chapter 11, General Terminal Interface

+0

Cảm ơn thông tin về 8E1. Không bao giờ biết điều đó. –

+0

Cảm ơn! 'config.c_iflag & = ~ ISTRIP;' đã thực hiện thủ thuật. – punischdude

+0

Gotta yêu những ý kiến ​​gây hiểu nhầm đó. –

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