摘要:我正在寫一個ttyUSB窺探器。該代碼應該讀取(2)來自串行端口的數據並將其寫入(2)到另一個串行端口。從串口讀取與/ bin/cat的效果很好,但使用我的代碼失敗。編寫ttyUSB窺探器失敗
硬件設置爲:我製作了FTDI交叉電纜,將一端作爲Com2,另一端作爲/ dev/ttyUSB0放在現代Linux機器中。 Linux機器具有USB轉串口電纜,顯示爲/ dev/ttyUSB1。它連接到我試圖窺探的實際硬件單元。我證實,硬件很好。
這部分工作:我會的「貓的/ dev/ttyUSB0>的/ tmp /數據」,然後讓WinXP的機器發出了「從設備在Com2端口讀取」,和下面的六(6)個字節的數據將被髮送。
\x02\x01\x40\x00\x0a\x9e
這個「包」被髮送4次左右有輕微的滯後,這似乎是隻是嘗試了幾次了WinXP的代碼。如果我只重播一次,它就會起作用。
如果我只是簡單地執行「cat/tmp/data>/dev/ttyUSB1」,硬件設備會正確響應,表明它收到了命令。大!
問題和我的代碼:我寫一些代碼要在Linux機器會從/ dev/ttyUSB0閱讀(2),並將其寫入了到/ dev/ttyUSB1,反之亦然上運行。然而,由於某些未知的原因,它將只在第一個「數據包」中接收4個字節,然後在隨後的3次嘗試中接收5個字節。有時候,這5個字節會略微「損壞」,這意味着我看到\ xffffff是最後一個或倒數第二個字節。這裏是我的代碼:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <strings.h>
void hexdump(char *data, int size) {
for (size_t i = 0; i < size; ++i)
printf("%02x ", data[i]);
putchar('\n');
}
int main() {
int fdzero;
int fdone;
int maxfd;
fd_set sockrd;
struct timeval timer;
char data[10];
int size;
char tmp;
fdzero = open("/dev/ttyUSB0", O_RDWR);
if (fdzero == -1) {
perror("Failed to open /dev/ttyUSB0");
return 1;
}
fdone = open("/dev/ttyUSB1", O_RDWR);
if (fdone == -1) {
perror("Failed to open /dev/ttyUSB1");
return 1;
}
if (fdzero > fdone)
maxfd = fdzero;
else
maxfd = fdone;
printf("Enter loop\n");
for(;;) {
bzero(data, 10);
// fflush(NULL);
FD_ZERO(&sockrd);
FD_SET(fdzero, &sockrd);
FD_SET(fdone, &sockrd);
timer.tv_sec = 60;
timer.tv_usec = 0;
select(maxfd+1, &sockrd, NULL, NULL, &timer);
if (FD_ISSET(fdzero, &sockrd)) {
size = read(fdzero, data, 10);
if (size == -1) {
perror("Failed to read /dev/ttyUSB0");
break;
}
size = write(fdone, data, size);
if (size == -1) {
perror("Failed to write to /dev/ttyUSB1");
break;
}
printf("ttyUSB0 -> ttyUSB1: %d\n", size);
}
// This portion does not trigger yet, but its a mirror
// Yes, I know...bad code :(
else {
size = read(fdone, data, 10);
if (size == -1) {
perror("Failed to read /dev/ttyUSB1");
break;
}
size = write(fdzero, data, size);
if (size == -1) {
perror("Failed to write to /dev/ttyUSB0");
break;
}
printf("ttyUSB1 -> ttyUSB0: %d\n", size);
}
// Used to monitor what is read()/write()
hexdump(data, size);
}
return 0;
}
當我真正運行這段代碼,我看到:正在只得到4或5個字節,隨後在任何給定時間送過來
# cc snoop.c -o snoop
# ./snoop
Enter loop
ttyUSB0 -> ttyUSB1: 4
02 00 40 ffffff9e
ttyUSB0 -> ttyUSB1: 4
02 00 40 ffffff9e
ttyUSB0 -> ttyUSB1: 4
02 00 40 ffffff9e
ttyUSB0 -> ttyUSB1: 5
01 02 00 40 ffffff9e
ttyUSB0 -> ttyUSB1: 5
01 02 00 40 ffffff9e
ttyUSB0 -> ttyUSB1: 5
01 02 00 40 ffffff9e
通知。不是6.另外,請注意「數據包」失真。世界上會造成什麼?
理性,如果你有興趣:我有一個只能運行在Windows XP中,並不會在虛擬機上工作(這是一個已知的問題)舊軟件。我很想捕捉串口上的流量。我購買了一臺WinXP機器來做到這一點。
我懷疑這是與奇偶校驗位有關? –