[C++]Подключение прибора к компу. Вопрос по программированию.

Yyuri73

Имеется прибор, подключающийся к компу по ЮСБ. После установки родного программного обеспечения, винда его увидела и он работает нормально. Но родное ПО не устраивает, и необходимо написать собственное. В инструкции приведен пример программы на VS C++
 // devquery.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//standard include for a Microsoft Visual C++ project
157
#include "stdio.h"
//need for COM
#include "windows.h"
#include "comdef.h"
//This is the 'Automation' object (COM class). It contains the
// IIOManger interface
//below
const CLSID CLSID_INS001IOUtils =
{0x0D955199,0x6CB9,0x441C,{0xBA,0xA7,0x4A,0xC4,0xB9,0x8C,0x3C,0x47}};
//The IIO allows the opening of a device using its address in the
// 'ConnectToInstrument' function. The IO class above exports this
// COM interface.
//The IIO function 'ConnectToInstrument' will return the IIO interface
//this is an instance of the instrument.
const IID IID_IOUtils=
{03327DF2,0xB390,0x4888,{0x8D,0x89,0xB8,0x1D,0xBD,0x8A,0x9D,0x7F}};
//The following are the definitions needed to program the instrument.
//They can be placed in a header file for but are shown here to allow
// ease of perusal
/*********************************************************/
//This definition is to complete the IIO interface below. You needn't use
// this interface directly to communicate with instruments
extern "C" {
interface IIOUtils : IDispatch {
STDMETHOD (Countshort *pVal);
STDMETHOD (TimeOutshort *pVal);
STDMETHOD (TimeOutshort newVal);
STDMETHOD (Openvoid);
STDMETHOD (Closevoid);
STDMETHOD (Refreshvoid);
STDMETHOD (Indexshort newVal);
STDMETHOD (Indexshort &nNewValue);
STDMETHOD (OutputBSTR newVal);
STDMETHOD (InputBSTR *pVal);
158
STDMETHOD (AddressBSTR *pVal);
STDMETHOD (QueryBSTR newValue, BSTR *pVal);
STDMETHOD (Get_ErrFlaglong *pVal);
STDMETHOD (ConnectBSTR newVal);
};
}//extern "C"
int main(int argc, char* argv[])
{
IIOUtils *IIO; //The IO we'll be using to get to the instrument
HRESULT hr; //check return values for failure
_variant_t myCmd;
BSTR bstr;
int dev_idx=0;
short timeout=10000;
short count;
printf("\n ###### Start C++ Example program. ######\n");
printf(" We check the M3500A multimeter on USB port and\n");
printf(" identify the first connected M3500A device.\n\n");
//Initialize COM
CoInitialize(NULL);
//Create the INS001 IOUtils component
hr =
CoCreateInstance(CLSID_INS001IOUtils,NULL,CLSCTX_INPROC_SERVER,
IID_IOUtilsLPVOID *)&IIO);
if FAILED(hr)
{
printf("CoCreateInstance failed\n");
return 0;
}
IIO->Refresh;
IIO->Count(&count);
if ( count == 0 )
{
printf("\n M3500A USB connect failed (USB).\n");
return 0;
}
// Assigned the first M3500A device (USB port) for command test
IIO->Index(dev_idx);
IIO->TimeOut(&timeout);
// Write command "*IDN?" and read the M3500A identification string
myCmd = "*IDN?";
IIO->Output(_bstr_t(myCmd;
IIO->Input(&bstr);
printf(" output : *IDN?\n");
printf(" input : %s\n\n"char *)_bstr_t(bstr;
myCmd = "SAMP:COUN 1";
IIO->Output(_bstr_t(myCmd;
// Fetch the M3500A measure value ( screen value )
// Set Voltage AC measure
myCmd = "CONF:VOLT:AC 1,0.001";
IIO->Output(_bstr_t(myCmd;
myCmd = "READ?";
IIO->Output(_bstr_t(myCmd;
IIO->Input(&bstr);
printf(" output : READ?\n");
printf(" input : %s\n\n"char *)_bstr_t(bstr;
// Set Voltage DC measure
myCmd = "CONF:VOLT:DC 10,0.1";
IIO->Output(_bstr_t(myCmd;
myCmd = "READ?";
IIO->Output(_bstr_t(myCmd;
IIO->Input(&bstr);
printf(" output : READ?\n");
printf(" input : %s\n\n"char *)_bstr_t(bstr;
IIO->Close;
IIO->Release;
//Uninit so COM is exited clean.
CoUninitialize;
return 0;
}

Эта программа работает. Изменение приведенных в программе команд, например, "CONFDC" на другие, тоже дает результат, программа с ними работает нормально.
НО! наши программисты пишут на Borland C, и говорят, что не могут разобраться в этой проге. Им необходимы команды, которые посылаются на порт или библиотечка с этими командами, которую они смогут включить в свой проект.
Вопрос: содержится ли в тексте программы данные команды? Возможно ли из них сделать библиотечку? возможно ли их переписать на Borland C?
И самое главное, Как все это сделать?
Или хотя бы объясните, какой кусок программы отвечает за коммуникацию, и что делает каждая функция?

Dasar

> И самое главное, Как все это сделать?
уволить на хрен таких программистов.
или хотя бы заставить их заботать COM
> Возможно ли из них сделать библиотечку?
данный пример как раз показывает - использование поставляемой библиотечки для прибора
ps
у меня есть сильное подозрение, что если иметь прямые руки, то этот код без особых изменений соберется на borland c (если, конечно, эти "программисты" не bc 3.11 используют)

tamusyav

1. Вашим программистам нужно сделать втык. Пусть изучат хотя бы синтаксис C++. Этого вполне достаточно, чтобы разобраться в работе программы.
2. Если они думают, что с USB-портом можно обращаться также, как и с COM-портом, то они глубоко заблуждаются. Если они не могут разобраться в программе в несколько десятков строк, то сомневаюсь, что им удастся освоить описание USB в несколько сотен страниц.
3. В этой программе нет команд, которые посылаются в порт, этим занимается система. В программе есть команды, которые посылаются устройству (содержатся почти во всех инструкциях, вызывающих методы интерфейса IIO).
4. Программа хорошо написана и откомментирована. Непонятным в этой программе мне осталось лишь назначение методов Address, Query, Get_ErrFlag и Connect (использование которых в ней не продемонстрировано а также строки
short timeout=10000;
//...
IIO->TimeOut(&timeout);
Мне казалось, что здесь должна была быть установка таймаута, а не его чтение (иначе тогда зачем нужно начальное значение для переменной?). Возможно, здесь опечатка.

Codcod

Всё рекомендации уже дали.

Codcod

Слава Роботам!
Оставить комментарий
Имя или ник:
Комментарий: