Een hele goede dag allemaal,
Dit is mijn eerste post op het Arduino forum dus als ik iets fout doe, niet gelijk schieten 
Ik ben momenteel bezig met het maken van een EEPROM programmer (gebaseerd op de MEEPROMMER) en loop tegen het volgende probleem:
- Ik gebruik een 'Arduino' Pro Micro (5V/16MHz)(Sparkfun)(ATMega32u4)
- Ik heb de sketch al aangepast aan mijn 'eigen' situatie
- Ik kan tot 384 bytes sturen/schrijven
- Zodra ik > 384 bytes wil sturen, lijkt het of de Micro de input via Serial.read() niet meer wil lezen
- Ik heb al wat debugging gedaan en daardoor gemerkt dat het ergens zit in het ontvangen van de data (> 384 bytes)
- Ik heb de sketch bijgevoegd
MEEPROMMER_v1.4.ino (22.5 KB)
Ik zou de auteur proberen te benaderen.
Ik heb een nieuw projectje gemaakt, waarbij ik alleen de serial input gebruik. Hier kom ik het zelfde tegen. Is dit normaal gedrag?
Ik kan tot 0x180 (384) bytes versturen, daarna loopt de Pro micro 'vast'??
#define VERSIONSTRING "Test Serial Program"
#define BUFFERSIZE 1024
byte testBuffer[BUFFERSIZE];
#define CMDSIZE 32
char cmdBuffer[CMDSIZE];
// Define COMMANDS
#define VERSION 1
#define RECEIVE 2
unsigned int startAddress, endAddress;
unsigned int lineLength, dataLength;
inline boolean testString(int len, byte* data)
{
for (unsigned int i=0; i < len; i++) {
Serial.print("Address : $");
Serial.print(i, HEX);
Serial.print(" - Data : $");
Serial.print(data[i], HEX);
Serial.println();
}
}
void readCommand() {
for (int i = 0; i < CMDSIZE; i++) cmdBuffer[i] = 0;
char c = ' ';
int idx = 0;
do {
if (Serial.available()) {
c = Serial.read();
cmdBuffer[idx++] = c;
}
}
while (c != '\n' && idx < (CMDSIZE));
cmdBuffer[idx - 1] = 0;
Serial.println("Received command....");
}
byte parseCommand() {
// First string is the command
cmdBuffer[1] = 0;
// Second string is the length of the data
cmdBuffer[6] = 0;
dataLength = hexWord((cmdBuffer + 2));
byte retVal = 0;
switch (cmdBuffer[0]) {
case 'V':
retVal = VERSION;
break;
case 'R':
retVal = RECEIVE;
break;
default:
retVal = 99;
Serial.println("Try again...");
break;
}
return retVal;
}
inline byte hexDigit(char c)
{
//use lookup table for char to hex conversion
const char chartohex[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 0, 0, 0, 0, 0, 0,
10, 11, 12, 13, 14, 15
};
return chartohex[c - '0'];
}
unsigned int hexWord(char* data) {
return ((hexDigit(data[0]) << 12) |
(hexDigit(data[1]) << 8) |
(hexDigit(data[2]) << 4) |
(hexDigit(data[3])));
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while(!Serial) {
// Only for native USB port(??)
}
Serial.println("Welcome!!!!!");
}
void loop() {
// put your main code here, to run repeatedly:
readCommand();
byte cmd = parseCommand();
unsigned int bytes = 0;
Serial.println(cmd, DEC);
switch (cmd) {
case VERSION:
Serial.println(VERSIONSTRING);
break;
case RECEIVE:
if (dataLength > 1024) dataLength = 1024;
Serial.print("dataLength: ");
Serial.print(dataLength, DEC);
Serial.println();
while (bytes < dataLength) {
if (Serial.available()) {
testBuffer[bytes++] = Serial.read();
Serial.print("Just received byte $");
Serial.print(bytes, HEX);
Serial.print(" => ");
Serial.print(bytes, DEC);
Serial.println();
}
}
testString(dataLength, testBuffer);
Serial.print("%");
break;
default:
Serial.println("Waiting for command");
break;
}
}
Heb je al eens geverifieerd of je wel meer dan die 384 bytes van de PC krijg?
Hallo Nico,
Ik heb het geprobeerd met de Serial Monitor binnen de Arduino IDE, als ook met screen en diverse andere Serial terminals voor de Mac (Ik werk met een MacBook, Mac OS X 10.11)
Als ik > 384 bytes wil versturen, dan zie ik de counter oplopen tot 384 en dan stop de Pro micro. Ik kan proberen meer data te sturen, maar dat lijkt niet aan te komen. Ik zie dan ook geen indicatie meer dat de Pro micro reageert (ledjes op de Pro micro blijven uit)
De Pro micro is direct aangesloten op mijn USB poort met een 'gewone/ordinaire' USB kabel.
Punt is dat je nu uitgaat dat het probleem bij de ProMicro zit terwijl daar niet echt een reden toe is. Ik heb hem net ff door de compiler gehaald er er zit niets bijzonders in. Dus vraag ik mij af of we wel op de juiste plek zitten te kijken.
En omdat je zowel een Mac hebt die met het programma zit te praten als ook de terminal die met dezelfde serial zit te praten zou het kunnen dat er daar iets mis gaat. Je krijgt immers je data binnen vanuit dat python programma en daar stuur je ook wat naar terug.
Nico,
Dat heb ik al uitgesloten(?), aangezien ik het getest heb in de situatie dat ik alleen de Arduino IDE open had, of alleen de terminal met een screen sessie. (Of in het geval van een terminal app, alleen de terminal app). Verder waren er geen programma's actief die serieel gebruik(t)en.
Daarom 'Ben ik ook even de weg kwijt'. Ik kan de symptomen reproduceren op verschillende manieren, vanuit de Arduino IDE, binnen de Terminal app met behulp van screen, als ook met diverse verschillende seriële terminal programma's. En dan steeds met één te gelijkertijd actief.
Wat ook nog kan zijn is dat je een buffer overflow hebt. Heb je de baudrates al eens verlaagd?
Ja, zelfde resultaat. Ben al naar 9600 baud gegaan.
Ik heb ff geen idee waar het hem in zit. Ik heb net jouw programma ff door een Arduino UNO gehaald en werkt als een tierelier. Bij mij loopt alles gewoon door. Dus mogelijk is er iets mis in de Seriële communicatie van die micro. Software matig in de sketch is alles goed.
Nico,
Bedankt voor de informatie en het meedenken. (Ben ik dus toch niet gek
)
Dan ga ik nog even verder met zoeken naar een (mogelijke) oplossing....