An Interest In:
Web News this Week
- April 27, 2024
- April 26, 2024
- April 25, 2024
- April 24, 2024
- April 23, 2024
- April 22, 2024
- April 21, 2024
April 12, 2022 05:48 pm GMT
Original Link: https://dev.to/pcmagas/why-arduino-fails-to-receive-ack-signal-8e4
Why Arduino fails to receive ACK signal?
As I asked both in:
- https://arduino.stackexchange.com/q/89324/43808
- https://www.arduino.cc/reference/en/language/functions/communication/serial/read/
I try to initiate a data dumping from a flash memory via an ACK message vbia this python script:
import serialfrom time import sleepimport base64def ACK(): ser.write(0x06) ser.write(0xD) ser.write(0xA)ser = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=1)if not ser.isOpen(): ser.open()print("OPEN Serial
")print("READ DATA
")while 1: ACK() line = ser.readline() if(line == b""): continue; if(line[:1] == b'2'): print("DATA:") print(line) print("####")
The Arduino sketch is the following:
#define LASTBLOCK 1023#define LASTPAGE 63#define LASTBYTE 2111#define PAGE_READ 0x13#define PAGE_READ_CACHE_SEQUENCIAL 0x03#define READ_FROM_CACHE 0x3B#define PAGE_READ_CACHE_END 0x3F#define PAGE_SIZE 2111 #define BUFFER_LEN 32 #define ACK 0x06#define NACK 0x06unsigned int page_to_read = 1;unsigned int block_to_read = 1;boolean spi_begun = false;uint8_t bytes_index = 1;typedef struct { // Page that is transmitted unsigned int page; // Block that is transmitted unsigned int block; // A mumeric representation of the 32 byte segment that I send. // I cannot send the page altogether, therefore a byte intexing is required uint8_t bytes_index; // Despite my buffer is 32 bytes the usable data may be less uint8_t length; // Data buffer containing the data to be sent via serial byte data[BUFFER_LEN];} usb_msg;void sendMsg(usb_msg msg){ byte* ptr = (byte*)&msg; Serial.print(0x02); for (size_t i = 0; i < sizeof(usb_msg); i++){ Serial.print(*ptr >>4, HEX); Serial.print(*ptr & 0x0F, HEX); ptr++; } Serial.print(0x03); Serial.println();}bool clientAck(){ uint8_t incomingByte = NULL; digitalWrite(13,HIGH); do { uint8_t incomingByte = Serial.read(); } while(incomingByte!=ACK); digitalWrite(13,LOW);}void setup() { Serial.begin(9600); pinMode(13,OUTPUT);}void loop() { // I need to reset the counts before reading any block if(page_to_read > LASTPAGE){ page_to_read = 1; block_to_read ++; } if(block_to_read > LASTBLOCK){ spi_begun=false; return ; } if(!spi_begun){ spi_begun=true; } clientAck(); // Reading page there's no need for seperate function in order to avoid stack usage for(int bytes_to_read = PAGE_SIZE; bytes_to_read > 0; bytes_to_read-=BUFFER_LEN){ uint8_t bytes_to_send = bytes_to_read < BUFFER_LEN ? bytes_to_read: BUFFER_LEN; usb_msg msg = {page_to_read, block_to_read, bytes_index, bytes_to_send, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; sendMsg(msg); delay(100); bytes_index++; } page_to_read++; delay(100);}
What I try to do, is to emulate the flash memory data dumping, so I can focus on interfacing the flash memory itself in a latter step (Have to do implement it in steps).
But Arduino waits forever for ACK. Any idea why?
Original Link: https://dev.to/pcmagas/why-arduino-fails-to-receive-ack-signal-8e4
Share this article:
Tweet
View Full Article
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To