Реферат: Я пишу snooper ttyUSB. Код должен считывать (2) данные из последовательного порта и записывать (2) на другой последовательный порт. Чтение из последовательного порта отлично работает с/bin/cat, но с моим кодом не работает.Написание ttyUSB snooper failing
Установка аппаратного обеспечения: Я сделал перекрестный кабель FTDI и поставил один конец на компьютере под управлением Windows XP как Com2, а другой конец на современной Linux-машине в качестве/dev/ttyUSB0. У машины Linux есть USB-кабель Serial, который отображается как/dev/ttyUSB1. Он связан с фактическим аппаратным блоком, который я пытаюсь отслеживать. Я подтвердил, что оборудование отлично работает.
Эта часть работы: я буду «кошка/DEV/ttyUSB0>/TMP/данные», а затем есть проблема машины WinXP «чтение с устройства по COM2», а следующие шесть (6) байт данных будут отправлены.
\x02\x01\x40\x00\x0a\x9e
Этот «пакет» отправляется в 4 раза или около того с очень небольшой задержкой, это, кажется, код WinXP просто попробовать несколько раз. Если я воспроизведу это только один раз, это сработает.
Если я просто делаю «cat/tmp/data>/dev/ttyUSB1», аппаратное устройство ответит правильно, указав, что оно получило команду. Большой!
Проблема и мой код: Я пишу некоторый код, который будет работать на машине Linux, которая будет читать (2) из / DEV/ttyUSB0 и записать его на/DEV/ttyUSB1 и наоборот. Однако по какой-то неизвестной причине он получит только 4 байта в первом «пакете», а затем 5 в последующих 3 попытках. Иногда 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;
}
Когда я на самом деле запустить этот код, я вижу это:
# 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
Обратите внимание, что в настоящее время получили только 4 или 5 байт, а затем передаются через в любой момент времени. Не 6. Также обратите внимание, что «пакет» искажен. Что в мире может вызвать это?
рациональность, если вы заинтересованы: У меня есть старое программное обеспечение, которое работает только на Windows XP и не будет работать в виртуальной машине (это известная проблема). Я хотел бы захватить трафик через последовательный порт. Я купил машину WinXP только для этого.
Я подозреваю, что это связано с бит контроля четности? –