С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 0 / 4
Регистрация: 10.04.2015
Сообщений: 58

Настройка СОМ-порта

15.01.2016, 11:04. Показов 3180. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Хотел бы попросить помощи в настройке структуры termios для правильной работы с СОМ-портом. Я честно пытался сам разобраться, но к правильному решению так и не пришел, так как устройство игнорирует мои посылки, хотя через утилиту COM Port toolkit данные приходят ( отправлял необходимую посылку на устройство и получал ответ ).
В документации устройства указаны следующие настройки: 115200 бод, 8 бит, контроль по четности, 1 стоп-бит.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2016, 11:04
Ответы с готовыми решениями:

От СОМ-порта к OpenGL
Ещё раз здравствуйте! Проблема в следующем: с СОМ-порта поступают данные, я их обрабатываю и всё вроде ничего... НО! Если принимать...

График из СОМ порта
Доброго времени суток! Не получается решить довольно тривиальную задачу - графически отобразить данные, принимаемые из СОМ порта. За...

Ловля кода сом порта
Здравствуйте, есть плоттер который общается со своим ПО через сом порт. Признание нужного мне кода требуется его использовать в своей...

12
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
17.01.2016, 16:13
Посмотри мой код. Проверен на железке 8бит, без управления потоком, 1 стоп, чётность не помню на всех скоростях. Других железок нет, потому в деле проверить на реальном железе возможности нет.
Буду рад если проверите мою писанину на другом железе...
http://pastebin.com/YB5419La

http://pastebin.com/ESG7VFEV
1
1 / 0 / 4
Регистрация: 10.04.2015
Сообщений: 58
20.01.2016, 02:17  [ТС]
Благодарю, попробую использовать Ваш пример настройки параметров порта.
Как только появится время, обязательно проверю и отпишусь.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
22.01.2016, 21:17
Вот еще исходники от библиотеки для кассового аппарата
SerialA.cpp
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/////////////////////////////////////////////////////////////////////
// SerialA.cpp: works with serial ports in POSIX environment
//
// Notes: This is only a port of the Windows class.
// Serial manipulations in POSIX are quite different.
// A better implementation would be to use select() or
// other system call, but since serial implementation
// for the older Windows versions made problems with
// Windows handling timeouts, the timeout code is in
// the library
//////////////////////////////////////////////////////////////////////
 
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
//#include <unistd.h>
#include "SerialA.h"
 
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
 
CSerialA::CSerialA()
{
    DriverHandle = -1;
}
 
CSerialA::CSerialA(WORD wCom, DWORD dwBaudRate)
{
    DriverHandle = -1;
    SetupAndOpen(wCom, dwBaudRate);
}
 
CSerialA::~CSerialA()
{
    CloseComPort();
}
 
BOOL CSerialA::SetupAndOpen(WORD wCom, DWORD dwBaud)
{
    CloseComPort(); // close the com port if open
    char szComName[20];
 
    // Make a COMPORT name from a number
    sprintf(szComName, "/dev/ttyS%u", wCom - 1);
 
    DriverHandle = open(szComName, O_RDWR | O_NOCTTY | O_NDELAY);
 
    // Do we have a valid handle? (If not, the driver probably isn't loaded)
    if (-1 == DriverHandle) {
        return FALSE;
    }
 
    // return immediately if no data available (no blocking)
    fcntl(DriverHandle, F_SETFL, FNDELAY);
 
    // Setting the baud rate.
    struct termios options;
 
    // Get the current options for the port...
    tcgetattr(DriverHandle, &options);
    memcpy(&termios_save, &options, sizeof(struct termios));
 
    // Set the baud rate
    speed_t baud;
 
    switch (dwBaud) {
        case 1200: baud = B1200; break;
        case 2400: baud = B2400; break;
        case 4800: baud = B4800; break;
        case 9600: baud = B9600; break;
        case 19200: baud = B19200; break;
        case 38400: baud = B38400; break;
        case 57600: baud = B57600; break;
        case 115200: baud = B115200; break;
        default: return FALSE;
    }
 
    cfsetispeed(&options, baud);
    cfsetospeed(&options, baud);
 
    // Enable the receiver and set local mode...
    options.c_cflag = CLOCAL | CREAD | IGNPAR | IGNBRK | CS8/* | HUPCL */| baud;
 
    options.c_oflag = 0;
    options.c_lflag = 0;
 
    // Set the new options for the port...
    tcsetattr(DriverHandle, TCSANOW, &options);
 
    tcflush(DriverHandle, TCOFLUSH);
    tcflush(DriverHandle, TCIFLUSH);
 
    return TRUE;
}
 
void CSerialA::CloseComPort()
{
    if (DriverHandle && (-1 != DriverHandle))
    {
        tcsetattr(DriverHandle, TCSANOW, &termios_save);
        tcflush(DriverHandle, TCOFLUSH);
        tcflush(DriverHandle, TCIFLUSH);
        close(DriverHandle);
    }
    DriverHandle = -1;
}
 
BOOL CSerialA::WriteToComPort(void * lpBuf, size_t dwBufSize)
{
size_t dwBytesWritten;
 
    if (-1 == DriverHandle) {
        return FALSE;
    }
 
    // Output the data to the Comport
    dwBytesWritten = write(DriverHandle, lpBuf, dwBufSize);
    if (dwBytesWritten != dwBufSize) {
        return FALSE;
    }
 
    return TRUE;
}
 
BOOL CSerialA::ReadFromComPort(void * lpBuf, size_t dwBufSize, DWORD* lpdwBytesRead)
{
    if (-1 == DriverHandle) {
        *lpdwBytesRead = 0;
        return FALSE;
    }
 
    ssize_t rd = read(DriverHandle, lpBuf, dwBufSize);
    *lpdwBytesRead = (DWORD)rd;
    if (0 >= rd) {
        *lpdwBytesRead = 0;
        return FALSE;
    }
 
    return TRUE;
}
 
void CSerialA::ClearInQueue()
{
    tcflush(DriverHandle, TCIFLUSH);
}
 
int CSerialA::GetPorts(BYTE* portsavail, int size)
{
    memset(portsavail, 0, size);
    int fd, ports = 0;
    int last = 255 >= size ? size : 255;
    char szComName[20];
 
    for (int i = 1; i <= last; i++) {
        // Make a COMPORT name from a number
        sprintf(szComName, "/dev/ttyS%u", i);
        fd = open(szComName, O_RDWR | O_NOCTTY | O_NDELAY);
        if (-1 != fd) {
            portsavail[i] = 1;
            ports++;
            close(fd);
        }
    }
 
    return ports;
}
 
BOOL CSerialA::IsOpen()
{
    return (0 < DriverHandle) ? TRUE : FALSE;
}
SerialA.h
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
#ifndef _SERIALA_H_
#define _SERIALA_H_
 
#ifdef POSIX
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
//typedef unsigned int        DWORD;
#define DWORD               unsigned int
#endif
 
#ifndef TRUE
#define TRUE 1
#endif
 
#ifndef FALSE
#define FALSE 0
#endif
 
#include <termios.h> /* POSIX terminal control definitions */
 
class CSerialA
{
public:
    CSerialA();
    CSerialA(WORD wCom, DWORD dwBaudRate=9600);
    virtual ~CSerialA();
 
    void ClearInQueue();
    BOOL ReadFromComPort(void* lpBuf, size_t dwBufSize, DWORD* lpdwBytesRead);
    BOOL WriteToComPort(void* lpBuf, size_t szBufSize);
    void CloseComPort();
    BOOL SetupAndOpen(WORD wCom, DWORD dwBaudRate=9600);
    BOOL IsOpen();
 
    static int GetPorts(BYTE* portsavail, int size);
 
private:
    int     DriverHandle;
    struct termios termios_save;
};
 
#endif // _SERIALA_H_
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
22.01.2016, 21:42
Цитата Сообщение от kolts Посмотреть сообщение
Вот еще исходники от библиотеки для кассового аппарата
ККТ почти все работают в режиме 8N1 без чётности по 3х-проводному кабелю. Этот режим я уже оттестировал на всех скоростях с блоками ЭКЛЗ. Интересует работа в других режимах (чётность, управление потоком, кол-во стоп-битов)
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
23.01.2016, 00:00
Я не копал так глубоко в этой теме. Пока не знаком с этими терминами.
Пришлось бы разобраться, но у нужного кассового аппарата оказались исходники библиотеки, которая была благополучно скомпилирована под линукс. Еще и описание функций есть.
Если б не было исходников возможно использовал виндовый драйвер под вайном.
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
23.01.2016, 02:03
Драйвера ФРов сплошь и рядом COM-библиотеки, и достать их из linux-окружения в wine-окружении не представляю возможным. Стоит обратить внимание на линуховые OPOS-драйвера от болгарского микроинвеста и ДЭНСИ. Самому писать протокол обмена это ещё то веселье. Особенно не зная нюансов работы ККТ.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
23.01.2016, 03:00
Цитата Сообщение от drfaust Посмотреть сообщение
Драйвера ФРов сплошь и рядом COM-библиотеки, и достать их из linux-окружения в wine-окружении не представляю возможным.
Почему же.
wine regsvr32 ~/.wine/drive_c/Program\ Files/ШТРИХ-М/Драйвер\ ФР\ 4.9/DrvFR.dll
sudo chmod 777 /dev/ttyUSB0
ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com1
Пример взял с сайта. Пробовал на своем аппарате(болгарский tremol) до сборки библиотеки все работает. Более того даже через freerdp пробрасывается. Но начиная с какой то версии, до этого не хотел.
Правда не проверял наскольно безглючно, но думаю проблем быть не должно. Я сейчас делаю фронтофис для кассы на линуксе. Так что дальше надо будет привязать к нему и другие аппараты. Придется изучать вопрос.
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
23.01.2016, 17:46
Это рецепт как завести драйвер под wine. Я на своём арче просто внёс юзера в группу uucp и всё. COM-порты под wine появились.
А вот как из линуховой программы достучаться до виндошного OCX-драйвера? Я об этом говорил, а не о том как штриховский драйвер или любую другую виндошную прогу заставить работать под wine
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
23.01.2016, 22:06
Чтоб не всю программу запускать под вайном(хотя может это и не плохо) я сделаю маленькую программу которая работает под вайном и обменивается с основной через удп.
Хотя что касается кассовых аппаратов для знающего человека(к которым я пока себя не отношу) написать обмен с программой при наличии протокола обмена раз плюнуть. Или воосоздать протокол прослушивая данные.
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
24.01.2016, 17:16
По штрихам он в открытом доступе ftp://ftp.shtrih-m.ru/download... R_1.12.pdf
Но нужно знать алгоритм работы ФРов, напр. ничего не запрограммируешь при открытой смене, действия ПО в случае обрыва бумаги(подать команду "продолжить печать"), обработка ошибок. Чек пробивается целой последовательностью команд и там тоже есть подводные камни(например при оплате безналом(платежи 2-4)), так же есть возможность оплаты совместно и безналом и налом в одном чеке. Короче там очень много всяких нюансов.

По поводу драйвер и минисервер под wine, а РМК под линухом - а смысл?, если всё-равно тащить wine не лучше ли написать уже под винду и всё запускать под wine`ом?

Самому же протокол реализовывать - очень трудоёмко и косяков много может быть. Под линух есть http://sourceforge.net/projects/drvfr/ , но я не знаю в каком он состоянии.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
24.01.2016, 19:25
Я делал обработку для 1С да и исходники можно ковырять http://sourceforge.net/projects/zfplib/.
Ничего экстраординарного нет, поддается изучению.
Цитата Сообщение от drfaust Посмотреть сообщение
если всё-равно тащить wine не лучше ли написать уже под винду и всё запускать под wine`ом?
В качестве временного костыля.
Цитата Сообщение от drfaust Посмотреть сообщение
Самому же протокол реализовывать - очень трудоёмко и косяков много может быть. Под линух есть http://sourceforge.net/projects/drvfr/ , но я не знаю в каком он состоянии.
Для программиста ничего сложного. Надо реализовать около 10 операций + парочку служебных функций. Полгода назад для меня это был темный лес, через месяц-другой буду за пару дней писать нужные функции.
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
25.01.2016, 09:18
Ну если не весь протокол - то да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2016, 09:18
Помогаю со студенческими работами здесь

График данных СОМ-порта
Доброго времени суток! Подниму еще раз избитую тему, но не могу найти подробный материал (желательно с исходниками). Переделал под...

Получить сигнал с СОМ-порта
Здравствуйте.Собсно поставлена такая задача - получить по COM-порту код,преобразовать в число и вывести на экран.Тоесть например идет набор...

Как изменить номер СОМ порта
Добрый день. Есть некий проект который подсоеденяется к оборудованию через СОМ1. Как можно поменять на СОМ* В описании говорится что...

Нет ли от сом порта особого сообщения...?
Нет ли от сом порта особого сообщения, при поступлении в него данных для чтения передаваемого сразу в приложение? Имею ввиду сообщения...

Чтение и обработка данных из СОМ порта
Добрый день! Есть программа для работы с внешним устройством через СОМ порт. Данные у меня она отправляет на ура, а вот с чтением у меня...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru