Помогите разобраться

Тема в разделе "C и С++ FAQ", создана пользователем TAnis, 19 ноя 2008.

Статус темы:
Закрыта.
  1. TAnis

    TAnis Гость

    доброго времени суток!

    :) прошу помоч со следующим вопросом

    Имееться датчик измерительный давления подключенный в преобразователю из RC232 в Rc485 ну соответсвенно от него в Сом

    как получить данные из регистра 0020h и 0021h? по докам запрос начтение выглядит
    запрос :
    1байт-Адрес устройства
    2байт -код команды 0х03
    3,4 байты старший и младший байты относительного адреса регистра с которого начинаеться чтение
    5,6 байты старший и младший байты количества считываемых 16 битных регистров (W)(не более 6)
    7,8 CRC

    ответ:
    1байт-Адрес устройства
    2байт -код команды 0х03
    3байт количество байтов ответа (2xW)
    4..N байты считываемых регистров (N=2xW+3)
    N+1 N+2 CRC

    :wall: обьясните чего не так и чего к чему плиз
    мой код->
    Код (Text):
      HANDLE hComm;
    DWORD bc;
    DCB dcb;

    int i;

    memset (&dcb, 0, sizeof (DCB));

    // dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));

    dcb.DCBlength = sizeof (DCB);
    dcb.BaudRate = CBR_9600;  //CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000
    dcb.fParity = TRUE;
    dcb.ByteSize = 8;
    dcb.Parity = ODDPARITY;
    dcb.StopBits = ONESTOPBIT;

    hComm = CreateFile( "COM3", //"172.17.0.250"
    GENERIC_WRITE|GENERIC_READ,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);
    if (hComm == INVALID_HANDLE_VALUE) {
    printf(" Can't open Com3 ");
    }
    else {

    printf(" Com3 is open! ");

    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    if(!SetCommState(hComm, &dcb))
    printf("SetCommState failed");

    char b[8];
    char s[8]={ '0x01',
    '0x03',
    '0x00',
    '0x20',
    '0x00',
    '0x04','0xc3',0x45 };
    DWORD iSize;
    WriteFile(hComm,s,strlen(s)+1,&iSize,0);


    char s1[8];
    ReadFile(hComm,b,9,&iSize,0);
    for (i=1;i<=8;i++)
    {
    itoa(b[i],s1,10);
    Edit1->Text=Edit1->Text+s1;

    }
    //   }

    Memo1->Lines->Add(Edit1->Text);
    WaitForSingleObject(hComm, INFINITE);

    }

    CloseHandle(hComm);
     
  2. Maxx

    Maxx Гость

    регистры 0х20 и 0х21 это часом не modbus протокол используется
    и сдается мне линии dtr и rts не используются (хотя это может зависеть от контроллера или прибора)

    вот эта строка кода
    WaitForSingleObject(hComm, INFINITE);
    смысл ее
    что мы ждем (сдается мне здесь программа должна повиснуть)

    есть куча книжек по программированию последовательных портов
    например Агуров П.В. - Последовательные Интерфейсы ПК. Практика Программирования (хотя там на object pascal, но подход одинаков)
    млм Jan Axelson - Serial Port Complete (тама на vb и тоже подход одинаков)

    а лучше почитать книжку (статью) про программирование последовательных портов под dos (типа rs232 programming в google.com и т.д)
    и тогда (если основы будут поняты) основная масса вопросов исчезнет
     
  3. Yason

    Yason Гость

    TAnis,
    1. В чём конкретно проблема? Какой этап не работает/работает не так?

    2. Кавычки — лишние.
    Код (Text):
         char s[8]={ '0x01',
    '0x03',
    '0x00',
    '0x20',
    '0x00',
    '0x04','0xc3',0x45 };
    3.
    Код (Text):
    WriteFile(hComm,s,strlen(s)+1,&iSize,0);
    Вместо strlen(s) нужно использовать sizeof(s) (без +1).

    4.
    Код (Text):
    ReadFile(hComm,b,9,&iSize,0);
    На каком основании Вы читаете 9 байт в 8-байтовый буфер? Опять же, используйте sizeof().

    5. Да и вообще, почему Вы решили что в ответе будет 9 байт? Вы запросили чтение четырёх 16-битовых регистров, это уже 8 байт, плюс адрес устройства, плюс команда, плюс размер ответа, плюс два байта CRC — получается уже 13 байт.

    6. Байты ответа лучше всё же разделять, а то получите одно длинное число. Причём учтите, что в Си массивы индексируются с нуля, а не единицы.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей