реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> В последовательный порт передаются символы 'CR''LF' вместо 'LF'
Banks
сообщение Mar 27 2016, 12:14
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 2-11-10
Пользователь №: 60 610



Здравствуйте,
Написал небольшую тестовую программку для 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);
}


Сообщение отредактировал IgorKossak - Mar 28 2016, 07:44
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 27 2016, 12:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Banks @ Mar 27 2016, 14:14) *
Написал.....

Ужас sad.gif.
А вообще в этом конкретном странном линуксе получается надо O_BINARY.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Banks
сообщение Mar 27 2016, 13:26
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 2-11-10
Пользователь №: 60 610



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

В моем fcntl.h почему-то нет "O_BINARY" sad.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 27 2016, 13:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Lagman
сообщение Mar 27 2016, 14:51
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



В Serial Programming HOWTO есть описание поведения при определенных установках порта termios.h.
Go to the top of the page
 
+Quote Post
x893
сообщение Mar 27 2016, 17:29
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Зря не используете гуглу при программировании

ICRNL Translate carriage return to newline on input (unless IGNCR is set).
ONLCR (XSI) Map NL to CR-NL on output.
Go to the top of the page
 
+Quote Post
Lagman
сообщение Mar 27 2016, 18:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(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 (исходники на него намекают) вообще другой режим обработки нужен и эти флаги там если и помогут то могут быть глюки в других сочетаниях служебных симоволов.
Go to the top of the page
 
+Quote Post
x893
сообщение Mar 27 2016, 18:12
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Про MODBUS слова не было.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 27 2016, 19:44
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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) ;




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
x893
сообщение Mar 27 2016, 22:30
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Вектор движения обозначен, дальше дело техники.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 18:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016