
|  | roboforum.ruТехнический форум по робототехнике. |  | 



elmot писал(а):Поздравлямс!
Dmitry__ писал(а):Гы, паздравлям!!!

cd src
wstool rm roslisp
rm -rf roslisp
cd ..
/*
Управление лазером и шаговиком для дальномера. 
 */
#define StepFreq 250 //Частота шагов зеркала в герцах
#define motor_X_pin_1 8
#define motor_X_pin_2 9
#define motor_X_pin_3 10
#define motor_X_pin_4 11
#define laserpin 7
#define PosSensor 6
#define PosVCC 5 //Питание для светодиода сенсора
#define PosGND 4 //Земля для светодиода сенсора
int led = 13;
int ii=0;
int id=0;
int inByte[]={0,0,0,0,0,0,0,0};         // Для принятых байтов
volatile int CountByte = 0;         // Счетчик принятых
int countwrong=0; //Счетчик неверных длин команд
int MotorPins[] = {motor_X_pin_1, motor_X_pin_2, motor_X_pin_3, motor_X_pin_4};
volatile byte curstep=0; //Текущий "шаг" включения обмоток
volatile byte MOTstep=0; //Текущий шаг мотора
volatile byte USTstep=0; //Заданный шаг мотора
unsigned char timerLoadValue; //Количестов "начальных" тиков таймера
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT); 
  pinMode(motor_X_pin_1, OUTPUT);
  pinMode(motor_X_pin_2, OUTPUT);
  pinMode(motor_X_pin_3, OUTPUT);
  pinMode(motor_X_pin_4, OUTPUT);
  pinMode(laserpin, OUTPUT);
  pinMode(PosSensor, INPUT);
  digitalWrite(PosSensor, HIGH); //Подтянем вход датчика вверх
  pinMode(PosGND, OUTPUT);
  digitalWrite(PosGND, LOW); //поставим ноль питанию датчика
  pinMode(PosVCC, OUTPUT);
  digitalWrite(PosVCC, HIGH); //поставим единицу (запитаем датчик)
  
    Serial.begin(9600);
    
  //Запускает таймер и получает загружаемое значение таймера.
 timerLoadValue=SetupTimer2(StepFreq); //Параметр - частота, Шагов в секунду. Двигатель и больше может...
 //Выводит загружаемое значение таймера
  Serial.print("Timer2 Load:");
  Serial.println(timerLoadValue,HEX);
}
// the loop routine runs over and over again forever:
void loop() 
{
  
if  (digitalRead(PosSensor)) {digitalWrite(led, HIGH);}
  for (int i=0; i<20; i++)
  {
  //  Serial.println (i); 
  //  Serial.println (CountByte); 
  //  delay(100);               // wait for a second
    if (i==1) //Секция отладки
    {
      id++;
      if (id>31000)
      {
        id=0;
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      Serial.print ("A_");
      Serial.print (ii);
      Serial.println ("      ");
   //     Serial.print ("CB=");
   //     Serial.println (CountByte);
       /* Serial.print ("InByte=");
        Serial.write (inByte[0]); 
        Serial.write (inByte[1]);
        Serial.write (inByte[2]);
        Serial.write (inByte[3]);
        //Если первый символ=S тогда следующие два - номер шага
        //Serial.println();
        */
        ii++;
      //delay(1);               // wait for a second
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
   //   delay(50);               // wait for a second
      }
    }
 
    
   if (CountByte>2)
   {
        CountByte=0;
        //Если первый символ=S тогда следующие два - номер шага
        //Serial.println();
       // Serial.println(inByte[0]);
        if (inByte[0]==83) //83 - код "S"
        {
              Serial.write ("Kom S"); 
              if (inByte[1]==48) //48 - код "0"
              {//stepMotor(0);
              USTstep--;
              Serial.println ("0 ok");}
              if (inByte[1]==49) //49 - код "1"
              {//stepMotor(1);
              USTstep++;
              Serial.println ("1 ok");}
              
        }
        if (inByte[0]==76) //76 - код "L"
        {
              Serial.println (i); 
              Serial.write ("Kom L"); 
              if (inByte[1]==48) //48 - код "0"
              {digitalWrite(laserpin, LOW);
              Serial.println ("0 ok");}
              if (inByte[1]==49) //49 - код "1"
              {digitalWrite(laserpin, HIGH);
              Serial.println ("1 ok"); }
         }
        if (inByte[0]==77) //77 - код "M"
        {
              Serial.write ("Kom M"); 
              USTstep=inByte[1]; //Ставим нужный шаг
              Serial.print (USTstep); 
              Serial.println (" ok"); 
         }
        if (inByte[0]==82) //82 - код "R" Начальное позиционирование - дописать
        {
              Serial.write ("Kom R"); 
              ZeroPos();
              Serial.println (" ok"); 
         }
    }
  
 }
   //   Разберемся с "потерянными" командами
   if (CountByte) //Если в буфере есть что-то
    {
      countwrong++; //Увеличиваем счетчик
    }
    else
    {countwrong=0;}
    if (countwrong>500)//Если это что-то (типа 1 байт) больше 500 циклов
    {
      Serial.println ("CountWrong!");
      countwrong=0;
      CountByte=0;
    }
   
}
void serialEvent() {
 //Serial.write ("Event0"); 
  if (Serial.available()) {
    digitalWrite(led, HIGH);
   //Serial.write ("Event1"); 
    // get the new byte:
    inByte[CountByte] = Serial.read();
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inByte[CountByte] == 10) {// '\n', новая строка
      CountByte=3;
         //Serial.write ("EndString!"); 
         //Serial.write ("EndL!"); 
    } 
    else{    CountByte++;}
  }
}
void stepMotor( int Step) // Step 0 или +1
{
//Serial.println(curstep[Motor]); 
 int i; //Сдвиг для номеров пинов мотора
  if (Step) 
   {
 //      Serial.println("StepMotor Step=1"); 
     if (curstep==3)
     {curstep=0;}
    else
     {curstep++;}
   }
  else
  {
//    Serial.println("StepMotor Step=0"); 
    if (curstep==0)
     {curstep=3;}
    else
      {curstep--;}
   }
   
   switch (curstep) { //переделать, убрать массив с ногами моторов, аменить на дефиненные
      case 0:    // 1000
      digitalWrite(MotorPins[0], HIGH);
      digitalWrite(MotorPins[1], LOW);
      digitalWrite(MotorPins[2], LOW);
      digitalWrite(MotorPins[3], LOW);
      break;
     case 1:    // 0010
      digitalWrite(MotorPins[0], LOW);
      digitalWrite(MotorPins[1], LOW);
      digitalWrite(MotorPins[2], HIGH);
      digitalWrite(MotorPins[3], LOW);
      break;
     case 2:    // 0100
      digitalWrite(MotorPins[0], LOW);
      digitalWrite(MotorPins[1], HIGH);
      digitalWrite(MotorPins[2], LOW);
      digitalWrite(MotorPins[3], LOW);
      break;
     case 3:    // 0001
      digitalWrite(MotorPins[0], LOW);
      digitalWrite(MotorPins[1], LOW);
      digitalWrite(MotorPins[2], LOW);
      digitalWrite(MotorPins[3], HIGH);
      break;
  }
}
#define TIMER_CLOCK_FREQ 15625.0 
//15625 for /1024
//2MHz for /8 prescale from 16MHz
//Установка Таймера2.
//Конфигурирует 8-битный Таймер2 ATMega168 для выработки прерывания
//с заданной частотой.
//Возвращает начальное значение таймера, которое должно быть загружено в TCNT2
//внутри вашей процедуры ISR.
//Смотри пример использования ниже.
unsigned char SetupTimer2(float timeoutFrequency)
{
  unsigned char result; //Начальное значение таймера.
  //Подсчет начального значения таймера
  result=(int)((257.0-(TIMER_CLOCK_FREQ/timeoutFrequency))+0.5);
  //257 на самом деле должно быть 256, но я получил лучшие результаты с 257.
   
  //Установки Таймер2: Делитель частоты /8, режим 0
  //Частота = 16MHz/1024 = 15625 герц или 64 мкс
  //Делитель /1024 дает нам хороший рабочий диапазон
  //так что сейчас мы просто жестко запрограммируем это.
  TCCR2A = 0;
  //TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20; //это на 8
  TCCR2B = 7;
   
  //Подключение прерывания по переполнению Timer2
  TIMSK2 = 1<<TOIE2;
  //загружает таймер для первого цикла
  TCNT2=result;
  return(result); //значение (начальное) счетчика.
}
//Timer2 указатель вектора прерывания по переполнению
ISR(TIMER2_OVF_vect) {
  if (MOTstep>USTstep)
    {
      stepMotor(0);
      MOTstep--;
    }
  if (MOTstep<USTstep)
    {
      stepMotor(1);
      MOTstep++;
    }
/*TestPerem++;
if (TestPerem>80){
  //Переключение IO-вывода в другое состояние.
  digitalWrite(TOGGLE_IO,!digitalRead(TOGGLE_IO));
  TestPerem=0;
}
//Захват текущего значения таймера. Это величина ошибки
//из-за задержки обработки прерывания и работы этой функции
int latency=TCNT2;
//Перезагрузка таймера и коррекция по задержке
//TCNT2=latency+timerLoadValue;
*/
TCNT2=timerLoadValue;
}
void ZeroPos() //калибровка шаговика
{
  USTstep=0; //Уставка - ноль
  Serial.print ("Reset ");
  while(digitalRead(PosSensor)) //До срабатывания датчика - шагать
  {
    MOTstep=1;
  }
  Serial.println ("OK");
}
C:\Temp\ProgSPI>C:\Python34\python.exe spi_flash_programmer_client.py -d com3 --flash-offset 0 -s 1024 -f dump.bin read
1048320 of 1048576
C:\Temp\ProgSPI>C:\Python34\python.exe spi_flash_programmer_client.py -d com3 --flash-offset 0 -s 1024 -f dump.bin verify
Verifying dump.bin with flash start 0 and file start 0
1048576


 
#include <avr\pgmspace.h>
//#include "C:\Work\arduino-1.6.1\hardware\arduino\sam\cores\arduino\avr\pgmspace.h"
#define DATAOUT 11//MOSI
#define DATAIN  12//MISO 
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss
//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2 
#define SECTOR_ERASE 0x20
#define CHIP_ERASE 0xC7
byte buffer [256];
/* // Via http://excamera.com/sphinx/article-crc.html
static PROGMEM prog_uint32_t crc_table[16] = {
    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};
*/
  prog_uint32_t crc_table[16] PROGMEM = {
    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
    0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
    0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
};
unsigned long crc_update(unsigned long crc, byte data)
{
    byte tbl_idx;
    tbl_idx = crc ^ (data >> (0 * 4));
    crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
    tbl_idx = crc ^ (data >> (1 * 4));
    crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
    return crc;
}
unsigned long crc_buffer(void)
{
  unsigned long crc = ~0L;
  for(int i=0; i < 256; i++)
    crc = crc_update(crc, buffer[i]);
  crc = ~crc;
  return crc;
}
void setup()
{
  Serial.begin(115200);
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
    
  digitalWrite(SLAVESELECT,HIGH); //disable device 
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/4 rate (fastest)
  //SPCR = (1<<SPE)|(1<<MSTR);
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPI2X);
  
  byte clr;
  clr=SPSR;
  clr=SPDR;
  
  delay(10);
 
  buffer[0] = 0xca;
  buffer[1] = 0xfe;   
  
  
 
/*                digitalWrite(SLAVESELECT,LOW); //Выбираем чип
                delay(20);
                spi_transfer(1); //Регистр статуса на запись
                delay(20);
                spi_transfer(0); //Запись в регистр
                //spi_transfer(0); //Запрос статуса (регистра)
                delay(20);
                Serial.println(spi_transfer(0xff));
                delay(20);
              digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
*/    
  
  
  
  
}
void loop()
{
  byte addr1, addr2;
  
  while(Serial.available() == 0)
    ;
  int cmd = Serial.read();
  
  switch(cmd) {
  case '>':
    Serial.print('>');
    break;
  case 'e':
    erase_all();
    break;
  case 'r':
    addr1 = read_hex();
    addr2 = read_hex();
    read_page(addr1, addr2);
    break;
  case 'w':
    addr1 = read_hex();
    addr2 = read_hex();
    write_page(addr1, addr2);
    break;
  case 'd':
    dump_buffer();
    break;
  case 'c':
    dump_buffer_crc();
    break;
  case 'l':
    load_buffer();
    break;
  case 's':
    addr1 = read_hex();
    addr2 = read_nybble() << 4;
    erase_sector(addr1, addr2);
    break;
  case '?':
  case 'h':
    Serial.println("\nSPI Flash programmer");
    Serial.println(" e    : erase chip");
    Serial.println(" sXXX : erase 4k sector XXX (hex)");
    Serial.println(" c    : print buffer CRC-32");
    Serial.println(" rXXXX: read 256-byte page XXXX (hex) to buffer");
    Serial.println(" wXXXX: write buffer to 256-byte page XXXX (hex)");
    Serial.println(" d    : display the buffer (in hex)");
    Serial.println(" l<b> : load the buffer with <b>, where b is 256 bytes of data");
    Serial.println();
    Serial.println("Ex: r3700 - read 256 bytes from page 0x3700");
    Serial.println("Ex: lcafe[...]3737 - load the buffer with 256 bytes, first byte 0xca...");
    break;
  
    case 't':
    int counter;
    Serial.println("Testing");
    read_page(0, 0);
    Serial.println("Read 1");
    dump_buffer();
//    erase_sector(0, 0);
    for(counter = 0; counter < 256; counter++) 
    {
    buffer[counter] = 0x55;
    }
    dump_buffer();
    write_page(0, 0);
    Serial.println("Writing");
        for(counter = 0; counter < 256; counter++) 
    {
    buffer[counter] = 0x11;
    }
    read_page(0, 0);
    Serial.println("Read 2");
    dump_buffer();
      //READ EEPROM
   break;
    case 'u':
    digitalWrite(SLAVESELECT,LOW); //Выбираем чип
    spi_transfer(5); //Запрос статуса (регистра)
    Serial.print("Status=");
    Serial.println(spi_transfer(0xff));
    delay(20);
    digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
    delay(20);
    digitalWrite(SLAVESELECT,LOW); //Выбираем чип
    delay(20);
    spi_transfer(1); //Регистр статуса на запись
    delay(20);
    spi_transfer(0); //Запись в регистр
    delay(20);
    Serial.println(spi_transfer(0xff));
    delay(20);
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
    
    break;
  }
  
  Serial.flush();
} 
void dump_buffer()
{
  int counter;
  
  for(counter = 0; counter < 256; counter++) {
    Serial.print(buffer[counter] >> 4, HEX);
    Serial.print(buffer[counter] & 0xF, HEX);
  }
  Serial.println();
}
void dump_buffer_crc()
{
  unsigned long crc = crc_buffer();
  Serial.print(crc_buffer(), HEX);
  Serial.println();
}
void load_buffer()
{
  int counter;
  for(counter = 0; counter < 256; counter++) {
    buffer[counter] = read_hex();
  }
}
byte read_nybble()
{
  int nybble;
  while((nybble = Serial.read()) == -1)
    ;
  
  if(nybble >= 'A') {
    // works for lowercase as well (but no range checking of course)
    return 9 + (nybble & 0x0f);
  } else {
    return nybble & 0x0f;
  } 
}
byte read_hex()
{
  byte val;
  
  val = (read_nybble() & 0xf) << 4;
  val |= read_nybble();
  
  return val;
}
byte spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait for the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}
void
read_page(byte adr1, byte adr2)
{
  //READ EEPROM
  int counter;
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(READ);
  spi_transfer(adr1); // bits 23 to 16
  spi_transfer(adr2); // bits 15 to 8
  spi_transfer(0);    // bits 7 to 0
  for(counter = 0; counter < 256; counter++) {
    buffer[counter] = spi_transfer(0xff);
  }
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
} 
void wait_for_write()
{
  byte statreg = 0x1;
  
  while((statreg & 0x1) == 0x1) {
    // Wait for the chip.
    digitalWrite(SLAVESELECT, LOW);
    spi_transfer(RDSR);
    statreg = spi_transfer(RDSR);
    digitalWrite(SLAVESELECT, HIGH);
  }  
}
void
write_page(byte adr1, byte adr2)
{
  int counter;
  
  digitalWrite(SLAVESELECT,LOW);
  delay(2);
  spi_transfer(WREN); //write enable
  digitalWrite(SLAVESELECT,HIGH);
  delay(2);
  digitalWrite(SLAVESELECT,LOW);
  delay(1);
  spi_transfer(WRITE); //write instruction
  spi_transfer(adr1); // bits 23 to 16
  spi_transfer(adr2); // bits 15 to 8
  spi_transfer(0);    // bits 7 to 0
  for (counter = 0; counter < 256; counter++)
  {
    spi_transfer(buffer[counter]);
    //  delay(1);
  }
   delay(2);
  digitalWrite(SLAVESELECT,HIGH);
  delay(5);
  
  wait_for_write();
}
void
erase_all()
{
  int counter;
  
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(WREN); //write enable
  digitalWrite(SLAVESELECT,HIGH);
  delay(10);
  digitalWrite(SLAVESELECT,LOW);
  Serial.println(" e : erase chip start");
  spi_transfer(CHIP_ERASE);
  delay(1000);
  digitalWrite(SLAVESELECT,HIGH);
  delay(1);
  
  wait_for_write();
  Serial.println(" e : erase chip end");
}
void
erase_sector(byte addr1, byte addr2)
{
  digitalWrite(SLAVESELECT,LOW);
  delay(12);
  spi_transfer(WREN);
  delay(12);
  digitalWrite(SLAVESELECT,HIGH);
  delay(12);
  
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(SECTOR_ERASE);
  spi_transfer(addr1);
  spi_transfer(addr2);
  spi_transfer(0);
  delay(82);
  digitalWrite(SLAVESELECT,HIGH);
  delay(62);
}
import time
import serial
import argparse
import binascii
import sys
MAX_SIZE = 16 * 1024 * 1024
SECTOR_SIZE = 4096
class NoResponse(Exception):
   pass
def decodeHex(hexBytes):
   return binascii.unhexlify(hexBytes)
def encodeHex(data):
   return binascii.hexlify(data)
class SerialChatChat:
   def __init__(self, filename):
      self.sock = serial.Serial(filename, 115200, timeout=1)
      # Wait for the Arduino bootloader
      time.sleep(2)
   
   def _readCRC(self):
      crc = b''
      self.sock.flushInput()
      self.sock.write(b'c')
      while not crc.endswith(b'\r\n'):
         crc += self.sock.read(1)
      return int(crc, 16)
   def _readPageOnce(self, page):
      # Reads page, returns CRC
      cmd = 'r%02x%02x' % ((page & 0xff00) >> 8, (page & 0xff))
      self.sock.write(cmd.encode('iso-8859-1'))
      self.sock.flush()
      return self._readCRC()
   def _readPageMultiple(self, page):
      # Keep reading until we get two pages reads the same.
      crc = [self._readPageOnce(page), self._readPageOnce(page)]
      count = 0
      while crc[0] != crc[1] and count < 3:
         print("Retrying read of page %d" % (page))
         crc.pop(0)
         crc.append(self._readPageOnce(page))
         count += 1
      if crc[0] != crc[1]:
         #raise Exception()
         print("CRC if error")
      
      return crc[1]
   def readPage(self, page):
      self._readPageMultiple(page)
   
      # Dump the buffer.
      self.sock.write(b'd')
      result = []
      amt_read = 0
      while amt_read < 512:
         fromChip = self.sock.read(512 - amt_read)
         amt_read += len(fromChip)
         result.append(fromChip)
      result = b''.join(result)
      assert len(result) == 512, len(result)
      return decodeHex(result)
   def writePage(self, page, data):
      # Write the page and verify that it was written correctly.
      expectedCRC = binascii.crc32(data)
      data = encodeHex(data)
      assert len(data) == 512, (len(data), data)
      self.sock.write(b'l' + data)
      self.waitReady()
      # This shouldn't fail if we're using a reliable connection.
      if self._readCRC() != expectedCRC:
         print("CRC error")
         raise Exception()
      # Write it, read it back, fail if we can't read what we wrote.
      cmd = 'w%02x%02x' % ((page & 0xff00) >> 8, (page & 0xff))
      self.sock.write(cmd.encode('iso-8859-1'))
      self.sock.flush()
      self.waitReady()
      writtenCRC = self._readPageMultiple(page)
      if writtenCRC != expectedCRC:
         print("CRC error verify")
         ###print("written CRC", writtenCRC, "expected CRC", expectedCRC, page, data)
         print("written CRC", writtenCRC, "expected CRC", expectedCRC, page)
      
      return writtenCRC == expectedCRC
      #return 1
   def waitReady(self, seconds_to_wait=5):
      self.sock.flushInput()
      self.sock.write(b'>')
      self.sock.flush()
      for retry in range(seconds_to_wait):
         data = self.sock.read(1)
         if data == b'>':
            break
         elif data:
            print('unexpected', data)
      else:
         raise NoResponse()
   
   def verify(self, filename, flashStartByte=0, fileStartByte=0):
      assert flashStartByte % 256 == 0
      assert fileStartByte % 256 == 0
      idx = flashStartByte
      print("Verifying %s with flash start %d and file start %d" % (filename, flashStartByte, fileStartByte))
      with open(filename, 'rb') as h:
         h.seek(fileStartByte)
         while True:
            sys.stdout.write('\r%d' % (idx))
            sys.stdout.flush()
            fromFile = h.read(256)
            if fromFile == b'':
               break
            assert len(fromFile) == 256, len(fromFile)
            fileCRC = binascii.crc32(fromFile)
            for retry in range(3):
               deviceCRC = self._readPageOnce(idx // 256)
               if deviceCRC != fileCRC:
                  print("Mismatch %x != %x, retrying" % (deviceCRC, fileCRC))
               else:
                  break
            else:
               raise Exception("Mismatch")
            idx += 256
   def eraseSector(self, sectorNumber):
      cmd = 's%03x' % (sectorNumber)
      self.sock.write(cmd.encode('iso-8859-1'))
      self.waitReady()
   def _writeSectorOnce(self, byteOffset, sectorData):
      assert byteOffset % SECTOR_SIZE == 0
      assert len(sectorData) == SECTOR_SIZE
      pageData = []
      for idx in range(0, SECTOR_SIZE, 256):
         pageData.append(sectorData[idx:idx+256])
      pageOffset = byteOffset // 256
      
      expectedCRCs = [binascii.crc32(page) for page in pageData]
      actualCRCs   = [self._readPageMultiple(pageOffset + idx) for idx in range(SECTOR_SIZE // 256)]
      if expectedCRCs != actualCRCs:
         self.eraseSector(byteOffset // SECTOR_SIZE)
      for idx, page in enumerate(pageData):
         if not self.writePage(pageOffset + idx, page):
            return False
      return True
   def writeFile(self, filename, offset=0):
      with open(filename, 'rb') as h:
         data = h.read(MAX_SIZE)
      print('Writing', filename, 'at', offset)
      for idx in range(0, len(data), SECTOR_SIZE):
         sys.stdout.write('\r%d of %d' % (idx, len(data)))
         sys.stdout.flush()
         pageData = data[idx:idx + SECTOR_SIZE]
         assert len(pageData) == SECTOR_SIZE
         for retry in range(144):
            if self._writeSectorOnce(offset + idx, pageData):
               break
            else:
               print("Retrying")
         else:
            print("Error control of write")
            #raise Exception()
   def readToFile(self, filename, size, flashStartByte):
      assert size % 256 == 0
      assert flashStartByte % 256 == 0
      flashStartPage = flashStartByte // 256
      with open(filename, 'wb') as handle:
         for idx in range(0, size, 256):
            sys.stdout.write('\r%d of %d' % (idx, size))
            sys.stdout.flush()
            page = idx // 256
            pageData = self.readPage(page + flashStartPage)
            handle.write(pageData)
   
def main():
   parser = argparse.ArgumentParser(description="Interface with an Arduino-based SPI flash programmer")
   parser.add_argument('-f', dest='filename')
   parser.add_argument('-d', dest='device', default='/dev/tty.usbserial-A700ekGi')
   parser.add_argument('-s', dest='size', default='4096', help="size in KB")
   parser.add_argument('--flash-offset', dest='flash_offset', default='0', help='offset for flash read/write in bytes')
   parser.add_argument('--file-offset', dest='file_offset', default='0', help='offset for file read/write in bytes')
   parser.add_argument('command', choices=('write', 'read', 'verify'))
   args = parser.parse_args()
   chat = SerialChatChat(args.device)
   if args.command=='write':
      chat.writeFile(args.filename, int(args.flash_offset))
   elif args.command=='read':
      chat.readToFile(args.filename, int(args.size) * 1024, int(args.flash_offset))
   elif args.command=='verify':
      chat.verify(args.filename, int(args.flash_offset), int(args.file_offset))
   else:
      raise NotImplementedError()
if __name__ == '__main__':
   main()
void flash_str_toip(uint8_t *srcstr, uint8_t *outstr) //на входе строка разделенная точками ("192.168.100.25"), на выходе - массив 4 байта
{
   //Идея в чем? Берем указатель на "." (точку) в строке.
   uint8_t *ptr0=srcstr; // указатель на строку
   for (uint8_t i=0;i<4;i++)
   {
   outstr[i]=atoi(ptr0);
   ptr0=strstr(ptr0,"."); //Возвращает указатель на следующий символ "." в строке
   *ptr0++;
   }
   outstr[4]=0; //вообще так как мы знаем что это то можно и не ограничивать массив (строку)
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0