#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.