Считывание данных с COM порта

NAYGER
Offline
Зарегистрирован: 15.03.2020
День добрый.
 
Задача просто считать данные с COM порта и выводить их на экран, пока поступают данные.
Примерно понял, как должна выглядеть структура кода, подписал, где что происходит.
Подскажите, как будет правильно выглядеть код на языке СИ и какой будет код, для вывода данных на экран.
 
int Number_COM, Speed_COM;	//переменные для ввода номера и скорости порта
 
{
 
printf ("Vvedite nomer COM porta:",\n);
scanf (Number_COM);
printf ("\n");
    HANDLE handle = CreateFile (Number_COM, 		//эта строка всегда имеет один и тот же вид
                GENERIC_READ | GENERIC_WRITE, 
                NULL, 
                NULL, 
                OPEN_EXISTING, 
                FILE_FLAG_OVERLAPPED, 
                NULL
               );
 
    GetCommState (HANDLE hPort,			//эта функция задаёт стандартные параметры порта, возможно и не нужна???
                  LPDCB lpDCB
             );
 
printf ("Vvedite skorost COM porta:",\n);
scanf (Speed_COM);
printf ("\n");
    dcb.BaudRate = Speed_COM;			//в DCB задаются основные параметры COM порта
    dcb.fBinary = TRUE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fNull = FALSE;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = FALSE;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = 1;
 
    SetCommState (HANDLE hPort,			//конфигурация COM порта
                  LPDCB lpDCB
             );
 
    CommTimeOuts.ReadIntervalTimeout= 10;		//cto задаётся время приёма и ожидания посылки
    CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
    CommTimeOuts.ReadTotalTimeoutConstant = 100;
 
    ReadFile (HANDLE hPort,
              LPVOID lpBuffer,			//операция чтения, для порта
              DWORD nNumOfBytesToRead,
              LPDWORD lpNumOfBytesRead,
              LPOVERLAPPED lpOverlapped
         );
 
printf(???); Как отобразить вывод информации с порта??? 		//вывод данных на экран
 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ничего не понял. Вы программу для Windows пишете? А почему вопросы на форуме Ардуино задаёте?

rkit
Offline
Зарегистрирован: 23.11.2016

NAYGER пишет:

Примерно понял, как должна выглядеть структура кода,

Скопировать декларации это не понять. Нужно, хотя бы, язык знать, чтобы делать такие заявления.

NAYGER
Offline
Зарегистрирован: 15.03.2020

Потому-что считаю, что работу с COM портами и сигналами лучше знают специалисты с этого форума, т.к. им на мой взгляд приходится с этим часто сталкиваться.

NAYGER
Offline
Зарегистрирован: 15.03.2020

rkit пишет:

NAYGER пишет:

Примерно понял, как должна выглядеть структура кода,

Скопировать декларации это не понять. Нужно, хотя бы, язык знать, чтобы делать такие заявления.

Но структуру же отобразил примерно правильно?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

NAYGER пишет:

Но структуру же отобразил примерно правильно?

Для Windows - да.

 

NAYGER
Offline
Зарегистрирован: 15.03.2020

Немного поправил.

int Number_COM, Speed_COM;	//переменные для ввода номера и скорости порта
 
{

DCB dcb;
HANDLE hComPort;
char BufferRead[150];
OVERLAPPED Overlap;
DWORD NumBytesRead, NumBytesReadOk;
 
printf ("Vvedite nomer COM porta:",\n);
scanf (Number_COM);       //ввод номера COM порта
printf ("\n");
     hComPort = CreateFile (Number_COM, 		//эта строка всегда имеет один и тот же вид
                GENERIC_READ | GENERIC_WRITE, 
                NULL, 
                NULL, 
                OPEN_EXISTING, 
                FILE_FLAG_OVERLAPPED, 
                NULL
               );
 
    GetCommState (hComPort, &dcb); 			//эта функция задаёт стандартные параметры порта, возможно и не нужна???
                  
 
printf ("Vvedite skorost COM porta:",\n);
scanf (Speed_COM);      //ввод скорости порта
printf ("\n");
    dcb.BaudRate = Speed_COM;			//в DCB задаются основные параметры COM порта
    dcb.fBinary = TRUE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fNull = FALSE;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = FALSE;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = 1;
 
    SetCommState (hComPort,  &dcb); 		//конфигурация COM порта
                   
 
    CommTimeOuts.ReadIntervalTimeout= 10;		//cto задаётся время приёма и ожидания посылки
    CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
    CommTimeOuts.ReadTotalTimeoutConstant = 100;
 
    ReadFile (hComPort, BufferRead, NumBytesRead, NumBytesReadOk, &Overlap);	//операция чтения, для порта
 
printf("\n",Number_COM); 			//вывод данных на экран
 
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты дебил?  Это Ардуино форум, нахрена лепить сюда тексты виндовых программ, в которых всё равно нихрена не понимаешь? 

Ардуине эти красивые слова, оформленные в код совсем никак не помогут. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NAYGER пишет:

Немного поправил.

1.
В строках №№ 1, 11, 12, 26, 27, 49, 51 написан бред сивой кобылы
 
2.
Вы мой вопрос о том, что делает Windows программа на Ardunino форуме, игнорируете принципиально или беспринципно?
NAYGER
Offline
Зарегистрирован: 15.03.2020

DetSimen пишет:

ты дебил?  Это Ардуино форум, нахрена лепить сюда тексты виндовых программ, в которых всё равно нихрена не понимаешь? 

Ардуине эти красивые слова, оформленные в код совсем никак не помогут. 

Ну, от тебя такой ответ был ожидаем, даже на вопросы по теме в других темах грубишь, видимо с воспитанием туго было.
То что форум Arduino, прекрасно понимаю, почему создал тему тут, читай выше.
 
NAYGER
Offline
Зарегистрирован: 15.03.2020

ЕвгенийП пишет:

1.

В строках №№ 1, 11, 12, 26, 27, 49, 51 написан бред сивой кобылы
 
2.
Вы мой вопрос о том, что делает Windows программа на Ardunino форуме, игнорируете принципиально или беспринципно?

ЕвгенийП, на ваш вопрос я ответил выше.
49 строка взята из примера, с обучающей статьи: ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, &gOverlapped)
NAYGER
Offline
Зарегистрирован: 15.03.2020

Всего доброго, убейте или закройте тему.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NAYGER пишет:

49 строка взята из примера, с обучающей статьи: ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, &gOverlapped)

И что, в этом примере создавали структуру OVERLAPPED на стеке, никак не инициализировали и указатель на неё пихали функции ReadFile? Бред! Вариантов тут два:

1. Вы ничерта не поняли в примере и передрали эту строку оттуда без других необходимых вещей (что скорее всего)
2. Пример писал такой же грамотей, как Вы.

А по поводу того, что Вы мне ответили, видимо, Вы имеете в виду фразу

NAYGER пишет:

Потому-что считаю, что работу с COM портами и сигналами лучше знают специалисты с этого форума, т.к. им на мой взгляд приходится с этим часто сталкиваться.

Так? Я не воспринял это ответом. Но, если это ответ, то вынужден Вас разочаровать. Знать-то может и знают, но вдаваться в обучение Вас работе с Windows и стандартной библиотекой Си (а Вас нужно учить именно этому, Вы даже printf и ReadFile вызвать не можете) на данном форуме вряд ли кто будет. Но, думаю, что Вы это уже и так заметили.

NAYGER пишет:

убейте или закройте тему.

Вы правда считаете себя вправе отдавать здесь приказы?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

NAYGER пишет:

Потому-что считаю, что работу с COM портами и сигналами лучше знают специалисты с этого форума, т.к. им на мой взгляд приходится с этим часто сталкиваться.

Нет, со "специалистами с этого форума" иногда такое случается. Но я бы не сказал, что часто. IMHO с программированием под Винду гораздо чаще приходится сталкиваться тем, кто программирует под Винду (извините за банальность). А потому и спрашивать следует на профильном форуме.

Но лучше сначала у Гугла.

Кстати, можно заглянуть и в Вики.

А на данном форуме для взаимодействия между МК и ПК профильным считается использование Processing, чему посвящен соответствующий раздел.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

На, готовый   код http://arduino.ru/Reference/Serial/Read

там еще много чего интересного.

 

 

А для  windows   вот может помочь: http://com0com.sourceforge.net/

NAYGER
Offline
Зарегистрирован: 15.03.2020

yuhenotix@2p-mail.com пишет:

На, готовый   код http://arduino.ru/Reference/Serial/Read

там еще много чего интересного.

А для  windows   вот может помочь: http://com0com.sourceforge.net/

Спасибо, уже разобрался.