LINUX.ORG.RU

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

Исправление 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 {/* Формируем исключение */}
  } // ничего не делаем - запрос не нам  
}

Нафига тебе структуры для модбаса?