Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 12, 2022 05:48 pm GMT

Why Arduino fails to receive ACK signal?

As I asked both in:

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:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To