jenya7 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 (изменено) · Жалоба Есть память со следующей архитектурой MEMORY = 1815 BLOCKS 1 BLOCK = 64 PAGES 1 PAGE = 4096 BYTE То есть память разделена на блоки, блоки разделены на страницы, каждая страница 4К. Мне передают в качестве аргументов офсет и размер данных и на основе этих двух параметров я должен вытащить данные.Для облегчения задачи мне передают фиксированный размер 65530 байт, соответственно офсет увеличивается на 65530. #define PAGESIZE 4096 #define BLOCKSIZE 262144 //64 * 4096; uint32_t startpage, endpage, pages; uint32_t page, block, page_chunk; uint32_t block_idx, page_idx, uart_byte_idx, page_addr; uint32_t row_address; uint32_t last_chunk; uint32_t total_sent_size; void GetLoggerDataFast(uint32_t offset, uint32_t datasize) { total_sent_size = 0; last_chunk = datasize % PAGESIZE; pages = (datasize / PAGESIZE); if (pages == 0) pages = 1; else { if(last_chunk) pages++; } startpage = (offset % BLOCKSIZE) / PAGESIZE; endpage = ((offset + datasize) % BLOCKSIZE) / PAGESIZE; page = startpage; for (page_idx = 0; page_idx < pages; page_idx++) { if (page_idx == 0) { if (datasize > PAGESIZE) { page_chunk = PAGESIZE - (offset % PAGESIZE); page_addr = (offset % PAGESIZE); } else { page_chunk = datasize; page_addr = 0; } } else if (page_idx == ( pages-1)) { page_chunk = datasize - ((pages-1) * PAGESIZE); //page_chunk = datasize - total_sent_size; page_addr = 0; } else { page_chunk = PAGESIZE; page_addr = 0; } printf ("page num = %d \n", page); printf ("page addr = %d \n", page_addr); printf ("page chunk = %d \n", page_chunk); printf ("-------------------\n"); total_sent_size += page_chunk; page++; if (page > 63) { page = 0; } } printf ("total size = %d \n", total_sent_size); printf ("\n\n"); } проверяю int main() { GetLoggerDataFast(0, 65530); GetLoggerDataFast(65530, 65530); GetLoggerDataFast(131060, 65530); GetLoggerDataFast(196590, 65530); GetLoggerDataFast(262120, 65530); GetLoggerDataFast(327650, 65530); return 0; } получаю лог page num = 0 page addr = 0 page chunk = 4096 ------------------- page num = 1 page addr = 0 page chunk = 4096 ------------------- page num = 2 page addr = 0 page chunk = 4096 ------------------- page num = 3 page addr = 0 page chunk = 4096 ------------------- page num = 4 page addr = 0 page chunk = 4096 ------------------- page num = 5 page addr = 0 page chunk = 4096 ------------------- page num = 6 page addr = 0 page chunk = 4096 ------------------- page num = 7 page addr = 0 page chunk = 4096 ------------------- page num = 8 page addr = 0 page chunk = 4096 ------------------- page num = 9 page addr = 0 page chunk = 4096 ------------------- page num = 10 page addr = 0 page chunk = 4096 ------------------- page num = 11 page addr = 0 page chunk = 4096 ------------------- page num = 12 page addr = 0 page chunk = 4096 ------------------- page num = 13 page addr = 0 page chunk = 4096 ------------------- page num = 14 page addr = 0 page chunk = 4096 ------------------- page num = 15 page addr = 0 page chunk = 4090 ------------------- total size = 65530 page num = 15 page addr = 4090 page chunk = 6 ------------------- page num = 16 page addr = 0 page chunk = 4096 ------------------- page num = 17 page addr = 0 page chunk = 4096 ------------------- page num = 18 page addr = 0 page chunk = 4096 ------------------- page num = 19 page addr = 0 page chunk = 4096 ------------------- page num = 20 page addr = 0 page chunk = 4096 ------------------- page num = 21 page addr = 0 page chunk = 4096 ------------------- page num = 22 page addr = 0 page chunk = 4096 ------------------- page num = 23 page addr = 0 page chunk = 4096 ------------------- page num = 24 page addr = 0 page chunk = 4096 ------------------- page num = 25 page addr = 0 page chunk = 4096 ------------------- page num = 26 page addr = 0 page chunk = 4096 ------------------- page num = 27 page addr = 0 page chunk = 4096 ------------------- page num = 28 page addr = 0 page chunk = 4096 ------------------- page num = 29 page addr = 0 page chunk = 4096 ------------------- page num = 30 page addr = 0 page chunk = 4090 ------------------- total size = 61440 page num = 31 page addr = 4084 page chunk = 12 ------------------- page num = 32 page addr = 0 page chunk = 4096 ------------------- page num = 33 page addr = 0 page chunk = 4096 ------------------- page num = 34 page addr = 0 page chunk = 4096 ------------------- page num = 35 page addr = 0 page chunk = 4096 ------------------- page num = 36 page addr = 0 page chunk = 4096 ------------------- page num = 37 page addr = 0 page chunk = 4096 ------------------- page num = 38 page addr = 0 page chunk = 4096 ------------------- page num = 39 page addr = 0 page chunk = 4096 ------------------- page num = 40 page addr = 0 page chunk = 4096 ------------------- page num = 41 page addr = 0 page chunk = 4096 ------------------- page num = 42 page addr = 0 page chunk = 4096 ------------------- page num = 43 page addr = 0 page chunk = 4096 ------------------- page num = 44 page addr = 0 page chunk = 4096 ------------------- page num = 45 page addr = 0 page chunk = 4096 ------------------- page num = 46 page addr = 0 page chunk = 4090 ------------------- total size = 61446 Первая итерация все правильно - 16 страниц - последняя на 6 байт меньше - все правильно. Вторая итерация все правильно - начали с 15-ой страницы, добрали 6 байт а потом все сломалось - последняя страница 30 а не 31. Теперь я изменяю функцию void GetLoggerDataFast(uint32_t offset, uint32_t datasize) { total_sent_size = 0; last_chunk = datasize % PAGESIZE; pages = (datasize / PAGESIZE); if (pages == 0) pages = 1; else { if(last_chunk) pages++; } startpage = (offset % BLOCKSIZE) / PAGESIZE; endpage = ((offset + datasize) % BLOCKSIZE) / PAGESIZE; page = startpage; for (page = startpage; page < endpage+1; page++) { if (page == startpage) { if (datasize > PAGESIZE) { page_chunk = PAGESIZE - (offset % PAGESIZE); page_addr = (offset % PAGESIZE); } else { page_chunk = datasize; page_addr = 0; } } else if (page == endpage) { page_chunk = datasize - ((pages-1) * PAGESIZE); //page_chunk = datasize - total_sent_size; page_addr = 0; } else { page_chunk = PAGESIZE; page_addr = 0; } printf ("page num = %d \n", page); printf ("page addr = %d \n", page_addr); printf ("page chunk = %d \n", page_chunk); printf ("-------------------\n"); total_sent_size += page_chunk; } printf ("total size = %d \n", total_sent_size); printf ("\n\n"); } я изменил только for цикл, но если посмотреть лог page num = 0 page addr = 0 page chunk = 4096 ------------------- page num = 1 page addr = 0 page chunk = 4096 ------------------- page num = 2 page addr = 0 page chunk = 4096 ------------------- page num = 3 page addr = 0 page chunk = 4096 ------------------- page num = 4 page addr = 0 page chunk = 4096 ------------------- page num = 5 page addr = 0 page chunk = 4096 ------------------- page num = 6 page addr = 0 page chunk = 4096 ------------------- page num = 7 page addr = 0 page chunk = 4096 ------------------- page num = 8 page addr = 0 page chunk = 4096 ------------------- page num = 9 page addr = 0 page chunk = 4096 ------------------- page num = 10 page addr = 0 page chunk = 4096 ------------------- page num = 11 page addr = 0 page chunk = 4096 ------------------- page num = 12 page addr = 0 page chunk = 4096 ------------------- page num = 13 page addr = 0 page chunk = 4096 ------------------- page num = 14 page addr = 0 page chunk = 4096 ------------------- page num = 15 page addr = 0 page chunk = 4090 ------------------- total size = 65530 page num = 15 page addr = 4090 page chunk = 6 ------------------- page num = 16 page addr = 0 page chunk = 4096 ------------------- page num = 17 page addr = 0 page chunk = 4096 ------------------- page num = 18 page addr = 0 page chunk = 4096 ------------------- page num = 19 page addr = 0 page chunk = 4096 ------------------- page num = 20 page addr = 0 page chunk = 4096 ------------------- page num = 21 page addr = 0 page chunk = 4096 ------------------- page num = 22 page addr = 0 page chunk = 4096 ------------------- page num = 23 page addr = 0 page chunk = 4096 ------------------- page num = 24 page addr = 0 page chunk = 4096 ------------------- page num = 25 page addr = 0 page chunk = 4096 ------------------- page num = 26 page addr = 0 page chunk = 4096 ------------------- page num = 27 page addr = 0 page chunk = 4096 ------------------- page num = 28 page addr = 0 page chunk = 4096 ------------------- page num = 29 page addr = 0 page chunk = 4096 ------------------- page num = 30 page addr = 0 page chunk = 4096 ------------------- page num = 31 page addr = 0 page chunk = 4090 ------------------- total size = 65536 page num = 31 page addr = 4084 page chunk = 12 ------------------- page num = 32 page addr = 0 page chunk = 4096 ------------------- page num = 33 page addr = 0 page chunk = 4096 ------------------- page num = 34 page addr = 0 page chunk = 4096 ------------------- page num = 35 page addr = 0 page chunk = 4096 ------------------- page num = 36 page addr = 0 page chunk = 4096 ------------------- page num = 37 page addr = 0 page chunk = 4096 ------------------- page num = 38 page addr = 0 page chunk = 4096 ------------------- page num = 39 page addr = 0 page chunk = 4096 ------------------- page num = 40 page addr = 0 page chunk = 4096 ------------------- page num = 41 page addr = 0 page chunk = 4096 ------------------- page num = 42 page addr = 0 page chunk = 4096 ------------------- page num = 43 page addr = 0 page chunk = 4096 ------------------- page num = 44 page addr = 0 page chunk = 4096 ------------------- page num = 45 page addr = 0 page chunk = 4096 ------------------- page num = 46 page addr = 0 page chunk = 4096 ------------------- page num = 47 page addr = 0 page chunk = 4090 ------------------- то во второй итерации последняя страница вычисляется правильно. алгоритм неправильный но как изменение цикла меняет предидущий код. вобщем нужна помощь найти ошибку. Изменено 17 сентября, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба #include <stdio.h> #include <stdint.h> void flash_read(uint32_t block, uint32_t page, uint32_t offset, uint32_t read_num){ printf ("%d\t%d\t%d\t%d\n", block, page, offset, read_num); } void read (uint32_t address, uint32_t num){ while (num){ uint32_t block = address >> 16; uint32_t page = (address & 0xFFFF) >> 12; uint32_t offset = (address & 0x0FFF); uint32_t read_num = 0x1000 - offset; if (read_num > num) read_num = num; flash_read(block, page, offset, read_num); address += read_num; num -= read_num; } } int main(){ read(0, 65530); read(65530, 65530); read(131060, 65530); read(196590, 65530); read(262120, 65530); read(327650, 65530); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 (изменено) · Жалоба int main(){ read(0, 65530); read(65530, 65530); read(131060, 65530); read(196590, 65530); read(262120, 65530); read(327650, 65530); }[/code] я немного видоизменил void read (uint32_t address, uint32_t num) { uint32_t block; uint32_t page; uint32_t offset; uint32_t read_num; while (num) { block = address >> 16; page = (address & 0xFFFF) >> 12; offset = (address & 0x0FFF); read_num = 0x1000 - offset; if (read_num > num) read_num = num; //flash_read(block, page, offset, read_num); printf ("block = %d \n", block); printf ("page = %d \n", page); printf ("offset = %d \n", offset); printf ("read_num = %d \n", read_num); printf ("-------------------\n"); address += read_num; num -= read_num; } } и вот лог block = 0 page = 0 offset = 0 read_num = 4096 ------------------- block = 0 page = 1 offset = 0 read_num = 4096 ------------------- block = 0 page = 2 offset = 0 read_num = 4096 ------------------- block = 0 page = 3 offset = 0 read_num = 4096 ------------------- block = 0 page = 4 offset = 0 read_num = 4096 ------------------- block = 0 page = 5 offset = 0 read_num = 4096 ------------------- block = 0 page = 6 offset = 0 read_num = 4096 ------------------- block = 0 page = 7 offset = 0 read_num = 4096 ------------------- block = 0 page = 8 offset = 0 read_num = 4096 ------------------- block = 0 page = 9 offset = 0 read_num = 4096 ------------------- block = 0 page = 10 offset = 0 read_num = 4096 ------------------- block = 0 page = 11 offset = 0 read_num = 4096 ------------------- block = 0 page = 12 offset = 0 read_num = 4096 ------------------- block = 0 page = 13 offset = 0 read_num = 4096 ------------------- block = 0 page = 14 offset = 0 read_num = 4096 ------------------- block = 0 page = 15 offset = 0 read_num = 4090 ------------------- block = 0 page = 15 offset = 4090 read_num = 6 ------------------- block = 1 page = 0 offset = 0 read_num = 4096 ------------------- block = 1 page = 1 offset = 0 read_num = 4096 ------------------- block = 1 page = 2 offset = 0 read_num = 4096 ------------------- block = 1 page = 3 offset = 0 read_num = 4096 ------------------- block = 1 page = 4 offset = 0 read_num = 4096 ------------------- block = 1 page = 5 offset = 0 read_num = 4096 ------------------- block = 1 page = 6 offset = 0 read_num = 4096 ------------------- block = 1 page = 7 offset = 0 read_num = 4096 ------------------- block = 1 page = 8 offset = 0 read_num = 4096 ------------------- block = 1 page = 9 offset = 0 read_num = 4096 ------------------- block = 1 page = 10 offset = 0 read_num = 4096 ------------------- block = 1 page = 11 offset = 0 read_num = 4096 ------------------- block = 1 page = 12 offset = 0 read_num = 4096 ------------------- block = 1 page = 13 offset = 0 read_num = 4096 ------------------- block = 1 page = 14 offset = 0 read_num = 4096 ------------------- block = 1 page = 15 offset = 0 read_num = 4084 ------------------- block = 1 page = 15 offset = 4084 read_num = 12 ------------------- block = 2 page = 0 offset = 0 read_num = 4096 ------------------- block = 2 page = 1 offset = 0 read_num = 4096 ------------------- block = 2 page = 2 offset = 0 read_num = 4096 ------------------- block = 2 page = 3 offset = 0 read_num = 4096 ------------------- block = 2 page = 4 offset = 0 read_num = 4096 ------------------- block = 2 page = 5 offset = 0 read_num = 4096 ------------------- block = 2 page = 6 offset = 0 read_num = 4096 ------------------- block = 2 page = 7 offset = 0 read_num = 4096 ------------------- block = 2 page = 8 offset = 0 read_num = 4096 ------------------- block = 2 page = 9 offset = 0 read_num = 4096 ------------------- block = 2 page = 10 offset = 0 read_num = 4096 ------------------- block = 2 page = 11 offset = 0 read_num = 4096 ------------------- block = 2 page = 12 offset = 0 read_num = 4096 ------------------- block = 2 page = 13 offset = 0 read_num = 4096 ------------------- block = 2 page = 14 offset = 0 read_num = 4096 ------------------- block = 2 page = 15 offset = 0 read_num = 4078 ------------------- block = 2 page = 15 offset = 4078 read_num = 18 ------------------- block = 3 page = 0 offset = 0 read_num = 4096 ------------------- block = 3 page = 1 offset = 0 read_num = 4096 ------------------- block = 3 page = 2 offset = 0 read_num = 4096 ------------------- block = 3 page = 3 offset = 0 read_num = 4096 ------------------- block = 3 page = 4 offset = 0 read_num = 4096 ------------------- block = 3 page = 5 offset = 0 read_num = 4096 ------------------- block = 3 page = 6 offset = 0 read_num = 4096 ------------------- block = 3 page = 7 offset = 0 read_num = 4096 ------------------- block = 3 page = 8 offset = 0 read_num = 4096 ------------------- block = 3 page = 9 offset = 0 read_num = 4096 ------------------- block = 3 page = 10 offset = 0 read_num = 4096 ------------------- block = 3 page = 11 offset = 0 read_num = 4096 ------------------- block = 3 page = 12 offset = 0 read_num = 4096 ------------------- block = 3 page = 13 offset = 0 read_num = 4096 ------------------- block = 3 page = 14 offset = 0 read_num = 4096 ------------------- block = 3 page = 15 offset = 0 read_num = 4072 ------------------- block = 3 page = 15 offset = 4072 read_num = 24 ------------------- block = 4 page = 0 offset = 0 read_num = 4096 ------------------- block = 4 page = 1 offset = 0 read_num = 4096 ------------------- block = 4 page = 2 offset = 0 read_num = 4096 ------------------- block = 4 page = 3 offset = 0 read_num = 4096 ------------------- block = 4 page = 4 offset = 0 read_num = 4096 ------------------- block = 4 page = 5 offset = 0 read_num = 4096 ------------------- block = 4 page = 6 offset = 0 read_num = 4096 ------------------- block = 4 page = 7 offset = 0 read_num = 4096 ------------------- block = 4 page = 8 offset = 0 read_num = 4096 ------------------- block = 4 page = 9 offset = 0 read_num = 4096 ------------------- block = 4 page = 10 offset = 0 read_num = 4096 ------------------- block = 4 page = 11 offset = 0 read_num = 4096 ------------------- block = 4 page = 12 offset = 0 read_num = 4096 ------------------- block = 4 page = 13 offset = 0 read_num = 4096 ------------------- block = 4 page = 14 offset = 0 read_num = 4096 ------------------- block = 4 page = 15 offset = 0 read_num = 4066 ------------------- block = 4 page = 15 offset = 4066 read_num = 30 ------------------- block = 5 page = 0 offset = 0 read_num = 4096 ------------------- block = 5 page = 1 offset = 0 read_num = 4096 ------------------- block = 5 page = 2 offset = 0 read_num = 4096 ------------------- block = 5 page = 3 offset = 0 read_num = 4096 ------------------- block = 5 page = 4 offset = 0 read_num = 4096 ------------------- block = 5 page = 5 offset = 0 read_num = 4096 ------------------- block = 5 page = 6 offset = 0 read_num = 4096 ------------------- block = 5 page = 7 offset = 0 read_num = 4096 ------------------- block = 5 page = 8 offset = 0 read_num = 4096 ------------------- block = 5 page = 9 offset = 0 read_num = 4096 ------------------- block = 5 page = 10 offset = 0 read_num = 4096 ------------------- block = 5 page = 11 offset = 0 read_num = 4096 ------------------- block = 5 page = 12 offset = 0 read_num = 4096 ------------------- block = 5 page = 13 offset = 0 read_num = 4096 ------------------- block = 5 page = 14 offset = 0 read_num = 4096 ------------------- block = 5 page = 15 offset = 0 read_num = 4060 ------------------- во второй итерации page = 15 и потом page = 0 а номер страницы должен продолжиться 16, 17, и так далее. Изменено 17 сентября, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба арифметика подвела, никогда не используйте магические константы в коде #define PAGE_SIZE 12 #define BLOCK_SIZE 18 uint32_t block = address >> BLOCK_SIZE; uint32_t page = (address & ((1 << BLOCK_SIZE) - 1) ) >> PAGE_SIZE; uint32_t offset = (address & ((1 << PAGE_SIZE) - 1) ); uint32_t read_num = (1 << PAGE_SIZE) - offset; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 (изменено) · Жалоба арифметика подвела, никогда не используйте магические константы в коде #define PAGE_SIZE 12 #define BLOCK_SIZE 18 uint32_t block = address >> BLOCK_SIZE; uint32_t page = (address & ((1 << BLOCK_SIZE) - 1) ) >> PAGE_SIZE; uint32_t offset = (address & ((1 << PAGE_SIZE) - 1) ); uint32_t read_num = (1 << PAGE_SIZE) - offset; большое спасибо. по логу все выглядит хорошо. а как Вы пришли к #define PAGE_SIZE 12 #define BLOCK_SIZE 18 ? убейте не понимаю как это работает. :) read_num = (12*2) - 65530 = ???????? однако вычисляется 4096 пардон read_num = (12*2) - 4090 = 6 это как ? :) Изменено 17 сентября, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Swup 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба большое спасибо. по логу все выглядит хорошо. а как Вы пришли к #define PAGE_SIZE 12 #define BLOCK_SIZE 18 ? Кажется так: PAGE_SIZE = log2(4096) BLOCK_SIZE = log2(4096*64) 4096 размер страницы 64 количество страниц в блоке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба убейте не понимаю как это работает. :) read_num = (12*2) - 65530 = ???????? однако вычисляется 4096 read_num = 4096 - offset; т.е. сколько осталось до конца страницы. offset внутри страницы = address & 0xFFF т.е. от 0 до 4095 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба Кажется так: PAGE_SIZE = log2(4096) BLOCK_SIZE = log2(4096*64) 4096 размер страницы 64 количество страниц в блоке а какое обратное действие log2? возведение в квадрат? я понимаю что шифт предпочтительней деления, тем более по модулю. не понимаю как до этого дошли :) read_num = 4096 - offset; offset внутри страницы = address & 0xFFF т.е. от 0 до 4095 а как это (1 << PAGE_SIZE) это 4096 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 49 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба а какое обратное действие log2? возведение в квадрат? я понимаю что шифт предпочтительней деления, тем более по модулю. не понимаю как до этого дошли :) http://bfy.tw/Jv8I а как это (1 << PAGE_SIZE) это 4096 ? 1 << 12 == 0b 0001 0000 0000 0000 == 2 ^ 12 == 4096. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба а какое обратное действие log2? возведение в квадрат? я понимаю что шифт предпочтительней деления, тем более по модулю. не понимаю как до этого дошли :) ... а как это (1 << PAGE_SIZE) это 4096 ? Вам бы в школу что-ль походить... :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 (изменено) · Жалоба 1 << 12 == 0b 0001 0000 0000 0000 == 2 ^ 12 == 4096. ой. точно. спасибо :) небольшая коррекция #define BLOCK_SIZE 6 Изменено 17 сентября, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 (изменено) · Жалоба я тут набросал симулятор в .Net для тестирования в реальном железе. private void buttonGet_Click(object sender, EventArgs e) { if (!serial_port.IsOpen) { MessageBox.Show("Serial Port is closed!"); return; } int offset; int size; int send_offset = 0; int size_to_send = 0; int total_size = 0; int prog_val = 0; byte[] bytes = new byte[13]; string str; if (!int.TryParse(textBoxOffset.Text, out offset) || !int.TryParse(textBoxSize.Text, out size) || !int.TryParse(textBoxTotalSize.Text, out total_size) || comboBoxPartition.SelectedIndex == -1) { MessageBox.Show("Wrong Parameters!"); return; } send_offset = offset; size_to_send = total_size; progressBarGetData.Maximum = total_size; while (size_to_send > 0) { bytes[0] = 0xAA; bytes[1] = 3; //DATA REQUEST COMMAND bytes[2] = 7; //? bytes[3] = 0; //? bytes[4] = (byte)comboBoxPartition.SelectedIndex; //1-DATA PARTITION bytes[5] = (byte)send_offset; bytes[6] = (byte)(send_offset >> 8); bytes[7] = (byte)(send_offset >> 16); bytes[8] = (byte)(send_offset >> 24); bytes[9] = (byte)size; bytes[10] = (byte)(size >> 8); //clear rx buffer serial_port.ReadExisting(); try { serial_port.Write(bytes, 0, 13); } catch (Exception ex) { MessageBox.Show(ex.Message); } str = ReadComPort(ASCII, 100, 1); richTextBoxLog.AppendText(str); size_to_send -= 65530; send_offset += 65530; prog_val += 65530; if (prog_val < progressBarGetData.Maximum) progressBarGetData.Value = prog_val; else progressBarGetData.Value = progressBarGetData.Maximum; Application.DoEvents(); } } вроде работает корректно. общий размер данных может быть не кратен 65530 но это проблема PC side я так понимаю. Изменено 17 сентября, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться