История изменений
Исправление ziemin, (текущая версия) :
Я обычно делаю так
// MOCK потока ввода
char buf []= {0x02,0x03,0x00,0x00,0x00,0x03};
int bufc = 0;
char getByte() {
return buf[bufc++];
}
char getWord() {
return getByte()*256+getByte();
}
// MOCK потока вывода
char obuf []= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
int obufc = 0;
void putByte(char b) {
return obuf[obufc++];
}
void putWord(uint b) {
putByte(b >> 8);
putByte(b & 0xFF);
}
int main() {
// Разбираем модбас
// Наши регистры
int regs[] = {123, 234, 345, 456};
// Наш адрес
char addr = 2;
// *** Понеслась ***
// Проверяем адрес
if(getByte() == addr) {
//Проверяем функцию. Будем работать только с 3
if (getByte() == 3) {
uint regAddr = getWord();
// Допустим у нас 5 регистров
if (regAddr < 5) {
uint regCount = getWord();
if (regCount + regAddr < 5) {
// Формируем ответ
putByte(addr);
putByte(3);
putByte(regCount*2);
for(int i = regAddr; i < regCount + regAddr; i++) {
putWord(regs[i]);
}
} else {/* Формируем исключение */}
} else {/* Формируем исключение */}
} else {/* Формируем исключение */}
} // ничего не делаем - запрос не нам
}
Нафига тебе структуры для модбаса?
Исправление ziemin, :
Я обычно делаю так
// MOCK потока ввода
char buf []= {0x02,0x03,0x00,0x00,0x00,0x03};
int bufc = 0;
char getByte() {
return buf[bufc++];
}
char getWord() {
return getByte()*256+getByte();
}
// MOCK потока вывода
char obuf []= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
int obufc = 0;
void putByte(char b) {
return obuf[obufc++];
}
void putWord(uint b) {
putByte(b >> 8);
putByte(b & 0xFF);
}
int main() {
// Разбираем модбас
// Наши регистры
int regs[] = {123, 234, 345, 456};
// Наш адрес
char addr = 2;
// *** Понеслась ***
// Проверяем адрес
if(getByte() == addr) {
//Проверяем функцию. Будем работать только с 3
if (getByte() == 3) {
uint regAddr = getWord();
// Допустим у нас 5 регистров
if (regAddr < 5) {
uint regCount = getWord();
if (regCount + regAddr < 5) {
// Формируем ответ
putByte(addr);
putByte(3);
putByte(regCount*2);
for(int i = regAddr; i < regCount; i++) {
putWord(regs[i]);
}
} else {/* Формируем исключение */}
} else {/* Формируем исключение */}
} else {/* Формируем исключение */}
} // ничего не делаем - запрос не нам
}
Нафига тебе структуры для модбаса?
Исходная версия ziemin, :
Я обычно делаю так
// MOCK потока ввода
char buf []= {0x02,0x03,0x00,0x01,'d','e',0x00,0x02,0x01};
int bufc = 0;
char getByte() {
return buf[bufc++];
}
char getWord() {
return getByte()*256+getByte();
}
// MOCK потока вывода
char obuf []= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
int obufc = 0;
void putByte(char b) {
return obuf[obufc++];
}
void putWord(uint b) {
putByte(b >> 8);
putByte(b & 0xFF);
}
int main() {
// Разбираем модбас
// Наши регистры
int regs[] = {123, 234, 345, 456};
// Наш адрес
char addr = 2;
// *** Понеслась ***
// Проверяем адрес
if(getByte() == addr) {
//Проверяем функцию. Будем работать только с 3
if (getByte() == 3) {
uint regAddr = getWord();
// Допустим у нас 5 регистров
if (regAddr < 5) {
uint regCount = getWord();
if (regCount + regAddr < 5) {
// Формируем ответ
putByte(addr);
putByte(3);
putByte(regCount*2);
for(int i = regAddr; i < regCount; i++) {
putWord(regs[i]);
}
} else {/* Формируем исключение */}
} else {/* Формируем исключение */}
} else {/* Формируем исключение */}
} // ничего не делаем - запрос не нам
}
Нафига тебе структуры для модбаса?