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

  • Автор темы TAnis
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

TAnis

Гость
#1
доброго времени суток!

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

Имееться датчик измерительный давления подключенный в преобразователю из 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: обьясните чего не так и чего к чему плиз
мой код->
Код:
  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);
 
M

Maxx

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

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

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

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

Yason

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

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

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

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

6. Байты ответа лучше всё же разделять, а то получите одно длинное число. Причём учтите, что в Си массивы индексируются с нуля, а не единицы.
for (i=1;i<=8;i++)
{
itoa(b,s1,10);
Edit1->Text=Edit1->Text+s1+" ";
}
 
Статус
Закрыто для дальнейших ответов.