Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/41: Рейтинг темы: голосов - 41, средняя оценка - 4.95
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18

Писать и читать ttyS0

17.02.2012, 21:44. Показов 7962. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите разобратся, нужно сделать так чтобы прога отправляла в компорт 0хСС и слушала ответ получив в ответ 0х77 отправляла 0х33 и опять слушала ответ, получив 0х88 завершалась бы с положительным результатом.
программист я никакой, прошу громко не смеятся.

C
1
2
3
4
5
6
7
8
unsigned char sync_s_fst =0xCC;
unsigned char sync_s_sec =0x33;
unsigned char sync_r_fst =0x77;
unsigned char sync_r_sec =0x88;
write(fd, "sync_s_fst", 1);
        read(fd,&sync_r_fst,1);
write(fd, "sync_s_sec", 1);
        read(fd,&sync_r_sec,1);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.02.2012, 21:44
Ответы с готовыми решениями:

Читать и писать tif/tiff
День добрый, возникла необходимость читать/писать tif/tiff. Подскажите готовые библиотеки, желательно бесплатные. Спасибо

Чем читать-писать XML
Добрый день! Вот, возникла задача - нужно данные хранить в формате XML. Пишу на С++ (Visual Studio 2005). Как я понял, технология .NET...

Можно ли на VBScript писать/читать файл?
подскажите по сабжу плиз

11
4 / 4 / 0
Регистрация: 21.02.2012
Сообщений: 7
22.02.2012, 00:17
Вот на C:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdio.h>
 
#define PORT "/dev/ttyS0"
#define BAUDRATE B9600
 
int main(){
 int fd = open(PORT, O_RDWR | O_NOCTTY);
 if (fd<0)
  return 1;
 if (!isatty(fd))
  return 2;
 struct termios port_cfg;
 if (tcgetattr(fd, &port_cfg)<0)
  return 3;
 cfmakeraw(&port_cfg);
 cfsetospeed(&port_cfg, BAUDRATE);
 cfsetispeed(&port_cfg, BAUDRATE);
 if (tcsetattr(fd, TCSANOW, &port_cfg)<0)
  return 4;
 
 unsigned int val;
 
 val=0xCC;
 int ret = write(fd, &val, 1);
 if (ret!=1)
  return 5;
 ret = read(fd, &val, 1);
 if ((ret!=1)||(val!=0x77))
  return 6;
 val = 0x33;
 ret = write(fd, &val, 1);
 if (ret!=1)
  return 7;
 ret = read(fd, &val, 1);
 if ((ret!=1)||(val!=0x88))
  return 8;
 close(fd);
 return 0;
 
}
Это поправьте на нужное вам(в BAUDRATE букву B не забудьте)
C
1
2
#define PORT "/dev/ttyS0"
#define BAUDRATE B9600
компилировать
gcc prog.c -o prog
возвращает 0 если всё хорошо.
т.е
./prog && echo ok
./prog || echo fail
1
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18
22.02.2012, 09:56  [ТС]
спасибо большое за ответ я уже написал вот так
C
1
2
3
4
5
6
7
8
9
10
11
/**** subprogramm ****/
char handshake (int fd)
{
  unsigned char sync_re;
  write (fd,"\xCC",1);
  while((read(fd,&sync_re,1))<=0);
    write (fd,"\x33",1);
  while((read(fd,&sync_re,1))<=0);
    if(sync_re == 0x88) return 1;
      else return 0;
}
это подпрограмма только, я уже всю прогу написал, работает однако.
0
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18
27.02.2012, 11:32  [ТС]
как оказалось не совсем все ещё работает, программа должна отсылать блоки размером 512 или 1024 или 2048 или 4096 байт, пишу через функцию
C
1
 write_number = write( fd, data, blk_size);
так вот если blk_size 512 или 1024 или 2048 всё прекрасно работает, а вот если 4096 то write_number возвращает 0xFFF и на этом всё встает.

уже не знаю что делать, может порт настроен не так?
настройка порта вот:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# cat init_serial.c
#define SERIAL_DEVICE "/dev/ttyS0"
#define MYBAUDRATE B115200
/*********************************/
int Initial_SerialPort(void)
{
        int fd;
        struct termios options;
        fd = open( SERIAL_DEVICE , O_RDWR | O_NOCTTY | O_NDELAY );
        if ( fd == -1 )
        {
                /*open error!*/
                perror("Can't open port!");
                return -1;
        }
        /*Get the current options for the port...*/
        tcgetattr(fd, &options);
 
        /*Set the baud rates to BAUDRATE...*/
        cfsetispeed(&options,MYBAUDRATE);
        cfsetospeed(&options,MYBAUDRATE);
        tcsetattr(fd, TCSANOW, &options);
        if (0 != tcgetattr(fd, &options))
        {
                perror("SetupSerial 1");
                return -1;
        }
 
        /*
         * 8bit Data,no partity,1 stop bit...
         */
 
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;
        tcflush(fd,TCIFLUSH);
 
        /***Choosing Raw Input*/
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        options.c_oflag &= ~OPOST;
 
        /*
         * Set the new options for the port...
         */
        if (0 != tcsetattr(fd, TCSANOW, &options))
        {
                perror("SetupSerial error");
                return -1 ;
        }
        return fd ;
}
0
4 / 4 / 0
Регистрация: 21.02.2012
Сообщений: 7
27.02.2012, 14:43
Цитата Сообщение от vidbo Посмотреть сообщение
как оказалось не совсем все ещё работает, программа должна отсылать блоки размером 512 или 1024 или 2048 или 4096 байт, пишу через функцию
C
1
 write_number = write( fd, data, blk_size);
ну можно сделать костыль
C
1
2
3
4
if (blk_size>2048){
 int write_number = write(fd, data, 2048);
 write_number += write(fd, &data[2048], blk_size-2048);
}
1
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18
27.02.2012, 18:02  [ТС]
костыль не поможет я уже примерно так пробовал.

но что еще интересно если запускать прогу из под strace то всё работает как надо.
0
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18
06.03.2012, 11:53  [ТС]
подскажите как проверить имеются ли байты в буфере передачи или он пустой, тоесть я хочу отправить блок размером 4к предварительно убедившись что буффер отправки пуст.

Добавлено через 12 часов 36 минут
спасибо parus вопрос решён посоветованым вами костылём с доработками! после отправки половины блока надо дождатся пока порт не сьест то что ему дали.
однако почему в линуксе буффер для отправки в компорт такой маленький, непорядок.
0
06.03.2012, 17:42
 Комментарий модератора 
Дружно используем тег кода соответствующего языка с подсветкой синтаксиса.
1
4 / 4 / 0
Регистрация: 21.02.2012
Сообщений: 7
06.03.2012, 20:05
Цитата Сообщение от vidbo Посмотреть сообщение
подскажите как проверить имеются ли байты в буфере передачи или он пустой, тоесть я хочу отправить блок размером 4к предварительно убедившись что буффер отправки пуст.

Добавлено через 12 часов 36 минут
спасибо parus вопрос решён посоветованым вами костылём с доработками! после отправки половины блока надо дождатся пока порт не сьест то что ему дали.
однако почему в линуксе буффер для отправки в компорт такой маленький, непорядок.
Насколько я помню, буффер компорта определяется BIOS'ом. Могу ошибаться. Для ожидания окончания отправки можно использовать функцию tcdrain
1
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18
07.03.2012, 18:23  [ТС]
Цитата Сообщение от parus Посмотреть сообщение
Насколько я помню, буффер компорта определяется BIOS'ом. Могу ошибаться. Для ожидания окончания отправки можно использовать функцию tcdrain
да, её я и использовал, и теперь всё работает, как я выяснил, буферу компорта нельзя скармливать блоками более чем 0xFFF.
да я как писал выше ниразу не программер, но прогу написал, теперь надо ещё одну прогу чтобы считывать, алгоритм примерно такой, (всё в текстовом виде) отправляем команду(или несколько) - читаем ответ, все ответы складывать в 1 текстовый файл(дописывать в конец.
0
4 / 4 / 0
Регистрация: 21.02.2012
Сообщений: 7
07.03.2012, 22:21
Цитата Сообщение от vidbo Посмотреть сообщение
да, её я и использовал, и теперь всё работает, как я выяснил, буферу компорта нельзя скармливать блоками более чем 0xFFF.
да я как писал выше ниразу не программер, но прогу написал, теперь надо ещё одну прогу чтобы считывать, алгоритм примерно такой, (всё в текстовом виде) отправляем команду(или несколько) - читаем ответ, все ответы складывать в 1 текстовый файл(дописывать в конец.
Вот пример работы с файлом
C
1
2
3
4
5
6
7
8
9
FILE* file = fopen("/path/to/file", "a+");// открытие файла /path/to/file для дозаписи, если не существует, то осуществляется попытка его создать
if (file==NULL){
 /* ошибка открытия файла */
}
int ret = fprintf(file, "data to be written, %d\n", 43);
if (ret<0){
 /* ошибка записи в файл*/
}
fclose(file); // обязательно нужно закрыть файл
Для срочного вывода в файл(сброс буффера) используйте fflush
1
6 / 6 / 0
Регистрация: 09.02.2012
Сообщений: 18
17.03.2012, 15:15  [ТС]
вот что получилось, поправьте плз где что не так, и не понял как делать выбор ком-порта.
такто оно работает, но может гдето чтото можно сделать более правильно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include     <stdio.h>
#include     <unistd.h>
#include     <fcntl.h>
#include     <termios.h>
 
#include     "sdld_send.c"
 
//*********************************************************//
void usage(void)        {
  fprintf(stderr, "\
  Usage: sdld  [-p serial port][-s blocksize] [-r baudrate] filename\n\
  serial ports: 0(default), 1, 2, 3;   0 = (/dev/ttyS0)\n\
  baudrates: 9600, 19200, 38400, 57600, 115200\n\
  Block size are in bytes. 0=512(default), 1=1024,2=2048 ,3=4096 \n\
  example: sdld -p 0 -s 2 -r 9600 firmware.bin)\n");
  return;         }
//*********************************************************//
 
/*
*      Externals.
*/
  extern int optind;
  extern char *optarg;
 
//***********************************************//
int Initial_SerialPort(MYBAUDRATE)
{
        int fd;
        struct termios options;
 
        fd = open( "/dev/ttyS0" , O_RDWR | O_NOCTTY | O_NDELAY );
        if ( fd == -1 )
        {perror("Can't open port!");
                return -1;      }
        /*Get the current options for the port...*/
        tcgetattr(fd, &options);
        /*Set the baud rates to BAUDRATE...*/
        cfsetispeed(&options,MYBAUDRATE);
        cfsetospeed(&options,MYBAUDRATE);
        tcsetattr(fd, TCSANOW, &options);
        if (0 != tcgetattr(fd, &options))
        {perror("SetupSerial 1");
                return -1;      }
        /* 8bit Data,no partity,1 stop bit... */
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;
        tcflush(fd,TCIFLUSH);
        /***Choosing Raw Input*/
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        options.c_oflag &= ~OPOST;
        /* Set the new options for the port...*/
        if (0 != tcsetattr(fd, TCSANOW, &options))
        {perror("SetupSerial error");
                return -1;      }
        return fd ;
}
 
//***********************************************//
int main(int argc, char **argv)
{
  int fd;
  int c,ret;
  char *file;
  FILE *datafile;
  unsigned int baud_rate;
  unsigned int blk_size = 0x200;
//  unsigned char s_port;
  char *speed;
//  char *serial_port;
 
  while ((c = getopt(argc, argv, "hs:r:")) != EOF) {
    switch (c) {
      case 'h':
        usage();
        return 1;
//      case 'p':
//        s_port = atoi(optarg);
//        break;
      case 's':
if ((atoi(optarg) > 3) || (atoi(optarg) < 0)) {usage(); return -1;};
        blk_size = (0x200 << atoi(optarg));
        break;
      case 'r':
        baud_rate = atoi(optarg);
        break;
      default:
//        serial_port = "/dev/ttyS0";
//        blk_size = 0x200;
//        baud_rate = 9600;
//        usage();
        break;
    }
  }
 
  if (optind != argc - 1)
    {    usage();
    return -1 ; }
 
  file = argv[optind];
 
//  switch(s_port)      {
//    case 0:           serial_port = "/dev/ttyS0";     break;
//    case 1:           serial_port = "/dev/ttyS1";     break;
//    case 2:           serial_port = "/dev/ttyS2";     break;
//    case 3:           serial_port = "/dev/ttyS3";     break;
//    default:           serial_port = "/dev/ttyS0";    break; }
 
  switch(baud_rate)     {
    case 9600:          speed = "B9600";        break;
    case 19200:         speed = "B19200";       break;
    case 38400:         speed = "B38400";       break;
    case 57600:         speed = "B57600";       break;
    case 115200:        speed = "B115200";      break;
    case 230400:        speed = "B230400";      break;
    default:             speed = "default";     break; }
 
//*************open serial port******************//
    if ((fd = Initial_SerialPort(speed)) == -1)
    {
    fprintf (stderr, "Can't open port!\n");
                        return -1 ;
    }
//*****************open file*********************//
    if((datafile=fopen(file ,"rb"))==NULL)
    {
    fprintf (stderr, "Can't open file!\n");
                        return -1 ;
    }
//***********************************************//
    fprintf(stderr, "SDLD upload of \"%s\"\n", file);
    fprintf(stderr, "Block size: %d b\n", blk_size);
//    fprintf(stderr, "Serial port: %s \n", serial_port);
    fprintf(stderr, "Baud rate: %s \n", speed);
    ret = asend( fd, datafile, blk_size );
            fclose(datafile);
            close(fd);
 
  return ret < 0 ? 1 : 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2012, 15:15
Помогаю со студенческими работами здесь

Писать читать члены структуры генерик способом.
Есть структура с разными данными typedef struct MOTOR_DATA_S { //run time uint32_t state; uint32_t dir; uint32_t speed; ...

Нужно читать по байтам и писать в другой файл.
Dim Sim As String, NameFile1 As String NameFile1 = '__' &amp; NameFile Open NameFile For Input As #1 Open NameFile1 For Output As #2 ...

EEPROM 24cXX. научите как читать/писать не выпаивая?
В последнее время всё чаще сталкиваюсь с необходимостью считать с живой или дохлой платы содержимое EEPROM и залить в другую плату, а я...

TMemoryStream & Struct, как читать/писать структуры из/в поток?
на ++ пытаюсь перейти недавно... на С, задача была тривиальной и решена давно, но по обстоятельствам нужно перенести на С++. на...

Создать программу, позволяющую писать и читать данные в текстовый файл
3. Создать программу, позволяющую писать и читать данные в текстовый файл. Данными являются арифметические выражения.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru