Всем добрый день.
Написал небольшую тестовую программу для COM-порта.
К порту подключен трехпроводной нуль-модемный кабель, на конце которого перемычка между линиями прием-передача.
#include <stdio.h> /*ввод-вывод*/
#include <string.h> /*строковые функции*/
#include <unistd.h> /*стандартные функции UNIX*/
#include <fcntl.h> /*управление файлами*/
#include <termios.h> /*управление POSIX терминалом*/
#include <stdint.h> /*для типа переменных unit8_t*/
int open_port(void) /*функция открытия порта*/
{
int fd; /*файловый дескриптор*/
fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY);
if (fd==-1)
printf("\nошибка открытия порта\n");
else
{
struct termios options; /*настройка порта*/
tcgetattr(fd,&options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag |= PARENB;
options.c_cflag |= PARODD;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag |= (INPCK | ISTRIP);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
tcsetattr(fd,TCSAFLUSH,&options);
}
return (fd);
}
main (void)
{
int fdout;
int a;
int b;
int fd;
int n;
int m;
uint8_t outb[16];
uint8_t inb[16]={0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87,0x78,0x69,0x5a,0x4b,0x3c,0x2d,0x1e,0x0f};
printf("\n"); /*вывод на экран выходного массива, сейчас там мусор*/
for (a=0;a<16;a++)
printf(" %x ",outb[a]);
printf("\n\n");
fd=open_port(); /*открытие порта*/
if (fd!=-1)
{
fdout=open("fileout", O_WRONLY | O_CREAT | O_TRUNC); /*создание выходного файла*/
if (fdout==-1)
printf("\ncreating output file error\n");
else
{
sleep(1);
n=write(fd,inb,16); /*запись в порт*/
if (n<1)
printf("\nwritting in port error\n");
else
{
sleep(1);
n=read(fd,outb,16); /*чтение из порта*/
if (n<1)
printf("\nreading from port error\n");
else
{
m=write(fdout,outb,n); /*запись в выходной файл*/
if (m<1)
printf("\nwriting in output file error\n");
else
{
printf("\n"); /*вывод на экран выходного массива, сейчас там значения полученные из порта*/
for (b=0;b<16;b++)
printf(" %x ",outb[b]);
printf("\n\n");
}
}
}
}
}
close(fdout);
close(fd);
return (0);
}
И вот что я получаю в итоге на экране:

и в файле:
paRC4%xiZK<-
Помогите, пожалуйста, разобраться со следующими вещами:
1 Почему в массиве принятых байт, старший бит установился в 0, и как это исправить?
2 Вопрос полегче, как сделать так, чтобы в файл записывались 16-ричные значения байт, а не соответствующие им ASCII-символы?
Программу писал, руководствуясь материалом: http://www.opennet.ru/docs/RUS/serial_guide/index.html
