Avatar billede kjeldsted Novice
28. september 2011 - 16:33 Der er 14 kommentarer og
1 løsning

Compare enkelt byte i char streng.

Hejsa derude.

Jeg sidder og er i gang med at programmere et lille program der via en mindre computer enhed (MS-DOS) skal kunne styre en monitorvæg, bestående af 5 skærme, via et RS-232 signal.

Pt. har jeg fået computeren til at sende komandoer til skærmen, som den også reagere på. Problemet er  nu at jeg også gerne skulle kunne hente nogle data fra skærmene. Dette skal gøre ved at sende en besked som skærmen så skal svare på. At sende beskeden er ikke rigtig noget problem. Og så vidt jeg kan teste mig frem til får jeg også et svar igen.

Svaret jeg modtager skulle gerne være noget tæt på: (ASCII)
[code]SOH - 0 - 0 - A - B - 1 - 2 - STX - 0 - 2 - 0 - 0 - D - 6 - 0 - 0 - 0 - 0 - 0 - 4 - 0 - 0 - 0 - 1 - EXT - BCC* - CR[/code]
BCC = Check Code til kontrol at pakken ikke er korrupt.

Hvis jeg da ellers har fået tastet korrekt er det i strengen her over er det byte 24 (Der herover gerne skulle være '1') som jeg har interesse i. Hvis denne byte er '1' er skærmen tændt, er denne byte '4' er skærmen slukket.

Koden til programmet kan ses her: http://pastebin.com/TKMc2g9g

Det er på linje 159 jeg modtager data fra skærmen.

Håber der er nogle har har en idé til hvordan jeg får tjekket denne ene byte.

Ps. alle forslag der involvere vectorere kan desværre ikke benyttes. Er tvunget til at compile i Turbo c++.

På forhånd tak.
Avatar billede kjeldsted Novice
28. september 2011 - 16:35 #1
Og tak til Eksperten for at fjerne noget af teksten.

[code]SOH - 0 - 0 - A - B - 1 - 2 - STX - 0 - 2 - 0 - 0 - D - 6 - 0 - 0 - 0 - 0
- 0 - 4 - 0 - 0 - 0 - 1 - EXT - BCC* - CR[/code]
Avatar billede hansepeter2 Nybegynder
28. september 2011 - 16:55 #2
Er det ikke bare at lave en if-sætning på cData[23] ...
Avatar billede kjeldsted Novice
28. september 2011 - 17:51 #3
Hm. Nu er jeg så taget hjem fra arbejde, og kan ikke lige huske 100% hvad det var den brokkede sig over da den skulle compiles. Men jeg har forsøgt mig (på linje 163; Udkommenteret), hvor jeg fik svar fra compiler om at den ikke kunne konvertere mellem et eller andet og noget andet. Så desværre ikke så simpelt nej :(
Avatar billede hansepeter2 Nybegynder
28. september 2011 - 18:10 #4
Det kan jeg godt se. cData er jo ikke et array, men bare et char. Jeg troede lige, den var som outBuf.

Enten skal du i din while løbende smide cData ind i et array, så du kan kontrollere bagefter, eller også tælle til 24 i din while og tjekke cData der.
Avatar billede kjeldsted Novice
28. september 2011 - 18:17 #5
Men cData bliver jo hentet på én gang på linje 159 (cData=ReadCom1();). Så kan jo heller ikke smide det ind løbende. Indholdet af cData kommer fra en RS-232 port.
Avatar billede hansepeter2 Nybegynder
28. september 2011 - 18:51 #6
Din while henter jo kun én byte ad gangen. Den løber indtil afsenderen ikke har mere data, formoder jeg. Jeg tænkte noget i denne stil...

char result[100];
int len = 0;

while(...){
  ...
  result[len++] = cData;
}

så kan du slå op i result, når du har modtaget alle data. Eller evt i while udføre noget, når len==23
Avatar billede kjeldsted Novice
28. september 2011 - 19:27 #7
Nop.

While løkken er til fordi jeg ikke kan vide præcis hvornår jeg får svar på forespørgslen. Hvis vi kigger på den while løkke:
    while(!iQuit)
    {
        cData=ReadCom1();
        if(cData!=NULL) iQuit=1;
    }

Kan du se at det eneste den gør er at loope indtil cData har fået tilføjet en værdi af ReadCom1().

Dataen bliver gemt i en buffer i computerenheden, hvor jeg hiver den ud med ReadCom1(). Så dén vil heller ikke gå.
Avatar billede hansepeter2 Nybegynder
28. september 2011 - 20:05 #8
Så er vi ude i en while i en while?

Har du styr på, hvordan afsenderen markerer, at nu kommer der ikke mere data?
Avatar billede kjeldsted Novice
28. september 2011 - 20:12 #9
Problemet er jo at den sender det hele på én gang. Jeg kan ikke få den til at hente det byte for byte. Når computeren begynder at modtage en besked begynder den at gemme denne besked i bufferen. Når så beskeden er færdig kan jeg hente meddelelsen frem med ReadCom1(). Computeren sender ikke noget ud før den har en færdig besked. Så jeg kan ikke hente beskeden byte for byte. Jeg får en hel meddelelse som jeg kan gemme i cData.

Jeg er nødt til at finde på en måde til at tjekke den 24. byte i cData.
Avatar billede kjeldsted Novice
28. september 2011 - 20:21 #10
Og svar på anden del af #8:

Ja. Pakken begynder med en SOH (0x02) og slutter med en CR (0x0D).
Avatar billede hansepeter2 Nybegynder
28. september 2011 - 23:23 #11
Altså, du skal jo have fat i samtlige af de bytes, som bliver afsendt fra den anden side.

Umiddelbart, nu har jeg ikke set dokumentationen, så vil ReadCom1() returnere en byte, når den ankommer på rs232-porten. Om det så sker live, eller dataene bliver indlæst fra rs3232-driverens lokale cache, det er ikke så relevant lige her.

Hvis det er sandt, så skal ReadCom1() kaldes ligeså mange gange, som der er sendt bytes af sted fra afsenderen.

Okay, nu har lige lige fundet noget dokumentation...

http://ftp.icpdas.com/pub/cd/8000cd/napdos/7188xabc/7188xc/document/7188xc_manual_english.pdf


while(!quit){
  if(IsCom1()){ /*check if any data is in the COM1 input buffer*/
    data=ReadCom1(); /*read data from COM1*/
    ...
  }
}


Den while skal således køres indtil du modtager 0x0D
Avatar billede kjeldsted Novice
28. september 2011 - 23:27 #12
Må jeg jo prøve i morgen så.
Avatar billede kjeldsted Novice
29. september 2011 - 21:47 #13
Hm. Det tyder på at det (delvist er korrekt). Jeg får da nu læst data fra skærmen. Men dog kun hver anden byte i forhold til de oplysningen jeg har fra producenten af skærmen. Men hvad det skyldes må jeg jo lidt prøve at finde ud af.
Avatar billede kjeldsted Novice
29. september 2011 - 21:47 #14
Jo. Glemte lige en ting.

Smid et svar!!!!

:)
Avatar billede kjeldsted Novice
29. oktober 2011 - 08:32 #15
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester