|
|
  |
RS-485 С++ |
|
|
|
Jun 30 2016, 11:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Если работаете под WinXP в прямом доступе к портам нет необходимости. Тем более, что виндузный драйвер все это делает прекрасно - вопрос только в освоении его управлением и своей прикладной "навеске". Вырезка из утилиты которую я пользую (дежурный прием пакетов, отсечка пакетов - по таймаутам драйвера и/или по кол-ву принятых байт) Там поминаются функции Win32API. Дуплекс реализуется как выделение, например, приема в отдельный поток выполнения и сихнронизацией по семафору с управляющим потоком. Консольная main() Код HANDLE hport; DCB dcb1;
main() { . . . . hport = CreateFile( s_port, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if(hport == INVALID_HANDLE_VALUE) printf( "\nCOM_R hport WAS NOT OPEN !\n" ); . . . . // --- DCB init ---- dcb1.BaudRate= CBR_9600; dcb1.ByteSize=8; . . . . . . . . succ=SetCommState(hport,&dcb1); // ------------------------------ COMMTIMEOUTS CommTimeOutsW; GetCommTimeouts(hport, &CommTimeOutsW); . . . . CommTimeOutsW.ReadIntervalTimeout = t_RITT; CommTimeOutsW.ReadTotalTimeoutMultiplier = t_RTTM; CommTimeOutsW.ReadTotalTimeoutConstant = t_RTTC; // ---- SetCommTimeouts(hport, &CommTimeOutsW); succ=SetCommState(hport,&dcb1);
. . . .
PurgeComm(hport, PURGE_TXCLEAR | PURGE_RXCLEAR ); EscapeCommFunction(hport, SETRTS); EscapeCommFunction(hport, SETDTR);
. . . . . while( !kbhit() ) { real_read = 0x00; ReadFile(hport,&RxR_bf[0],50,&real_read,NULL); if(real_read > 0) {
} // if read > 0 else { printf("*"); } real_write = 0x00;
} // while
PurgeComm(hport, PURGE_TXCLEAR | PURGE_RXCLEAR ); CloseHandle(hport); return 0; }
|
|
|
|
|
Jul 1 2016, 08:10
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Когда я начинал пользовать C++Builder (кажись, в прошлом веке еще), коллеги порекомендовали не пользоваться втроенными средствами общения с сериальными портами, а пользоваться внешним пакетом- "Async Professional from TurboPower Software Company". Оно имеет очень много разных подпорок, делающих работу с портами простой- от простых отправлений-приемов до готовых терминалок, которые легко встроить в свою программу. Не разочаровался и использую до сих пор (у меня старинная версия 3.05). Винды меняются, а оно все работает и работает. Много воды утекло, этот Async Professional уже вроде давно фриварным стал. вот тут оно вроде бы теперь обитает, и, кажется, я на местном загашнике старую версию выкладывал, еще коммерческую. А, был вроде глюк с его винсокетом (это ApdWinsockPort надстройка компонента), когда витруальные сериал порты через интернет по его UDP прокидывал и с другой стороны стандартный модем с UDP портом висел- пришлось пакет Indy ставить для корректной работы с TCP/UDP. Но это другие компоненты пакета. Простой ApdComPort и все что через него - работает отлично. И да, в основном для RS-485 использую- железо и и с RTS сигналом, и с автоопределением направления передачи.
|
|
|
|
|
Jul 1 2016, 20:52
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Ruslan1 @ Jul 1 2016, 11:10)  Когда я начинал пользовать C++Builder (кажись, в прошлом веке еще). Аналогично дело было, но сейчас нет никакого смысла НАЧИНАТЬ работать с проприетарным софтом. Qt + boost::asio::serial_port - наше всё! Я это на полном серьёзе... Когда среда разработки (C++Builder 6) падает сама - это не среда разработки .
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 1 2016, 21:40
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(demiurg_spb @ Jul 1 2016, 23:52)  Аналогично дело было, но сейчас нет никакого смысла НАЧИНАТЬ работать с проприетарным софтом. Qt + boost::asio::serial_port - наше всё! Я это на полном серьёзе... Когда среда разработки (C++Builder 6) падает сама - это не среда разработки . Да, согласен. Единственное "Но": лично у меня ощущение, что старый софт был лучше (насчет что "небо было голубее и трава зеленее"- не скажу, а вот софт был лучше). Но надеюсь что это временное явление, ну не могут же вечно корявое писать после хорошего. Про 6-й билдер- я до сих пор на пятом билдере пишу (правильнее- пописываю, это дополнение к основной разработке- тесты и всякие мелкие поддержки). Не падал пятый билдер никогда, ни на 95-й винде давно, ни на семерке сейчас
|
|
|
|
|
Jul 2 2016, 03:44
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(go2winner @ Jun 29 2016, 16:55)  Имею доступ к портам ввода/вывода (думаю это плохой способ), поэтому пока о другом... Это самый лучший способ, но для wnd он драйверный. Цитата(go2winner @ Jun 29 2016, 16:55)  PS. Пока, что собираю материал и конкретных вопросов/ проблем не имею т.к. только с завтра начну. Кажется у klenа была потоко-событийная реализация компонента для ком. порта и, в отличие, от Async - на С++.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|