Что я пропустил при написании этой программы последовательного тестирования

#c #linux #serial-port

#c #linux #последовательный порт

Вопрос:

У меня серьезные проблемы с коммуникациями rs232 в Linux, поэтому я написал эту тестовую программу, чтобы убедиться, что другие части моей программы не мешают последовательной связи.

Однако программа не работает, так как я опасался, что проблема заключается в коде последовательного порта.

У меня есть ноутбук с centos, на котором запущена программа, и он подключен к компьютеру с Windows xp, на котором запущен hyperterminal. код выполняется нормально в соответствии с проверкой ошибок, но в huperterminal ничего не отображается.

Настройка последовательной поры, которую я пытаюсь достичь, — это скорость передачи 115200 бод, 8 бит данных, 1 стоп-бит и четность метки.

Это программа:

 #include <termios.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <ncurses.h>
#include <fcntl.h>
#include <unistd.h> 

int main()
{
int port, serial, i;
unsigned long nobw;
char buf[10];
struct termios options;

port = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

if (port == -1)
    perror("open_port: Unable to open /dev/ttyS0 - ");  
else
    printf("port open n");

tcgetattr(port, amp;options); // get current settings

cfsetispeed(amp;options, 115200); // set baud rate
cfsetospeed(amp;options, 115200); // set baud rate

options.c_cflag amp;= ~CSIZE; // Mask the character size bits 
options.c_cflag |= CS8; // 8 bit data           
options.c_cflag amp;= ~PARENB; // set parity to no 
options.c_cflag amp;= ~PARODD; // set parity to no 
options.c_cflag |= CSTOPB;//set mark parity by using 2 stop bits 

options.c_cflag |= (CLOCAL | CREAD);

options.c_oflag amp;= ~OPOST;

options.c_lflag amp;= 0;
options.c_iflag amp;= 0; //disable software flow controll
options.c_oflag amp;= 0;

tcsetattr(port, TCSANOW, amp;options);// save the settings

ioctl(port, TIOCMGET, amp;serial);
serial |= TIOCM_DTR; // set DTR to high
ioctl(port, TIOCMSET, amp;serial);

for(i = 0; i < 10; i  )
{
    buf[i] = i;
}

for(i = 0; i < 10; i  )
{
    errno = 0;
    nobw = write(port, buf, 1);
    if(nobw == -1) 
        perror("WriteComm:");
    else 
        printf("sent character %d n", i);
}
return 0;
}
  

Все это сделано из учебных пособий по интернированному я понятия не имею, что я делаю, можете ли вы увидеть, где я ошибся?

также, если кто-нибудь знает, как сделать четность пространства, это также было бы оценено.

Комментарии:

1. Я мало что помню о RS232, и я никогда не программировал его в Linux, но не могли бы вы попробовать подключить контакты rx и tx (# 2 и 3 AFAIR) к порту, чтобы посмотреть, получаете ли вы все выходные данные в качестве входных данных?

2. @Alex как мне подключить контакты? У меня будут большие проблемы, если я поврежу ноутбук. Если бы гипотетически это было отражено в качестве входных данных, каким было бы ваше решение? может быть, я мог бы реализовать это вместо подключения контактов, чтобы посмотреть, была ли проблема?

3. чем-то металлическим. В конце концов, порт на компьютере имеет 9-контактный разъем, поэтому самым безопасным и простым может быть короткое замыкание rx и tx не на нем, а на кабеле, который имеет разъемы с обеих сторон и одним концом подключен к компьютеру. Вам просто нужно вставить измененную форму скрепки в отверстия для rx и tx на свободном конце. Вы ничего не можете повредить этим, если только вы не закоротили неправильные контакты. Если есть эхо, я бы начал проверять, одинаково ли настроен порт на обоих устройствах. Я бы также снизил скорость до 9600 и отключил все функции DTR.

4. найдите в Google распиновку для 9-контактного rs232.

5. У меня нет ни Linux-блока с последовательным портом, ни вашего устройства, чтобы попытаться посмотреть, что произойдет. Я могу только сказать вам, какие шаги я бы предпринял, чтобы убедиться, что есть какая-то связь, что выбран хотя бы правильный порт и он функционирует. Кстати, если у вас есть другой компьютер с последовательным портом, вы можете сначала проверить связь с ним. И только после того, как это сработает, начните играть с устройством. Еще одна идея… Вы могли бы просто попробовать несколько разных вариантов (из тех, в которых вы не уверены, если таковые имеются) и посмотреть, работает ли что-нибудь.

Ответ №1:

Может быть, стоит проверить, работает ли настройка без вашего кода? 🙂 Если вы подключаетесь с помощью minicom на стороне Linux и hyperterminal на стороне Windows, можете ли вы передавать данные туда и обратно?

Комментарии:

1. Как вы провели тестирование? Вы уверены, что кабель не является проблемой?

2. у нас есть Java-программа, которая использует последовательный порт, и я запустил ее, и ее вывод появился в hyper terminal. проблема не в кабеле.

3. Хм, но man tcsetattr упоминает только четную и нечетную четность, а не четность меток: (Возможно, он не поддерживается на этом уровне. Ваш код просто устанавливает четность в «без четности».

4. Ну, варианты выглядят нормально (насколько мне известно). Еще один тест, который вы можете сделать: если вы просто установите 8N1 — или четную / нечетную четность, поскольку мы знаем, что это поддерживается, — можете ли вы увидеть свой вывод на другой машине?

5. Кроме того, все примеры использования четности, которые я могу найти в Google, похоже, используют 7 битов данных, а не 8.