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!
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
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