История изменений
Исправление 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
Исходная версия vsrmis, :
Пока разбираю протокол, потом буду думать о мастерах и слейвах.
vertexua
trex6
Сейчас сижу с отладчиком
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