Touchscreen met gsm shield gebruiken

algemene C code
Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Touchscreen met gsm shield gebruiken

Berichtdoor christiaan » 22 Mei 2016, 19:22

Ik kan via Google alleen vinden om de eerste zoveel karakters met de strcpy in een nieuwe char array te zetten. Maar ik moet dus de volledige message splitten in stukken van 25 tekens.

Voor de terminator '\0' had ik al rekening gehouden omdat mijn char array bestaan uit 26 tekens (25 voor bericht en de 26e positie de terminator.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Touchscreen met gsm shield gebruiken

Berichtdoor nicoverduin » 22 Mei 2016, 19:32

beter zoeken misschien? En moet je strncpy() en niet strcpy(). De source is een char * = char pointer. Is dus een verwijzer naar een start punt.
Dus zou je gewoon dit kunnen doen:
cpp code
strncpy(dest1, &source[0], 25);       // &source[0] is gelijk aan adres van source[index=0] is gelijk aan source
strncpy(dest2, &source[25], 25); // &source[25] is gelijk aan adres van source[index=25]
strncpy(dest3, &source[50], 25);
dest1[25] = '\0';
dest2[25] = '\0';
dest3[25] = '\0';
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Touchscreen met gsm shield gebruiken

Berichtdoor christiaan » 24 Mei 2016, 15:12

Als ik onderstaand code plaats, en vervolgens een sms verstuur, dan geeft hij eens in de zoveel tijd alleen de onderste regel weer. De andere 2 bestaan niet. 7 van de 10 geeft hij helemaal geen bericht weer

cpp code
strncpy(line1, &message[0], 25);       // &source[0] is gelijk aan adres van source[index=0] is gelijk aan source
strncpy(line2, &message[25], 25); // &source[25] is gelijk aan adres van source[index=25]
strncpy(line3, &message[50], 25);
line1[26] = '\0';
line2[26] = '\0';
line3[26] = '\0';


Line 1 t/m 3 zijn char ...[26]

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Touchscreen met gsm shield gebruiken

Berichtdoor nicoverduin » 24 Mei 2016, 16:06

En je weet zeker dat er 75 tekens in die message staan? Maw. :
a) zou je hier eens jouw laatste sketch willen zetten
b) een voorbeeld van de output die in message staat
c) de output die na de strncpy in de lines staat.
Ik heb een vermoeden wat er loos is alleen wil ik het ff bevestigd zien.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Touchscreen met gsm shield gebruiken

Berichtdoor christiaan » 24 Mei 2016, 23:26

Ik denk dat het probleem is dat niet iedere keer er 75 tekens aanwezig zijn in de message. Eventueel roep ik de char verkeerd aan in het begin.

Ik kan pas morgen de code geven hier op het forum. Wat gij weergeeft zijn de laatste 10 tekens van het bericht wat ik morgen zal plaatsen. In de serial krijg ik voor ik zover kon zien geen bericht weer.

De array message bevat rouwen wel het gehele bericht.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Touchscreen met gsm shield gebruiken

Berichtdoor nicoverduin » 25 Mei 2016, 07:35

De kern van het probleem zit vermoedelijk in de message die je binnen krijgt. Wat je niet weet (of ziet) of er '\0' tekens tussen staan of wat de lengte van de message is. Allemaal niet zo dramatisch maar dan moet dat onderzocht worden. Om te zien hoe je RAM eruit ziet kun je gebruik maken van DumpMonitor : https://sourceforge.net/p/dumpmon/wiki/Home/
Hiermee kun je een memory dump krijgen op de serial via commando's. De adressen van variabelen kun je ook afdrukken naar de serial. En als je alle output ff kopieert naar een textverwerker met courier font is het mooi uitgelijnd.
voorbeeld code :
cpp code
// This is an example sketch for Simple Dumping Monitor.
// It shows how to add Simple Dumping Monitor in Blink example sketch.
//
#include <dumpmon.h> // Include necessary header.
char txt[] = "Dit is een test";
char txt1[50];

#define LEDPIN 13

void setup() {
pinMode(LEDPIN, OUTPUT);
dumpmonSetup(19200); // Call setup function to begin Serial communication.
//
// print list of veriables
//
Serial.print("txt = ");
Serial.println((uint16_t)&txt[0], HEX);
Serial.print("txt1 = ");
Serial.println((uint16_t)&txt1[0], HEX);
}

void loop() {
strcpy(txt1, txt);
dumpmonLoop(); // Call dump monitor loop function to handle Serial communication.
digitalWrite(LEDPIN, HIGH);
delay(500);
digitalWrite(LEDPIN, LOW);
delay(500);
}


Output op de serial
cpp code
txt    = 106
txt1 = 158

>>Send to COM4: "M100"<<
M100
Memory dump: RAM
0100 00 00 81 02 80 00 44 69 74 20 69 73 20 65 65 6E ......Dit is een
0110 20 74 65 73 74 00 01 D7 01 09 00 00 00 74 78 74 test........txt
0120 20 20 20 20 3D 20 00 74 78 74 31 20 20 20 3D 20 = .txt1 =
0130 00 FF 08 FF 7F FF 03 00 00 00 00 12 0D 7E 0E 94 .............~..
0140 0C AD 0C 9F 0C F0 0C 0D 0A 00 6E 61 6E 00 69 6E ..........nan.in
0150 66 00 6F 76 66 00 2E 00 44 69 74 20 69 73 20 65 f.ovf...Dit is e
0160 65 6E 20 74 65 73 74 00 00 00 00 00 00 00 00 00 en test.........
0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01D0 00 00 00 03 03 00 01 3B 01 00 00 E8 03 00 00 00 .......;........
01E0 00 00 00 C5 00 C4 00 C0 00 C1 00 C2 00 C6 00 01 ................
01F0 04 04 03 07 4D 31 30 30 00 00 00 00 00 00 00 00 ..02M100........
>


En dan kun je dus zien wat er echt in het geheugen staat. :mrgreen: Lekker ouderwets debuggen :mrgreen:
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: Touchscreen met gsm shield gebruiken

Berichtdoor christiaan » 25 Mei 2016, 12:39

cpp code
/*
SMS receiver

This sketch, for the Arduino GSM shield, waits for a SMS message
and displays it through the Serial port.

Circuit:
* GSM shield attached to and Arduino
* SIM card that can receive SMS messages

created 25 Feb 2012
by Javier Zorzano / TD

This example is in the public domain.

http://www.arduino.cc/en/Tutorial/GSMExamplesReceiveSMS

*/
/* RGB led 1 (status led) */
#define COMMON_ANODE
int redPin1 = A0;
int greenPin1 = A2;
int bluePin1 = A1;

/* RGB led 2 (ontvanger led) */
#define COMMON_ANODE2
int redPin2 = A3;
int greenPin2 = A5;
int bluePin2 = A4;

/* LCD Screen */
#include <TFT.h> // Arduino LCD library
#include <SPI.h>

// pin definition for the Uno
#define cs 10 // 10
#define dc 9 // 9
#define rst 8 // 8
TFT TFTscreen = TFT(cs, dc, rst);

const int buttonPin = 5; // the number of the pushbutton pin
int buttonState = 0; // variable for reading the pushbutton status



// include the GSM library
#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER "0000"

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[21];
String smsSender;
boolean sendtoScreen = false;

char message[300];
int x;

void setup() {
pinMode(redPin1, OUTPUT);
pinMode(greenPin1, OUTPUT);
pinMode(bluePin1, OUTPUT);
pinMode(redPin2, OUTPUT);
pinMode(greenPin2, OUTPUT);
pinMode(bluePin2, OUTPUT);
// initialize serial communications and wait for port to open:
Serial.begin(9600);
TFTscreen.begin();
pinMode(buttonPin, INPUT);
// clear the screen with a black background
TFTscreen.background(0, 0, 0);

// write the static text to the screen
// set the font color to white
TFTscreen.stroke(255, 255, 255);
// set the font size
TFTscreen.setTextSize(3);
// write the text to the top left corner of the screen
TFTscreen.text("Havik", 0, 0);
TFTscreen.text("Scouts", 15, 40);
TFTscreen.text("SMS bom!", 0, 80);

setColor1(10, 44, 209); // blue
setColor2(255, 255, 0); // yellow
delay(1000);
setColor2(10, 44, 209); // blue
setColor1(255, 255, 0); // yellow
delay(1000);
setColor1(10, 44, 209); // blue
setColor2(255, 255, 0); // yellow
delay(1000);
setColor1(0, 0, 0); // off
setColor2(0, 0, 0); // off

while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

Serial.println("SMS Messages Receiver");

// connection state
boolean notConnected = true;

// Start GSM connection
while (notConnected) {
if (gsmAccess.begin(PINNUMBER) == GSM_READY) {
notConnected = false;
} else {
Serial.println("Not connected");
delay(1000);
}
}

Serial.println("GSM initialized");
Serial.println("Waiting for messages");
clearTftScreen();
setColor1(0, 0, 255); // blue
}

void loop() {
char c;

// If there are any SMSs available()
if (sms.available()) {
setColor1(0, 255, 0); // green
Serial.println("Message received from:");

// Get remote number
sms.remoteNumber(senderNumber, 20);
Serial.println(senderNumber);

if(strcmp(senderNumber, "+31647261678") == 0) {
Serial.println("Message received from: Christiaan de Kleine");
} else {
Serial.println("Message received from: a random person!");
}

// An example of message disposal
// Any messages starting with # should be discarded
if (sms.peek() == '#') {
Serial.println("Discarded SMS");
sms.flush();
}

// Read message bytes and print them
uint8_t i = 0;
while (c = sms.read()) {
//Serial.print(c);
message[i] = c; // build the message from the sms.read() function
message[i+1] = '\0';
i++;
//Serial.println(message);
}

// Send sms to screen!!!!!!
sendtoScreen = true;
TFTscreen.background(0, 0, 0);
TFTscreen.setTextSize(1);
//delay(500);
TFTscreen.text("Sender:", 0, 0);
TFTscreen.text(senderNumber, 60, 0);

char line1[26];
char line2[26];
char line3[26];
strncpy(line1, &message[0], 25); // &source[0] is gelijk aan adres van source[index=0] is gelijk aan source
strncpy(line2, &message[25], 25); // &source[25] is gelijk aan adres van source[index=25]
strncpy(line3, &message[50], 25);
line1[25] = '\0';
line2[25] = '\0';
line3[25] = '\0';

// TFTscreen.text(line1, 0, 40);
// TFTscreen.text(line2, 0, 50);
// TFTscreen.text(line3, 0, 60);

TFTscreen.text(message, 0, 40);
Serial.println(line1);
Serial.println(line2);
Serial.println(line3);
Serial.println(message);
//delay(60000);
if (sendtoScreen == false) {

}



// // Read message bytes and print them
// while (c = sms.read()) {
// Serial.print(c);
// TFTscreen.setTextSize(2);
// TFTscreen.text(c, 0, 0);
// }

Serial.println("\nEND OF MESSAGE");

}


buttonState = digitalRead(buttonPin);
Serial.println(buttonState);
if (buttonState == 1) {
setColor1(255, 0, 0); // red
// turn LED off:
// Delete message from modem memory

sms.flush();
Serial.println("MESSAGE DELETED");
TFTscreen.text("Message deleted", 0, 100);
sendtoScreen = false;
delay(2000);
clearTftScreen();
}


} // End loop bracket

void setColor1(int red1, int green1, int blue1)
{
#ifdef COMMON_ANODE
red1 = 255 - red1;
green1 = 255 - green1;
blue1 = 255 - blue1;
#endif
analogWrite(redPin1, red1);
analogWrite(greenPin1, green1);
analogWrite(bluePin1, blue1);
}

void setColor2(int red2, int green2, int blue2)
{
#ifdef COMMON_ANODE2
red2 = 255 - red2;
green2 = 255 - green2;
blue2 = 255 - blue2;
#endif
analogWrite(redPin2, red2);
analogWrite(greenPin2, green2);
analogWrite(bluePin2, blue2);
}

void clearTftScreen() {
setColor1(0, 0, 255); // blue
TFTscreen.background(0, 0, 0);
TFTscreen.setTextSize(2);
TFTscreen.text("Waiting for", 0, 0);
TFTscreen.text("messages...", 0, 40);
}

/*
Read input serial
*/
int readSerial(char result[])
{
int i = 0;
while(1)
{
while (Serial.available() > 0)
{
char inChar = Serial.read();
if (inChar == '\n')
{
result[i] = '\0';
Serial.flush();
return 0;
}
if(inChar!='\r')
{
result[i] = inChar;
i++;
}
}
}
}


Hierbij de complete code

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Touchscreen met gsm shield gebruiken

Berichtdoor nicoverduin » 25 Mei 2016, 20:23

Dit gaat volgens mij niet lekker.
cpp code
while (c = sms.read()) {

In deze combi statement gebeuren er 2 dingen:
a) Je leest de sms. Die geeft een code terug als er char is of -1 als er niets is.
b) Je krijgt een int terug en dat zou voor -1 0xFFFF zijn als er dus geen teken is. Daar je hem in een char zet zou daar dus 255 of 0xFF staan.

Daarna blijf de volgende code tussen de accolades uitvoeren zolang c ongelijk is als 0. Dit omdat in de de compiler false als 0 wordt geinterpreteerd en true als ongelijk 0. En dat zou je dus ook hebben als er geen teken is.
Echter in het voorbeeld in de reference (wat nog niet zegt dat het juist is) staat een groot deel van jouw code en dat maakt het verwarrend.

Dan heb je nog de situatie dat je de sms flushed (bij een #). Als ik de documentatie moet geloven heeft flush() alleen effect bij het leegmaken van de zend buffer en hier hebben wij het over de ontvangstbuffer. Dus dat is wel vreemd.

Ik zou een aantal Serial.prints opnemen waarbij:
a) een regel de lengte van message end de message zelf wordt geprint voordat je er verder iets mee doet.
cpp code
Serial.print("Message : ");
Serial.print(message);
Serial.print(" lengte : ");
Serial.println(strlen(message));


Als de lengte korter is dan die 75 tekens, is het gemakkelijk op te lossen. Als er '\0' tekens tussen staan merken we dat gauw genoeg en moeten er iets tussenin verzonnen worden.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Vorige

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten