Форум — Ответы     (  К темам )
 ?  Igos: Работа с СОМ портами под Win XP (26-03-2003 09:19:31)
Есть проблемы в получении данных с СОМ-порта под XP, при занятом порте прога выдает Shared violation. Кто может поможите.
 Георгий (26-03-2003 09:31:33)
1 если ты работаешь через порт с какой либо железкой, то кто её может, кроме тебя, занять?
2 если порт всё же кто-то занял, то может не надо ему мешать, перемешивая его пакеты со своими?
3 если очень хочется то установи флаг разделяемого использования порта при открытии...
 NIKE (26-03-2003 14:55:24)
Хорошо, а как вообще с КОМ-порта считать/записать ?
 Георгий (26-03-2003 19:28:34)
NIKE
Эээ ходят слухи, что тот, кто ищет может (всегда) что-то найти...
 Владимир (26-03-2003 20:20:33)
Работаем с портом, как с файлом
Открываем его и читаем или пишем.
HANDLE h;
h = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (h == INVALID_HANDLE_VALUE) { ShowMessage("Порт не найден"); return; }

DWORD d;
ClearCommError(h, &d, NULL);
ClearCommBreak(h);

и дальше читаем, пишем в этот порт, например:

char Buff[200];
DWORD cd;
....
WriteFile(h, Buff, 18, &cd, NULL);
ReadFile(h, Buff, 2, &cd, NULL);
...
 Igos (27-03-2003 09:13:46)
Re Георгий : Проблема заключается в том, что под 95,98,2000 все работает : прога проверяет готовность у-ва к скидыванию, если видит что на порте висит у-во то готовит порт и принимает данные. Под ХР — до тех пор пока не подключаешь к порту у-во — все работает, дальше — "шаред ..."

Re Владимир : Все дело в том, что примерно так у меня все и сделано, и тем не менее. Говорят что ХР не дает напрямую к портам обращатся и якобы надо через какие то спецательные драйвера.
 Георгий (27-03-2003 12:48:46)
как я понимаю постановку задачи (с точностью до подробностей):
1. есть датчик (железка, которая по RS 232 или какому нибудь другому протоколу тупо формирует пакеты)
2. есть компьютер к которому железку то подключат, то отключат
3. нужна прога, которая данные датчика до оператора доносит

сразу возникают вопросы:
1. какой протокол управления потоком (программный (XON / XOFF), аппаратный (RTS / CTS) или никакой (т.е. либо самодельный либо игнор. переполнений и т.п.))
2. выполняется ли корректная работа с портом:
CreateFile
BuildCommDCB
SetCommState
SetCommTimeouts
...
чтение / запись
...
CloseHandle

Кстати специально проверил работу своей программы и эмулятора устройства:
1. есть промышленный контроллер (RS 232c + отсутствие управления потоком + принцип запрос — ответ), но не у меня — я использую программу — эмулятор (2 COM порта одного компьютера соединяю zero-modem кабелем, с одним портом работает эмулятор контроллера (написанный тоже мною), а с другим основная программа)
2. вне зависомости от порядка присоединения / отсоединения программ / шнурков к портам работает всё под всей линейкой win9x и 2000 / XP (специально только что проверил)

Кстати2 : возможно срабатывает PnP и XP начинает искать новые железки на порту и, возможно, находит (но это ты уже должен сам ответить — я где то у себя видел описание PnP для COM портов, но не могу найти)
 AndreyAGSoft (27-03-2003 15:34:39)
1. Используй WinIO -всё работает под всеми виндами.
2. Используй компоненты . Например CommPort от WinSoft http://www.winsoft.sk
 Igos (27-03-2003 18:03:49)
To Георгий: У у-ва есть буфер событий при подсоединении к компу оно начинает тупо туда все скидывать но это не суть важно. никаких PnP по идее и быть не должно. Чем ХР по этой идее от 2000 отличается я вообще пока уловить не могу. Если у тебя написана прога одинаково работающая и под ХР и под 98 то только скажи, я попробую все ломом вставить и пусть работает.
То AndreyAGSoft: за WinIO Thanks! буду пробовать. если работал подскажи, не тормозится ли работа приложения, мне актуально realtime (по крайней мере почти)
 Igos (27-03-2003 18:09:42)
То Георгий: как ты открываешь и закрываешь порт, возможно у меня не корректно проходит инициализация порта, во всяком случае под 2000 у меня сначала именно с инициализацией были проблемы.
 Igos (27-03-2003 18:14:41)
То Allem: Еще вопрос — на старых branda'х не мог привязать прогу к железу, то ли у них VolSerNum не как у людей, то CryptoApi ключей не возвращает. Пришлось вертаться к старому доброму XOR'у, это так только у меня непутевого или все-таки были прецеденты.
 Igos (27-03-2003 18:16:16)
То Георгий: как ты открываешь и закрываешь порт, возможно у меня не корректно проходит инициализация порта, во всяком случае под 2000 у меня сначала именно с инициализацией были проблемы.
 Igos (27-03-2003 18:16:26)
To Георгий: У у-ва есть буфер событий при подсоединении к компу оно начинает тупо туда все скидывать но это не суть важно. никаких PnP по идее и быть не должно. Чем ХР по этой идее от 2000 отличается я вообще пока уловить не могу. Если у тебя написана прога одинаково работающая и под ХР и под 98 то только скажи, я попробую все ломом вставить и пусть работает.
То AndreyAGSoft: за WinIO Thanks! буду пробовать. если работал подскажи, не тормозится ли работа приложения, мне актуально realtime (по крайней мере почти)
 Георгий (28-03-2003 00:12:50)
изрезанный кусок кода отвечающий за инициализацию:

_COMMTIMEOUTS ctmo;
DCB dcb;
COMMCONFIG cc;
cc.dwSize=sizeof (COMMCONFIG);
cc.wVersion=1;
cc.dwProviderSubType=PST_RS232;
cc.dwProviderOffset=0;
cc.dwProviderSize=0;

//ïî íåïîíÿòíûì ïðè÷èíàì ôóíêöèÿ BuildCommDCB íå çàïîëíÿåò ÂÑÅ ïîëÿ
//ñòðóêòóðû îïèñàíèÿ êîíòåêñòà óñòðîéñòâà òàê ÷òî çàïîëíÿåì èõ
//ñâîèìè ðóêàìè (êîïèÿ òîãî, ÷òî óñòàíàâëèâàåò CommConfigDialog)
dcb.DCBlength=28;

dcb.BaudRate=38400;
dcb.fBinary=1;
dcb.fParity=1;
dcb.fOutxCtsFlow=0;
dcb.fOutxDsrFlow=0;
dcb.fDtrControl=1;
dcb.fDsrSensitivity=0;
dcb.fTXContinueOnXoff=0;
dcb.fOutX=0;
dcb.fInX=0;
dcb.fErrorChar=0;
dcb.fNull=0;
dcb.fRtsControl=0;
dcb.fAbortOnError=0;
//dcb.wReserved;//ýòî ïîëå ïî íåïîíÿòíûì ïðè÷èíàì íå íàõîäèò êîìïèëÿòîð
*(&dcb.BaudRate+2)=0;//ïðèõîäèòñÿ îáíóëÿòü òàêèì îáðàçîì
dcb.XonLim=2048;
dcb.XoffLim=512;
dcb.ByteSize=8;
dcb.Parity=0;

dcb.StopBits=2;
dcb.XonChar=17;
dcb.XoffChar=19;
dcb.ErrorChar=0;
dcb.EofChar=0;
dcb.EvtChar=0;

if (hCom!=INVALID_HANDLE_VALUE) CloseHandle(this->hCom);
this->hCom=CreateFile(
ComName.c_str(),
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);

if (!BuildCommDCB(CfgString.c_str(),&dcb))
ShowLastError();

if (!SetCommState(this->hCom,&dcb))
ShowLastError();

ctmo.ReadIntervalTimeout=0;
ctmo.ReadTotalTimeoutMultiplier=0;
ctmo.ReadTotalTimeoutConstant=d->GetInputTimeOut();
ctmo.WriteTotalTimeoutMultiplier=0;
ctmo.WriteTotalTimeoutConstant=d->GetOutputTimeOut();
SetCommTimeouts(hCom,&ctmo);

запись чтение:

PurgeComm(this->hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(hCom,this->OutPutBuffer,4+size+2,&nBytes,NULL);
ReadFile(hCom,this->InPutBuffer,4+size+2,&nBytes,NULL);

закрытие:

CloseHandle(hCom)

Можешь создать ветку и рассказать о привязке ПО к машине?
 Георгий (28-03-2003 00:13:34)
опять муть вместо комментариев — что делать?
 Igos (28-03-2003 09:14:12)
То Георгий: За кусок спасибо, буду мучится. Если интересно насчет привязки могу на мыло, или все таки выдвигать тему?
 Георгий (28-03-2003 09:54:24)
Я думаю привязка многим может пригодится — делай тему, а потом Владимир разберётся, что с ней делать (в смысле FAQ или ещё что-нибудь).