Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54

Чтение данных из файла и их передача через порт компьютера

21.05.2017, 10:15. Показов 8949. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть задача: в текстовый файл в реальном времени пишется поток данных (углы наклона прибора в градусах). Необходимо считывать данные из этого файла в реальном времени и передавать их через COM- порт, с дальнейшей передачей данных на ЦАП и получения эквивалентного напряжения (из файла считалось, например, 5 градусов, дальше эти 5 градусов ушли через порт, там преобразовались в напряжение).

Собственно вопросы:
1)Как это реализовать и что для этого надо?
2)Можно ли делать чтение с определенной строчки и до конца?

Добавлено через 16 минут
Либо вместо COM использовать USB
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2017, 10:15
Ответы с готовыми решениями:

Чтение/передача данных через USB порт
Задача такова: есть внешний микроконтроллер (Arduino) который связан с ПК ч/з USB (некоторый COM-порт) и вот нужно принимать инфу или её...

Чтение данных через COM порт
Имеется устройство, панель кнопок, связанная с компом через RS-232 т.е. COM порт. Хочу сделать прогу, которая отображала бы нажатие...

Передача данных через Com порт
Добрый день форумчане! Мне с помощью программы "free-serial-port-monitor" удалось считал данные, которыми через com порт обменивались...

67
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 15:07
Студворк — интернет-сервис помощи студентам
Ты не понимаешь, как устроено оконное приложение. Обработчик должен возвращать управление как можно скорее, иначе всё зависает. Переделывай с таймером. В этом обработчике должно быть открытие файла и старт таймера. А обработчик таймера извлекает одну строку из файла за один вызов. Соответственно цикл исчезает.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
25.05.2017, 16:47  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ты не понимаешь, как устроено оконное приложение. Обработчик должен возвращать управление как можно скорее, иначе всё зависает. Переделывай с таймером. В этом обработчике должно быть открытие файла и старт таймера. А обработчик таймера извлекает одну строку из файла за один вызов. Соответственно цикл исчезает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*while(!feof(file))
    {  */
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            Edit1->Text = (FloatToStr(Gload_n));
            Sleep(1);
        }
        else
            fseek(file, p, SEEK_SET);
 
    /*}*/
Сделал так, теперь, как я понял, за одно нажатие на кнопку происходит считывание и запись, для дальнейшего надо снова нажимать. Мне же надо, чтобы я 1 раз нажал на кнопку, либо заменить на другой объект, например checkbox, при активном положении которого постоянно бы происходило непрерывное считывание. Я просто изучал C++ по самоучителю Шилда без особой практики, для себя, поэтому плохо ориентируюсь тут.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 16:56
Ещё раз: таймер создай на 10 миллисекунд - TTimer, и вот этот кусок вставь в обработчик таймера.

Добавлено через 4 минуты
И никаких Sleep().
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
25.05.2017, 18:18  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ещё раз: таймер создай на 10 миллисекунд - TTimer, и вот этот кусок вставь в обработчик таймера.
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    FILE *file;
    float pitch, roll, headingt, headingm, Mach, VVI, Gload_n, Gload_a, Gload_s, alpha, beta, hpath, vpath, slip;
    char s[224];
    file=fopen("Data.txt","r");
 
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
Edit1->Clear();
Edit1->Text = FloatToStr(Gload_n); 
        }
        else
            fseek(file, p, SEEK_SET);
 
        fclose(file);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Timer1->Enabled = false;
}
Сделал так, все работает, только вот Edit1 слишком быстро получает данные, не успевает отображать их.

Добавлено через 29 минут
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = true;
  if (Timer1->Enabled)
  {
    ActivityIndicator1->Animate = true;
  }
  else ActivityIndicator1->Animate = false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    FILE *file;
    char s[224];
    file=fopen("Data.txt","r");
 
        long p = ftell(file);
 
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            Edit1->Text = FloatToStr(Gload_n);
            Edit2->Text = FloatToStr(Mach);
            Edit3->Text = FloatToStr(roll);
            Edit4->Text = FloatToStr(slip);
            Edit5->Text = FloatToStr(headingt);
            Edit6->Text = FloatToStr(pitch);
        }
        else
            fseek(file, p, SEEK_SET);
 
        fclose(file);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Timer1->Enabled = false;
    if (!(Timer1->Enabled))
  {
    ActivityIndicator1->Animate = false;
  }
}
Сделал так, теперь Edit не пишет текст, просто 0 выводит, однако алгоритм работает(пытался стирать значение, он заново его выписывал - значит вывод работает).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 18:19
Открытие/закрытие файла должно быть не здесь. При старте/завершении программы или при нажатии кнопок. По таймеру просто чтение.
А так у тебя всё время первая строка будет.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
25.05.2017, 19:12  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
А так у тебя всё время первая строка будет.
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
TForm1 *Form1;
//---------------------------------------------------------------------------
FILE *file1;
char s[224];
float pitch, roll, headingt, headingm, Mach, VVI, Gload_n, Gload_a, Gload_s, alpha, beta, hpath, vpath, slip;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  Timer1->Enabled = false;
  Edit1->Clear();
  Edit2->Clear();
  Edit3->Clear();
  Edit4->Clear();
  Edit5->Clear();
  Edit6->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Timer1->Enabled = true;
  if (Timer1->Enabled)
  {
    ActivityIndicator1->Animate = true;
  }
  else
    ActivityIndicator1->Animate = false;
   file1=fopen("Data.txt","r");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    Timer1->Enabled = false;
    if (!(Timer1->Enabled))
  {
    ActivityIndicator1->Animate = false;
  }
    fclose(file1);
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   long p = ftell(file1);
 
        if (fgets(s, 224, file1) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            Edit1->Clear();
            Edit1->Text = Gload_n;
            Edit2->Clear();
            Edit2->Text = FloatToStr(Mach);
            Edit3->Clear();
            Edit3->Text = FloatToStr(roll);
            Edit4->Clear();
            Edit4->Text = FloatToStr(slip);
            Edit5->Clear();
            Edit5->Text = FloatToStr(headingt);
            Edit6->Clear();
            Edit6->Text = FloatToStr(pitch);
        }
        else
            fseek(file1, p, SEEK_SET);
}
//---------------------------------------------------------------------------
Сделал вот так. Проблема: файл читается даже тогда, когда симуляция на паузе(строки в документ не добавляются). Из-за этого начинают плыть данные. Как исправить?

Добавлено через 16 минут
То есть должно быть x.xxxxx, а получается 1,00769996643066(пример из программы), еще и не совпадает с консольными вычислениями, в добавок на паузе продолжается считывание данных.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 21:02
То, что он читается, когда нет добавления, - нормально. Но должна секция else срабатывать, а данные в Edit'ах не изменяться. Не ясно, что у тебя там "плывёт".
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
26.05.2017, 09:21  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Но должна секция else срабатывать, а данные в Edit'ах не изменяться.
Ну вот, а они меняются, так еще к х.ххххх добавляются левые числа. Код в консольном приложении и в оконном - один и тот же, он только разнесен по кнопкам, но выводит данные не правильно.
Можно ли как-то из формы по кнопке запускать консольное приложение которое лежит рядом в папке/этом же проекте и по другой кнопке закрывать его?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.05.2017, 17:05
Цитата Сообщение от Jank Посмотреть сообщение
когда симуляция на паузе(строки в документ не добавляются)
Файл при этом закрывается и потом после паузы с начала перезаписывается или добавляется?

Что за х.ххххх? У тебя где-то ошибка.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
26.05.2017, 18:42  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Файл при этом закрывается и потом после паузы с начала перезаписывается или добавляется?
Шла симуляция - шла запись.
Пауза в симуляции - пауза в записи.
Продолжение симуляция - продолжения записи(строки добавляются, стары остаются).
Цитата Сообщение от nmcf Посмотреть сообщение
Что за х.ххххх? У тебя где-то ошибка.
Это выходное значение, например -1.55383. Если запустить консольное приложение, то там такое значение и получается, то есть оно совпадает со значением симуляции(это отслеживается), а в оконном получается -1.55383 и еще куча цифр, это в лучшем случае, в худшем - просто набор цифр. Есть мнение, что в Edit данные не просто приходят, а они суммируются с предыдущими или как.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.05.2017, 19:05
Сколько там цифр - это вопрос форматирования и погрешности представления. Если нужно именно 5 после запятой, то используй явное форматирование, а не FloatToStr.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
26.05.2017, 19:41  [ТС]
На просторах необъятной Родины нашел этот пример. Помогите переделать его так, чтобы я не текст слал(char), а значение переменных(float). Как я понимаю, один порт - один поток данных, в моем случае - одна переменная. Чтобы в это же время послать другую переменную, нужен еще один порт, так?
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
#include <windows.h>
#include <iostream>
using namespace std;
//-----------------------------------------------------------------------------
HANDLE hSerial; //Объявляем обработчик com порта
//-----------------------------------------------------------------------------
void ReadCOM()
{
      DWORD iSize;
      char sReceivedChar;
      while (true)
      {
            ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
            if (iSize > 0)   // если что-то принято, выводим
                cout << sReceivedChar;
      }
}
//-----------------------------------------------------------------------------
 int _tmain(int argc, _TCHAR* argv[]) 
{
    LPCTSTR sPortName = "COM1"; //Объявление строки с именем порта
 
    hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); //Открываем первый ком порт для записи/чтения
//-----------------------------------------------------------------------------
    if(hSerial==INVALID_HANDLE_VALUE)  //Проверяем работоспособность
{
        if(GetLastError()==ERROR_FILE_NOT_FOUND)
    {
        cout << "serial port does not exist.\n";
    }
    cout << "some other error occurred.\n";
}
//-----------------------------------------------------------------------------
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
        cout << "getting state error\n";
    }
    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    if(!SetCommState(hSerial, &dcbSerialParams))
    {
        cout << "error setting serial port state\n";
    }
//-----------------------------------------------------------------------------
    char data[] = "Тут должна быть ваша реклама!";  // строка для передачи
    DWORD dwSize = sizeof(data);   // размер этой строки
    DWORD dwBytesWritten;    // тут будет количество собственно переданных байт
//-----------------------------------------------------------------------------
    BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten,NULL); //Посылаем строку
    cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl; //Контрль размера строки и отосланных байт
//-----------------------------------------------------------------------------
    while(1)
    {
        ReadCOM(); //Бесконечный цикл чтения данных
    }
//-----------------------------------------------------------------------------
    CloseHandle(hSerial); //Закрываем порт
//-----------------------------------------------------------------------------
    system("pause");
    return 0;
}
Если я правильно понимаю, то фраза "Тут должна быть ваша реклама!" уже находится на порте, стоит только подключить внешнее у-во к порту и это строка пойдет на это устройство, так?

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Сколько там цифр - это вопрос форматирования и погрешности представления. Если нужно именно 5 после запятой, то используй явное форматирование, а не FloatToStr
Дело в том, что там всего (-)х.ххххх знаков, других там быть не может) Т.е. он лишнее что-то приплетает) почему консольное приложение считывает как есть, то есть (-)х.ххххх, а оконное что попало, хотя код одинаковый)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.05.2017, 21:05
Цитата Сообщение от Jank Посмотреть сообщение
там всего (-)х.ххххх знаков
В текстовой записи - да, а после преобразования во float может быть сколько угодно. Читай про погрешность представления.

Добавлено через 19 минут
Цитата Сообщение от Jank Посмотреть сообщение
Если я правильно понимаю, то фраза "Тут должна быть ваша реклама!" уже находится на порте, стоит только подключить внешнее у-во к порту и это строка пойдет на это устройство, так?
Это массив, из которого данные берутся.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
27.05.2017, 08:09  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Это массив, из которого данные берутся.
Отложил пока работу с оконным приложением, вернулся в консольное. Вот код:
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
//-----------------------------------------------------------------------------
#include <windows.h>
#include <stdlib.h>
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
//-----------------------------------------------------------------------------
HANDLE hSerial; //Объявляем обработчик com порта
//-----------------------------------------------------------------------------
void ReadCOM() //Функция чтения данных
{
      DWORD iSize;
      char sReceivedChar;
      while (true)
      {
            ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);  // получаем 1 байт
            if (iSize > 0)   // если что-то принято, выводим
                cout << sReceivedChar;
      }
}
//-----------------------------------------------------------------------------
int main()
{
//-----------------------------------------------------------------------------
    LPCTSTR sPortName = "COM1"; //Объявление строки с именем порта
    hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); //Открываем первый ком порт для записи/чтения
//-----------------------------------------------------------------------------
    if(hSerial==INVALID_HANDLE_VALUE)  //Проверяем работоспособность
    {
            if(GetLastError()==ERROR_FILE_NOT_FOUND)
            {
                cout << "serial port does not exist.\n";
            }
            cout << "some other error occurred.\n";
    }
//-----------------------------------------------------------------------------
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams))
    {
        cout << "getting state error\n";
    }
    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    if(!SetCommState(hSerial, &dcbSerialParams))
    {
        cout << "error setting serial port state\n";
    }
//-----------------------------------------------------------------------------
    FILE *file;
    float pitch, roll, headingt, headingm, VVI, Gload_n, Gload_a, Gload_s, alpha, beta, hpath, vpath, slip, Mach;
    char s[224];
    file=fopen("Data.txt","r");
//-----------------------------------------------------------------------------
   DWORD dwBytesWritten;    // тут будет количество собственно переданных байт
//-----------------------------------------------------------------------------
    while(1)
    {
        long p = ftell(file);
        if (fgets(s, 224, file) != NULL)
        {
            sscanf(s, "%f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f | %f |", &Mach, &VVI, &Gload_n, &Gload_a, &Gload_s, &pitch, &roll, &headingt, &headingm, &alpha, &beta, &hpath, &vpath, &slip);
            char data[8] = Mach;  // ТА САМАЯ СТРОКА
            DWORD dwSize = sizeof(data);   // размер этой строки
            BOOL iRet = WriteFile (hSerial,data,dwSize,&dwBytesWritten,NULL); //Посылаем строку
            cout << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl; //Контрль размера строки и отосланных байт
            /*printf("%f\n", Mach);*/
            ReadCOM(); //Бесконечный цикл чтения данных
        }
        else
            fseek(file, p, SEEK_SET);
    }
//-----------------------------------------------------------------------------
        fclose(file); //Закрываем чтение файла
        CloseHandle(hSerial); //Закрываем порт
        system("pause");
//-----------------------------------------------------------------------------
    return 0;
}
Как мне в строке char data[8] = Mach; заставить понимать char data[] значение float? И еще момент: мне же нужно отправлять числа(эти самые float), а не строковые переменные. Есть вариант - "Передавать символ, код которого соответствует нужному числу". Как это реализовать или предложите альтернативу, я уже голову сломал.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2017, 08:27
C++
1
WriteFile (hSerial, reinterpret_cast<char *>(&Mach), sizeof(Mach), &dwBytesWritten, NULL);
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
27.05.2017, 16:33  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
WriteFile (hSerial, reinterpret_cast<char *>(&Mach), sizeof(Mach), &dwBytesWritten, NULL);
Теперь данные поступают в порт, это хорошо. А как мне на выходе порта получить ЧИСЛА, чтобы ЦАП смог их обработать?
И еще, данные отправляются постоянно, даже когда конец документа достигнут - это так и должно быть, типа специфика работы с портом?

Цитата Сообщение от Jank Посмотреть сообщение
И еще, данные отправляются постоянно, даже когда конец документа достигнут - это так и должно быть, типа специфика работы с портом?
Все в порядке, мой косяк. Когда идет симуляция и она паузится, то COM программа тоже на паузе. Ерунда, которую я описал, появляется только при отсутствии симуляции, то есть просто при прогонке по файлу.

По поводу COM-порта... Его на плате не нашел, но в описании нашел IEEE 1394a port. Как я понял, это одно и тоже, практически. Но вот момент, судя по картинкам, там 3х-пиновый выход, а мой же выходит на 2 usb... Либо я путаю что-то...
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
27.05.2017, 16:43  [ТС]
Хотя COM отдельно, IEEE отдельно... Ничего непонимаю
Миниатюры
Чтение данных из файла и их передача через порт компьютера  
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
27.05.2017, 16:57  [ТС]
Размещение COM'а - Intel(R) P67 Express Chipset Family LPC Interface Controller - 1C46
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.05.2017, 18:06
Разные они. Ты книжку нашёл от платы? Там всё написано. Обычно набор контактов с чёрным ограничителем и надпись рядом COM.
Цитата Сообщение от Jank Посмотреть сообщение
А как мне на выходе порта получить ЧИСЛА, чтобы ЦАП смог их обработать?
Туда и так числа идут. Протокол какой? Описание читай.
0
0 / 0 / 0
Регистрация: 07.10.2015
Сообщений: 54
27.05.2017, 18:12  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Ты книжку нашёл от платы? Там всё написано. Обычно набор контактов с чёрным ограничителем и надпись рядом COM.
Книжку нашел, COM нету, есть IEEE. P8P67 PRO плата.

Добавлено через 41 секунду
Цитата Сообщение от nmcf Посмотреть сообщение
Туда и так числа идут. Протокол какой? Описание читай.
То есть если у меня Mach примет значение -1.123456, то на ЦАП через порт уйдет число -1.123456, а не текст "-1.123456", так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2017, 18:12

Передача данных через ИК порт
Нужно организовать систему передачи данных через инфракрасный на ассемблере. ИК должен подключаться к ком порту. Подскажите пожалуйста,...

Получение и передача данных через COM порт
Добрый день Мне кажется, я изобретаю велосипед и должно быть полно примеров такого кода. Но ничего найти не удалось. Суть:...

Передача и приём данных через COM порт
Задача такая, нужно через ком порт передавать и принимать пачки байтов, всё это по протоколу modbus rtu. Установил библиотеки ком порта...

Передача данных через последовательный порт
Ребят, всем добрый вечер! Предстоит следующая задача: нужно реализовать, например - в отдельном классе, функции для передачи данных через...

Передача и приём данных через COM-порт
Добрый день! Передо мной поставили задачу написать программу для работы с адаптером OBD2 Elm327 через виртуальный COM-порт. Пробую пока...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru