Работа с COM портом
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
kalobyte, DS-датчик в отличие от простого программатора, использует порт по прямому назначению, т. е. обмен данными на стандартных скоростях через линии TXD и RXD. Дополнительные линии порта не участвуют в обмене данными. Поэтому будет работать не только с "железным" портом, но и его эмуляторами, типа USB-UART.
- Реклама
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
так у него же свой протокол, не юарт
там свои тайминги и формат битов
я что-то не видел, чтобы этот датчик висел на юарт выводах у мк, обычно берут любой вывод и таймер
там свои тайминги и формат битов
я что-то не видел, чтобы этот датчик висел на юарт выводах у мк, обычно берут любой вывод и таймер
тематические ответы только в форуме, в приват не пишите
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Это не значит что они не совместимы.kalobyte писал(а):так у него же свой протокол, не юарт
Смотрите. http://we.easyelectronics.ru/STM32/esch ... vleno.htmlkalobyte писал(а):я что-то не видел, чтобы этот датчик висел на юарт выводах у мк
http://electronix.ru/forum/lofiversion/ ... 93588.html
http://bascomavr.3bb.ru/viewtopic.php?id=1129#p14623
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
ну вот, мне он не был известенПотом прочел небезызвестный аппнот от maxim Using a UART to Implement a 1-Wire Bus Master
сейчас почитаем
тематические ответы только в форуме, в приват не пишите
- Сообщения: 213
- Зарегистрирован: Ср дек 15, 2010 14:37:38
Всем день добрый, за выходные стало проясняться с работой COM, решил начать собирать схему:

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

конечно вместо 595 будут стоять светодиоды пока, что.... Потом поставлю 155тм2 буду её мучать
Нашёл под с++ код как дёргать за ноги 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
Это уже нестандартное использование порта. Может не работать с USB to UART.gdoom писал(а):решил начать собирать схему
Код точно для этой схемы?gdoom писал(а):Нашёл под с++
- Сообщения: 213
- Зарегистрирован: Ср дек 15, 2010 14:37:38
нет код левый, но там как я понял опрос и подача сигнала на ножки com порта, то что и требуется - первое, что подача сигнала только - т.к для приёма передачи в дальнейшем буду юзать max232Мурик писал(а):Это уже нестандартное использование порта. Может не работать с USB to UART.gdoom писал(а):решил начать собирать схему
- на это до лампочки, всё ровно на первых парах буду юзать плату COM - если не изменяет память драйвер com+lpt называется, на неё 2COM и 1-lpt порт....Код точно для этой схемы?gdoom писал(а):Нашёл под с++
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Есть у меня программа, которая передает данные подобным образом. Немного подправил ее (был некоторый не нужный в данной схеме функционал). Может пригодится.
- Вложения
-
- COM to 74HC595.zip
- (46.92 КБ) 204 скачивания
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
как раз таки нету там никакой подачиgdoom писал(а):нет код левый, но там как я понял опрос и подача сигнала на ножки com порта
никогда не бери левый код, если он привязан к железу и ты лично не запустил пример и пример отработал как надо
только тогда можно использовать куски для себя
то что ты делаеш - нестандартное использование порта, от которого я и предупреждал тебя
этот режим называется bit bang или манипуляция выводами, когда реализуется какой-то последовательный синхронный протокол через жопу
жопа тут в том, что тайминги не выдерживаются, т.к. виндовс не является системой реального времени
особенно это будет заметно при получении данных извне
если зажесь светодиоды в регистре - гавно вопрос, то получить поток байт уже будет куда сложнее
поэтому ком порт используется как аппаратный модуль, в нем уже заложен протокол передачи и синхронизации, а так же учета ошибок и все это на железном уровне
тебе надо просто тупо читать или писать в порт, а модуль юарт сам сгенерирует нужные сигналы и передаст в юарт порт на стороне контроллера
поэтому там используются только 2 и 3 выводы
тематические ответы только в форуме, в приват не пишите
- Сообщения: 213
- Зарегистрирован: Ср дек 15, 2010 14:37:38
спасибо покапаюМурик писал(а):Есть у меня программа, которая передает данные подобным образом. Немного подправил ее (был некоторый не нужный в данной схеме функционал). Может пригодится.
блин открыл - это на vb что ли писал? на с++ нету примера?
У меня есть на паскале, писано в дельфи.
Но выкладывать не буду, ибо уже представляю этакий кисляк в ответ "чО ж не на С++" ?
Дружище, даташит в руки, алгоритм работы там примитивный. А дальше - хоть на брэйнфаке.
Но выкладывать не буду, ибо уже представляю этакий кисляк в ответ "чО ж не на С++" ?
Дружище, даташит в руки, алгоритм работы там примитивный. А дальше - хоть на брэйнфаке.
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Код на PureBasic. Там в конце исходника написано же (IDE добавляет в файл свою версию и некоторые настройки компиляции).
Кстати почему нужно именно на C++? Для учебного заведения?
Ищите, или сами перепишите. Код не сложный.gdoom писал(а):на с++ нету примера
Кстати почему нужно именно на C++? Для учебного заведения?
- Сообщения: 13796
- Зарегистрирован: Чт сен 20, 2007 14:08:00
у меня на сцайте есть пример на сях для управления регистром 595
тебе надо только там вместо пинов контроллера поставить функции управления конкретными пинами типа дтр, которые на схеме обозначены
вот пример
http://stackoverflow.com/questions/1853 ... s-platform
http://www.codeproject.com/Articles/992 ... rary-for-C
без хорошей библиотеки чистый вин апи это ад и израиль
тебе надо только там вместо пинов контроллера поставить функции управления конкретными пинами типа дтр, которые на схеме обозначены
вот пример
http://stackoverflow.com/questions/1853 ... s-platform
http://www.codeproject.com/Articles/992 ... rary-for-C
без хорошей библиотеки чистый вин апи это ад и израиль
тематические ответы только в форуме, в приват не пишите
- Сообщения: 6
- Зарегистрирован: Сб окт 10, 2015 18:26:37
Скачал по ссылке все три файла с расширениями .dll, .exp, .lib. Как установить библиотеку? Это и есть библиотека?Мурик писал(а):С какого? Например DS18B20?gdoom писал(а):я мог получать данные с кажем с датчика температуры
Можете посмотреть журнал Радио №1 2015. Там есть статья о работе с подобными датчиками через COM порт (в т. ч. виртуальный). Компонент приложения используемый в статье. ftp://ftp.radio.ru/pub/2015/01/OWire.zip
Его можно подключить к проекту VS и использовать для чтения температуры. Преимущество в том что не нужно знать как работать с COM портом и датчиком. Все это берет на себя компонент. А если все же хочется разобраться как это работает, можно посмотреть исходник компонента - файл OWire_Module.pbi находящийся в папке Library\Src.
Ну я бы так не сказал бы. Смотрите журнал Радио №4 2011. Там есть статья о работе с USB HID, а также компонент приложения, который сможете подключить к проекту VS C++.gdoom писал(а):USB пока сложновато...
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Библиотеку устанавливать не нужно. Ее функции следует вызывать из своего приложения.
Файл dll это и есть библиотека функций.
Файл lib содержит в себе данные для статического импорта. Нужен для связывания приложения с dll.
Файл dll это и есть библиотека функций.
Файл lib содержит в себе данные для статического импорта. Нужен для связывания приложения с dll.
- Сообщения: 6
- Зарегистрирован: Сб окт 10, 2015 18:26:37
Понял, спасибо! Где я ошибся?Мурик писал(а):Библиотеку устанавливать не нужно. Ее функции следует вызывать из своего приложения.
Файл dll это и есть библиотека функций.
Файл lib содержит в себе данные для статического импорта. Нужен для связывания приложения с dll.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
В коде на скрине не указано откуда брать функции.
Но если предполагается писать на PB (как на скрине), то нет необходимости в dll. Можно использовать ее исходный код.
Эти файлы в архиве во вложении.
Но если нужно использовать dll, то из архива (путь Еxamples\PureBasic\Windows\Src) нужно скопировать файл OWire_Module_dll.pbi и добавить эту строку в начало кода.
Но если предполагается писать на 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 скачивания
Иван Сусанин - первый полупроводник 
- Сообщения: 6
- Зарегистрирован: Сб окт 10, 2015 18:26:37
Спасибо, буду разбираться.Мурик писал(а):В коде на скрине не указано откуда брать функции.![]()
Но если предполагается писать на 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
А что значит нулевой указатель?Мурик писал(а):В коде на скрине не указано откуда брать функции.![]()
Но если предполагается писать на 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 скачиваний


