Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: В последовательный порт передаются символы 'CR''LF' вместо 'LF'
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Banks
Здравствуйте,
Написал небольшую тестовую программку для ARM9. На нем крутится linux. Программа должна в последовательный порт писать одно число 0x0A(LF). Вместо этого я осциллографом вижу что передаются вместо 0x0A - два символа в следующей последовательности 0x0D(CR) затем 0x0A(LF). Как написать программу чтобы компилятор понял что я хочу только передать 0x0A?
Если например передавать 0x0B, то осциллографом видно что только 0x0B и передается.
Код программы:
CODE
#include <stdio.h> /* Стандартные объявления ввода/вывода */
#include <string.h> /* Объявления строковых функций */
#include <unistd.h> /* Объявления стандартных функций UNIX */
#include <fcntl.h> /* Объявления управления файлами */
#include <errno.h> /* Объявления кодов ошибок */
#include <termios.h> /* Объявления управления POSIX-терминалом */
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc,char **argv)
{
int fd;

fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY |O_NONBLOCK);
if (fd == -1)
{
printf("Error: Port has not been opened");
}
else
{
struct termios options; /*структура для установки порта*/
tcgetattr(fd, &options); /*читает параметры порта*/

cfsetispeed(&options, B38400); /*установка скорости порта*/
cfsetospeed(&options, B38400); /*установка скорости порта*/

options.c_cflag &= ~PARENB; /*выкл проверка четности*/
options.c_cflag |= CSTOPB; /*вкл 2-х стобит*/
options.c_cflag &= ~CSIZE; /*выкл битовой маски*/
options.c_cflag |= CS8; /*вкл 8бит*/
tcsetattr(fd, TCSANOW, &options); /*сохранения параметров порта*/
}

unsigned char ModBus_write_buf[1];
ModBus_write_buf[0] = 0x0A; /*ID*/


int ModBus_write_result;
int ModBus_request;
for (ModBus_request = 0; ModBus_request < 1; ModBus_request++)
{
ModBus_write_result = write(fd, &ModBus_write_buf, 1);
if (ModBus_write_result < 0)
{
fputs("Write of bytes failed!\n", stderr);
}
else
{
printf("ModBus_write_result = %d \n",ModBus_write_result) ;
}
}

close(fd);
return(0);
}
zltigo
QUOTE (Banks @ Mar 27 2016, 14:14) *
Написал.....

Ужас sad.gif.
А вообще в этом конкретном странном линуксе получается надо O_BINARY.
Banks
Цитата(zltigo @ Mar 27 2016, 15:30) *
Ужас sad.gif.
А вообще в этом конкретном странном линуксе получается надо O_BINARY.

В моем fcntl.h почему-то нет "O_BINARY" sad.gif
zltigo
QUOTE (Banks @ Mar 27 2016, 15:26) *
В моем fcntl.h почему-то нет "O_BINARY" sad.gif

Ну как-бы и не должно быть (или должно быть, как и O_TEXT нулем) для линуксов. Но в том и СТРАННОСТЬ, что поведение именно, как для текстового файла в DOS/WIN!
Где-то зарыта работа именно, как с текстовыми файлами.
Lagman
В Serial Programming HOWTO есть описание поведения при определенных установках порта termios.h.
x893
Зря не используете гуглу при программировании

ICRNL Translate carriage return to newline on input (unless IGNCR is set).
ONLCR (XSI) Map NL to CR-NL on output.
Lagman
Цитата(x893 @ Mar 27 2016, 20:29) *
Зря не используете гуглу при программировании

ICRNL Translate carriage return to newline on input (unless IGNCR is set).
ONLCR (XSI) Map NL to CR-NL on output.

Для modbus (исходники на него намекают) вообще другой режим обработки нужен и эти флаги там если и помогут то могут быть глюки в других сочетаниях служебных симоволов.
x893
Про MODBUS слова не было.
zltigo
QUOTE (x893 @ Mar 27 2016, 20:12) *
Про MODBUS слова не было.

QUOTE
unsigned char ModBus_write_buf[1];
ModBus_write_buf[0] = 0x0A; /*ID*/
int ModBus_write_result;
int ModBus_request;
for (ModBus_request = 0; ModBus_request < 1; ModBus_request++)
ModBus_write_result = write(fd, &ModBus_write_buf, 1);
if (ModBus_write_result < 0)
printf("ModBus_write_result = %d \n",ModBus_write_result) ;


x893
Вектор движения обозначен, дальше дело техники.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.