Ik ben momenteel bezig met een stukje hardware (uitgerust met een PIC18F8621) dat moet kunnen praten met een touchscreen middels RS-485. Om dat mogelijk te maken kan ik bepaalde commando's naar het touchscreen sturen, die iets wegschrijven naar diens geheugen, danwel iets uitlezen uit dat geheugen.
De commando's volgen ruwweg deze indeling: ze beginnen met 0x05, een enquiry-byte dus, gevolgd door twee bytes die aangeven op welk venster de wijziging van toepassing is. Daarna komt er een escape-byte, gevolgd door een 'R' voor een leesactie of een 'W' voor een schrijfactie. De volgende 12 bytes geven in groepen van 4 respectievelijk een adres, het aantal bytes dat gelezen/weggeschreven moet worden en, in het geval van een schrijfactie, een waarde aan in stringrepresentatie. De string wordt afgesloten door een carriage return en een linefeed. Als ik dus naar adres 103 de waarde 2 wil wegschrijven, dan ziet de string in kwestie er zo uit:
\x005FF\x01bW010300010002\r\n
So far, so good, die waarde kan ik doorsturen en die komt ook goed aan. Nu komt echter het probleem: ik wil een waarde die ik uitlees uit een ADC omzetten naar een percentage, en dit opslaan in het geheugen van het touchscreen. Dit mag echter blijkbaar niet. Ik heb het probleem weten terug te brengen tot een simpele vorm:
Wanneer ik regel 3 weglaat, dan wordt de string die ik aangeef netjes verstuurd zoals gevraagd. Als ik regel 3 echter wel toevoeg, dan verwacht ik dat de byte vóór de \r in een 1 verandert. Dit gebeurt dus niet; de string die doorgestuurd wordt is exact dezelfde die ik in het begin definiëer. De volgende manieren gaan (logischerwijs) ook niet:
Waar en waarom het fout gaat weet ik niet; debuggen is een ramp in de MPLAB IDE die Microchip levert. Ik hoop dat iemand hier er ervaring mee heeft.
De commando's volgen ruwweg deze indeling: ze beginnen met 0x05, een enquiry-byte dus, gevolgd door twee bytes die aangeven op welk venster de wijziging van toepassing is. Daarna komt er een escape-byte, gevolgd door een 'R' voor een leesactie of een 'W' voor een schrijfactie. De volgende 12 bytes geven in groepen van 4 respectievelijk een adres, het aantal bytes dat gelezen/weggeschreven moet worden en, in het geval van een schrijfactie, een waarde aan in stringrepresentatie. De string wordt afgesloten door een carriage return en een linefeed. Als ik dus naar adres 103 de waarde 2 wil wegschrijven, dan ziet de string in kwestie er zo uit:
\x005FF\x01bW010300010002\r\n
So far, so good, die waarde kan ik doorsturen en die komt ook goed aan. Nu komt echter het probleem: ik wil een waarde die ik uitlees uit een ADC omzetten naar een percentage, en dit opslaan in het geheugen van het touchscreen. Dit mag echter blijkbaar niet. Ik heb het probleem weten terug te brengen tot een simpele vorm:
C:
1
2
3
4
5
| char* send = "\x005FF\x01bW010300010000\r\n"; send[16] = '1'; writeRS485(send); |
Wanneer ik regel 3 weglaat, dan wordt de string die ik aangeef netjes verstuurd zoals gevraagd. Als ik regel 3 echter wel toevoeg, dan verwacht ik dat de byte vóór de \r in een 1 verandert. Dit gebeurt dus niet; de string die doorgestuurd wordt is exact dezelfde die ik in het begin definiëer. De volgende manieren gaan (logischerwijs) ook niet:
C:
1
2
3
| send[16] = 0x31; //of *(send + 16) = '1'; |
Waar en waarom het fout gaat weet ik niet; debuggen is een ramp in de MPLAB IDE die Microchip levert. Ik hoop dat iemand hier er ervaring mee heeft.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.