LINUX.ORG.RU

История изменений

Исправление vsrmis, (текущая версия) :

Пока разбираю протокол, потом буду думать о мастерах и слейвах.
vertexuaК сожалению нужно именно modbus и именно С.
trex6 В некстовый нельхя :-( Именно из-за прогнозируемой скорости. Нужно бинарный. Sorcerer А #include <inttypes.h> входит в си стандарт? Я смогу его использовать например на армах?
Сейчас сижу с отладчиком

21	int main()
22	{
23	 
24	   char buf []= {0x05,0x00,'a','b','c','d','e',0x00,0x02,0x01};
25	   foo(buf);
(gdb) print buf
$1 = "\005\000abcde\000\002\001"

Я создал массив и отправил его функцию

int foo(void * data)
{
  std::cout<<(char*)(data+2)<<std::endl;
  P* a = (P*)calloc(1,sizeof(P));
  a->size = *(uint16_t*)data;
  a->data = (char*)calloc(a->size,sizeof(char));
  a->control = *(uint16_t*)(data+2+a->size);
  memcpy(data+2, a->data, a->size);
  std::cout<<a->size<<std::endl;
  std::cout<<a->data<<std::endl; 
  std::cout<<a->control<<std::endl;
}
__________________________________
[alex@archalex MODBUS]$ g++ ./first.cpp -g
./first.cpp: В функции «int foo(void*)»:
./first.cpp:17:27: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   std::cout<<(char*)(data+2)<<std::endl;
                           ^
./first.cpp:21:34: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   a->control = *(uint16_t*)(data+2+a->size);
                                  ^
./first.cpp:21:39: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   a->control = *(uint16_t*)(data+2+a->size);
                                       ^
./first.cpp:22:15: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   memcpy(data+2, a->data, a->size);
               ^
[alex@archalex MODBUS]$ ./a.out 
abcde
5

512
Во первых - предупреждение, что void* смещается,я понимаю, что ему тяжело понять на сколько ему смещать,но как это сделать явно? Потом, я всё делаю правильно, читая в control со смещением, и копируя память из data со смещением? И если да, то почему сначала, он умпешно выводит abcd ( до копирования), а потом не выводит ничего?

Исходная версия vsrmis, :

Пока разбираю протокол, потом буду думать о мастерах и слейвах.

vertexua
К сожалению нужно именно modbus и именно С.
trex6
В некстовый нельхя :-( Именно из-за прогнозируемой скорости. Нужно бинарный. Sorcerer А #include <inttypes.h> входит в си стандарт? Я смогу его использовать например на армах?
Сейчас сижу с отладчиком
21	int main()
22	{
23	 
24	   char buf []= {0x05,0x00,'a','b','c','d','e',0x00,0x02,0x01};
25	   foo(buf);
(gdb) print buf
$1 = "\005\000abcde\000\002\001"

Я создал массив и отправил его функцию

int foo(void * data)
{
  std::cout<<(char*)(data+2)<<std::endl;
  P* a = (P*)calloc(1,sizeof(P));
  a->size = *(uint16_t*)data;
  a->data = (char*)calloc(a->size,sizeof(char));
  a->control = *(uint16_t*)(data+2+a->size);
  memcpy(data+2, a->data, a->size);
  std::cout<<a->size<<std::endl;
  std::cout<<a->data<<std::endl; 
  std::cout<<a->control<<std::endl;
}
__________________________________
[alex@archalex MODBUS]$ g++ ./first.cpp -g
./first.cpp: В функции «int foo(void*)»:
./first.cpp:17:27: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   std::cout<<(char*)(data+2)<<std::endl;
                           ^
./first.cpp:21:34: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   a->control = *(uint16_t*)(data+2+a->size);
                                  ^
./first.cpp:21:39: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   a->control = *(uint16_t*)(data+2+a->size);
                                       ^
./first.cpp:22:15: предупреждение: в арифметическом выражении использован указатель «VOID *» [-Wpointer-arith]
   memcpy(data+2, a->data, a->size);
               ^
[alex@archalex MODBUS]$ ./a.out 
abcde
5

512
Во первых - предупреждение, что void* смещается,я понимаю, что ему тяжело понять на сколько ему смещать,но как это сделать явно? Потом, я всё делаю правильно, читая в control со смещением, и копируя память из data со смещением? И если да, то почему сначала, он умпешно выводит abcd ( до копирования), а потом не выводит ничего?