Что я пропустил, когда писал эту программу для серийного тестирования? - PullRequest
0 голосов
/ 05 октября 2011

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

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

У меня есть ноутбук с Centos, на котором запущена программа, и он подключен к компьютеру с Windows XP, на котором запущен гипертерминал. код выполняется нормально в соответствии с проверкой ошибок, но в 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, &options); // get current settings

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

options.c_cflag &= ~CSIZE; // Mask the character size bits 
options.c_cflag |= CS8; // 8 bit data           
options.c_cflag &= ~PARENB; // set parity to no 
options.c_cflag &= ~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 &= ~OPOST;

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

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

ioctl(port, TIOCMGET, &serial);
serial |= TIOCM_DTR; // set DTR to high
ioctl(port, TIOCMSET, &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 Ответ

0 голосов
/ 05 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...