Работа с COM портом

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

kalobyte, DS-датчик в отличие от простого программатора, использует порт по прямому назначению, т. е. обмен данными на стандартных скоростях через линии TXD и RXD. Дополнительные линии порта не участвуют в обмене данными. Поэтому будет работать не только с "железным" портом, но и его эмуляторами, типа USB-UART.
Реклама
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

так у него же свой протокол, не юарт
там свои тайминги и формат битов
я что-то не видел, чтобы этот датчик висел на юарт выводах у мк, обычно берут любой вывод и таймер
тематические ответы только в форуме, в приват не пишите
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

kalobyte писал(а):так у него же свой протокол, не юарт
Это не значит что они не совместимы.
kalobyte писал(а):я что-то не видел, чтобы этот датчик висел на юарт выводах у мк
Смотрите. http://we.easyelectronics.ru/STM32/esch ... vleno.html
http://electronix.ru/forum/lofiversion/ ... 93588.html
http://bascomavr.3bb.ru/viewtopic.php?id=1129#p14623
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

Потом прочел небезызвестный аппнот от maxim Using a UART to Implement a 1-Wire Bus Master
ну вот, мне он не был известен :shock:
сейчас почитаем
тематические ответы только в форуме, в приват не пишите
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 213
Зарегистрирован: Ср дек 15, 2010 14:37:38

Сообщение gdoom »

Всем день добрый, за выходные стало проясняться с работой COM, решил начать собирать схему:
Изображение
конечно вместо 595 будут стоять светодиоды пока, что.... Потом поставлю 155тм2 буду её мучать :lol:

Нашёл под с++ код как дёргать за ноги com но можете пояснить немного код особенно по ногам - какие ноги дёргаем именно, куски кода отвечают за это.... Не получилось связаться с автором поста на форуме т.к посту 5 лет уже.

Код: Выделить всё

HANDLE hFile; // файл порта
DWORD ModemStat,bc;
DCB dcb;
COMMTIMEOUTS ct;
char         *buf_out="Test string";
char         *buf_in;
LPCTSTR      FileName="COM1";
 
dcb.DCBlength=sizeof(DCB);
    BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
    dcb.fNull=TRUE;
    
    ct.ReadTotalTimeoutConstant=2000; //чтение файла произаодиться не более 2с иначе завершение чтения
    ct.ReadIntervalTimeout=10;
    ct.ReadTotalTimeoutMultiplier=0;
    ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
 
   
 
 
    hFile = CreateFile(FileName,                    //открываем порт COM1
                        GENERIC_READ|GENERIC_WRITE, 
                        0, 
                        NULL, 
                        OPEN_EXISTING, 
                        0,
                        NULL);
 
    if(hFile==INVALID_HANDLE_VALUE)//Если не получилось
    {
        MessageBox("Не удалось открыть порт COM1!", "Ошыбка", MB_ICONERROR);\
            FileName="COM2";      
                hFile = CreateFile(FileName, 
                                    GENERIC_READ|GENERIC_WRITE, //Открываем порт COM2
                                    0, 
                                    NULL, 
                                    OPEN_EXISTING, 
                                    0,
                                    NULL);
 
                 if(hFile==INVALID_HANDLE_VALUE)
                    {
                         MessageBox("Не удалось открыть порт COM2!", "Ошыбка", MB_ICONERROR);
                    }
                    else
                     {
                         MessageBox("Порт COM2 успешно открыт", "Ok", MB_OK);  
                     }
    
    }
    else
    {
        MessageBox("Порт COM1 успешно открыт", "Ok", MB_OK);  
    }
    
    SetCommState(hFile,&dcb);
    SetCommTimeouts(hFile,&ct);
    PurgeComm(hFile,PURGE_TXCLEAR|PURGE_RXCLEAR);
    SetupComm(hFile,256,256);
 
 
void CTestComDlg::OnButton9() 
{
//записатьTD прочитатьRD 
 
buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1);
    WriteFile(hFile,buf_out,strlen(buf_out),&bc,NULL);
    if (ReadFile(hFile,buf_in,strlen(buf_out),&bc,NULL))
 
    
 
    {if (*buf_in==*buf_out)
    {
        MessageBox("Сигнал 1", "ОК", MB_OK);
    }
    else
    {
        MessageBox("Сигнал 0", "Ошыбка", MB_ICONERROR);  
    }
    }
    
 
    HeapFree(GetProcessHeap(),0,buf_in);
 
 
}
 
void CTestComDlg::OnButton5() 
{
    // read CD(1)
    GetCommModemStatus(hFile,&ModemStat);
    if ((ModemStat&&MS_RLSD_ON)!=0)
    {
        MessageBox("Сигнал 1", "ОК", MB_OK);
    }
    else
    {
        MessageBox("Сигнал 0", "Ошыбка", MB_ICONERROR);  
    }   
}
 
 
 
 
void CTestComDlg::OnButton7() 
{
    // read CTS(8)
    
    GetCommModemStatus(hFile,&ModemStat);
    if ((ModemStat && MS_CTS_ON)!=0)
    {
        MessageBox("Сигнал 1", "ОК", MB_OK);
    }
    else
    {
        MessageBox("Сигнал 0", "Ошыбка", MB_ICONERROR);  
    }
}
 
void CTestComDlg::OnButton6() 
{
    // read DSR(6)
    GetCommModemStatus(hFile,&ModemStat);
    if ((ModemStat && MS_DSR_ON)!=0)
    {
        MessageBox("Сигнал 1", "ОК", MB_OK);
    }
    else
    {
        MessageBox("Сигнал 0", "Ошыбка", MB_ICONERROR);  
    }
    
}
 
void CTestComDlg::OnButton8() 
{
    // read RI(9)
    GetCommModemStatus(hFile,&ModemStat);
    if ((ModemStat && MS_RING_ON)!=0)
    {
        MessageBox("Сигнал 1", "ОК", MB_OK);
    }
    else
    {
        MessageBox("Сигнал 0", "Ошыбка", MB_ICONERROR);  
    }
}
 
 
 
void CTestComDlg::OnButton10() 
{ 
//записать TD
    for (int i=0;i<100;i++)
    {
        WriteFile(hFile,buf_out,strlen(buf_out),&bc,NULL);
    }
    
}
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

gdoom писал(а):решил начать собирать схему
Это уже нестандартное использование порта. Может не работать с USB to UART.
gdoom писал(а):Нашёл под с++
Код точно для этой схемы?
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 213
Зарегистрирован: Ср дек 15, 2010 14:37:38

Сообщение gdoom »

Мурик писал(а):
gdoom писал(а):решил начать собирать схему
Это уже нестандартное использование порта. Может не работать с USB to UART.
- на это до лампочки, всё ровно на первых парах буду юзать плату COM - если не изменяет память драйвер com+lpt называется, на неё 2COM и 1-lpt порт....
gdoom писал(а):Нашёл под с++
Код точно для этой схемы?
нет код левый, но там как я понял опрос и подача сигнала на ножки com порта, то что и требуется - первое, что подача сигнала только - т.к для приёма передачи в дальнейшем буду юзать max232
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Есть у меня программа, которая передает данные подобным образом. Немного подправил ее (был некоторый не нужный в данной схеме функционал). Может пригодится.
Вложения
COM to 74HC595.zip
(46.92 КБ) 204 скачивания
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

gdoom писал(а):нет код левый, но там как я понял опрос и подача сигнала на ножки com порта
как раз таки нету там никакой подачи
никогда не бери левый код, если он привязан к железу и ты лично не запустил пример и пример отработал как надо
только тогда можно использовать куски для себя

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

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

поэтому там используются только 2 и 3 выводы
тематические ответы только в форуме, в приват не пишите
Прорезались зубы
Аватара пользователя
Сообщения: 213
Зарегистрирован: Ср дек 15, 2010 14:37:38

Сообщение gdoom »

Мурик писал(а):Есть у меня программа, которая передает данные подобным образом. Немного подправил ее (был некоторый не нужный в данной схеме функционал). Может пригодится.
спасибо покапаю :idea:

блин открыл - это на vb что ли писал? на с++ нету примера?
abc
Друг Кота
Аватара пользователя
Сообщения: 3688
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Сообщение abc »

У меня есть на паскале, писано в дельфи.
Но выкладывать не буду, ибо уже представляю этакий кисляк в ответ "чО ж не на С++" ?
Дружище, даташит в руки, алгоритм работы там примитивный. А дальше - хоть на брэйнфаке.
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Код на PureBasic. Там в конце исходника написано же (IDE добавляет в файл свою версию и некоторые настройки компиляции).
gdoom писал(а):на с++ нету примера
Ищите, или сами перепишите. Код не сложный.
Кстати почему нужно именно на C++? Для учебного заведения?
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

у меня на сцайте есть пример на сях для управления регистром 595
тебе надо только там вместо пинов контроллера поставить функции управления конкретными пинами типа дтр, которые на схеме обозначены

вот пример
http://stackoverflow.com/questions/1853 ... s-platform
http://www.codeproject.com/Articles/992 ... rary-for-C

без хорошей библиотеки чистый вин апи это ад и израиль :)))
тематические ответы только в форуме, в приват не пишите
Родился
Сообщения: 6
Зарегистрирован: Сб окт 10, 2015 18:26:37

Сообщение СВМ »

Мурик писал(а):
gdoom писал(а):я мог получать данные с кажем с датчика температуры
С какого? Например DS18B20?
Можете посмотреть журнал Радио №1 2015. Там есть статья о работе с подобными датчиками через COM порт (в т. ч. виртуальный). Компонент приложения используемый в статье. ftp://ftp.radio.ru/pub/2015/01/OWire.zip
Его можно подключить к проекту VS и использовать для чтения температуры. Преимущество в том что не нужно знать как работать с COM портом и датчиком. Все это берет на себя компонент. А если все же хочется разобраться как это работает, можно посмотреть исходник компонента - файл OWire_Module.pbi находящийся в папке Library\Src.
gdoom писал(а):USB пока сложновато...
Ну я бы так не сказал бы. Смотрите журнал Радио №4 2011. Там есть статья о работе с USB HID, а также компонент приложения, который сможете подключить к проекту VS C++.
Скачал по ссылке все три файла с расширениями .dll, .exp, .lib. Как установить библиотеку? Это и есть библиотека?
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Библиотеку устанавливать не нужно. Ее функции следует вызывать из своего приложения.
Файл dll это и есть библиотека функций.
Файл lib содержит в себе данные для статического импорта. Нужен для связывания приложения с dll.
Родился
Сообщения: 6
Зарегистрирован: Сб окт 10, 2015 18:26:37

Сообщение СВМ »

Картинка1.jpg
(92.12 КБ) 580 скачиваний
Мурик писал(а):Библиотеку устанавливать не нужно. Ее функции следует вызывать из своего приложения.
Файл dll это и есть библиотека функций.
Файл lib содержит в себе данные для статического импорта. Нужен для связывания приложения с dll.
Понял, спасибо! Где я ошибся?
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

В коде на скрине не указано откуда брать функции. :dont_know:
Но если предполагается писать на PB (как на скрине), то нет необходимости в dll. Можно использовать ее исходный код. :)

Код: Выделить всё

XIncludeFile "OWire_Module.pbi"
UseModule OWire

OW_OpenPort("COM1", 0)
Эти файлы в архиве во вложении.

Но если нужно использовать dll, то из архива (путь Еxamples\PureBasic\Windows\Src) нужно скопировать файл OWire_Module_dll.pbi и добавить эту строку в начало кода.

Код: Выделить всё

XIncludeFile "OWire_Module_dll.pbi"
Вложения
OWire_Test.rar
(5.86 КБ) 182 скачивания
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Иван Сусанин - первый полупроводник :solder:
Родился
Сообщения: 6
Зарегистрирован: Сб окт 10, 2015 18:26:37

Сообщение СВМ »

Мурик писал(а):В коде на скрине не указано откуда брать функции. :dont_know:
Но если предполагается писать на PB (как на скрине), то нет необходимости в dll. Можно использовать ее исходный код. :)

Код: Выделить всё

XIncludeFile "OWire_Module.pbi"
UseModule OWire

OW_OpenPort("COM1", 0)
Эти файлы в архиве во вложении.

Но если нужно использовать dll, то из архива (путь Еxamples\PureBasic\Windows\Src) нужно скопировать файл OWire_Module_dll.pbi и добавить эту строку в начало кода.

Код: Выделить всё

XIncludeFile "OWire_Module_dll.pbi"
Спасибо, буду разбираться.
Родился
Сообщения: 6
Зарегистрирован: Сб окт 10, 2015 18:26:37

Сообщение СВМ »

Мурик писал(а):В коде на скрине не указано откуда брать функции. :dont_know:
Но если предполагается писать на PB (как на скрине), то нет необходимости в dll. Можно использовать ее исходный код. :)

Код: Выделить всё

XIncludeFile "OWire_Module.pbi"
UseModule OWire

OW_OpenPort("COM1", 0)
Эти файлы в архиве во вложении.

Но если нужно использовать dll, то из архива (путь Еxamples\PureBasic\Windows\Src) нужно скопировать файл OWire_Module_dll.pbi и добавить эту строку в начало кода.

Код: Выделить всё

XIncludeFile "OWire_Module_dll.pbi"
А что значит нулевой указатель?
Вложения
Pointer_is_null.jpg
(102.14 КБ) 590 скачиваний
Ответить

Вернуться в «Интеграция с ПК»