C# a nezmyselne znaky na vystupe

C,C++,C#

Moderátori: psichac, Moderátori

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 25 Júl 2013, 13:34

Ahojte.
Pozliepal som par riadkov kodu v C# aby som vydoloval poziciu z kontrolera krokoveho motora. Ako to upravit (pripadne opravi kod) aby som dostal konkretnu hodnotu?

Tu je vystup z programu: Obrázok
Manual ku kontroleru krokoveho motora: strana 28 prikaz "POS;" http://driver232.rozek.sk/UIM241.pdf

Kod v C#:

Kód: Vybrať všetko

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            SerialPort sp = new SerialPort();
            sp.PortName = "COM1";
            sp.BaudRate = 9600;
            sp.Open();

            if (sp.IsOpen)
            {
                sp.Write("ENA;");
                Thread.Sleep(1000);

                sp.Write("POS;");
                Thread.Sleep(1000);                    
                string msgPos = sp.ReadExisting();

                Console.WriteLine(msgPos);

                sp.Write("OFF;");
                sp.Close();
                Console.ReadKey();
            }

        }
    }
}
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa dan21 » 25 Júl 2013, 14:52

No podla mna mas nastavenu zlu rychlost na 232. Skus to pozriet a spojazdnit. (str.21)
0

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa Andy99 » 25 Júl 2013, 14:59

Zacal by som asi tym, zeby som sa skusil pripojit priamo na cez terminal, napr. cez https://sites.google.com/site/terminalbpp/. Spravne nastavil komunikacne parametre podla DS. Nasledne mu poslal dane prikazy, pricom sa mi nezda podla DS, zeby mu stacili iba tie, co si tam poslal ty. Ak sa komunikacia podari rozbehat prostrednictvom tohto, potom by som zacal riesit C#.
0

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 25 Júl 2013, 15:13

Motor pocuva moje prikazy, hybe sa na pozadovanu polohu a teda predpokladam ze vsetko mam nastavene dobre. Skor si myslim ze je to zle formatovanie vystupu v C#. V tom sa ale ja nevyznam :(
0
O elektrotechnike nemam sajnu :)

Používateľov profilový obrázok
Andy99
Stály člen
Stály člen
Príspevky: 339
Dátum registrácie: 05 Mar 2008, 00:00
Bydlisko: BA
Vek: 35

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa Andy99 » 25 Júl 2013, 15:17

Samozrejme si to debuguj a pozri sa, co ti vrati

Kód: Vybrať všetko

sp.ReadExisting();
a v akom tvare sa data nachadzaju potom v stringu. Podla toho by si mal vidiet, ci su tie udaje na nieco pouzitelne, ak ano, tak akym sp. .
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa dan21 » 25 Júl 2013, 15:25

predpokladam ze prikazy idu po RS232. Ked hovoris ze motor akceptuje prikazy tak komunikacie je OK. Problem bude mozno v nastaveni Baud rate na tom terminale !! Skus poslat screeshot jeho nastaveni
0

Používateľov profilový obrázok
awen
Power user
Power user
Príspevky: 609
Dátum registrácie: 11 Feb 2009, 00:00
Bydlisko: Bratislava
Vek: 36

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa awen » 25 Júl 2013, 15:28

Tak zacnime s tym, ze namiesto ReadExisting a WriteLine daj tento kus kodu:

Kód: Vybrať všetko

byte[] response = new byte[sp.BytesToRead];
sp.Read(response, 0, response.Length);
for (int i = 0; i < response.Length; i++) Console.Write(response[i].ToString("X2 "));
Console.WriteLine();
0

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 25 Júl 2013, 18:37

Tak to mi vypisalo toto:

X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2
0
O elektrotechnike nemam sajnu :)

Používateľov profilový obrázok
awen
Power user
Power user
Príspevky: 609
Dátum registrácie: 11 Feb 2009, 00:00
Bydlisko: Bratislava
Vek: 36

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa awen » 26 Júl 2013, 10:50

prepac, moja chyba, ta medzera za formatom X2 nesmie byt, prepis to takto:

Kód: Vybrať všetko

Console.Write(response[i].ToString("X2") + " ");
0

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 26 Júl 2013, 11:12

Po oprave:
AA 00 6F 1E 00 00 00 0F 7F 7F 78 18 FF CC 00 B0 0F 7F 7F 78 18 FF
0
O elektrotechnike nemam sajnu :)

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa peterple » 26 Júl 2013, 22:17

pozerám že tie nezmyselné znaky dávajú presný zmysel podľa toho manuálu. Prvých 13 znakov je stav v akom to momentálne je. Potom je 8 znakov ako odpoveď na príkaz POS. Toto je písané o tom na tej strane 28.
0xCC 0 0xB0 P4 P3 P2 P1 P0 0xFF
0xB0 is the Message ID of POS. (Note, when the message header is 0xAA, 0xB0
is the Message ID of MCFG. Refer to section 4.3 for details.)
P4 ~ P0 are message data, can be converted to a 32bits data.
No a teraz konverzia na 32 bit by mohla byť napr. takto:

Kód: Vybrať všetko

            int poloha = 0;
            if (response[15] == 0xB0)
            {
                poloha = response[20];
                poloha |= response[19] << 7;
                poloha |= response[18] << 14;
                poloha |= response[17] << 21;
                poloha |= response[16] << 28;
                Console.WriteLine(poloha);

            }
V tom konkrétnom prípade čo si poslal mi to vyšlo ako -1000.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 27 Júl 2013, 10:32

Za nezmyselne znaky som povazoval tie v okne terminalu v mojej otazke aj ked ani tie v konecnom dosledku neboli nezmyselne :) pre tych co sa v tom vyznaju.
V kazdom pripade uz to dava pozadovanu hdnotu polohy za co vam vsetkym patri veľké ďakujem.
0
O elektrotechnike nemam sajnu :)

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 09 Feb 2014, 23:22

peterple napísal:pozerám že tie nezmyselné znaky dávajú presný zmysel podľa toho manuálu. Prvých 13 znakov je stav v akom to momentálne je. Potom je 8 znakov ako odpoveď na príkaz POS. Toto je písané o tom na tej strane 28.
0xCC 0 0xB0 P4 P3 P2 P1 P0 0xFF
0xB0 is the Message ID of POS. (Note, when the message header is 0xAA, 0xB0
is the Message ID of MCFG. Refer to section 4.3 for details.)
P4 ~ P0 are message data, can be converted to a 32bits data.
No a teraz konverzia na 32 bit by mohla byť napr. takto:

Kód: Vybrať všetko

            int poloha = 0;
            if (response[15] == 0xB0)
            {
                poloha = response[20];
                poloha |= response[19] << 7;
                poloha |= response[18] << 14;
                poloha |= response[17] << 21;
                poloha |= response[16] << 28;
                Console.WriteLine(poloha);

            }
V tom konkrétnom prípade čo si poslal mi to vyšlo ako -1000.
Predsa len by som sa este vratil k mojej otazke.
Program funguje skvelo ale akosi neviem porozumiet tejto casti kodu respektive ako z vystupu dostat cislo
0
O elektrotechnike nemam sajnu :)

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa peterple » 10 Feb 2014, 17:28

skús si to odkrokovať, prípadne použi ešte jednu premennú pre lepšiu názornosť. Dúfam že vieš čo je | a <<.
Pretože tie byte sú v opačnom poradí v tom bytovom poli tak ich rotujem na príslušné miesto a logicky spočítam. Už si nepamätám ten formát ale v každom byte vyzerá že je iba 7 bitov výsledného čísla.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 13 Feb 2014, 00:46

Kód: Vybrať všetko

//poloha = poleHodnot[7]; 
// hex: 18 = bin: 0001 1000 = dec: 24 
poloha |= poleHodnot[6] << 7;
// 78 = 0111 1000 dec:15360+24=15384
//poloha |= poleHodnot[5] << 14;
// 7F = 0111 1111 dec:2080768+15360+24=2096152
//poloha |= poleHodnot[4] << 21;
// 7F = 0111 1111 dec:266338304+2080768+15360+24=268434456
//poloha |= poleHodnot[3] << 28;    
//0F = 1111 //-268435456

return poloha;
//dec: -1000
Moje uvahy:
<<n = posun o n znakov doľava
1111 x111 1111 x111 1111 x111 1000 x001 1000

Skúsil som logické sčítanie
Prvý a druhy riadok:
001 1000
111 1000
-------------
1001 0000 = 144dec a nie 15384


Skúsil som si vypísať iba posledný riadok tam mi vyšlo záporné číslo (vid hore v code) a keď som k nemu prirátal čísla z predchádzajúcich riadkov tak mi vyšla správna poloha. Ale nerozumiem ako dostane z 1111 0000 0000 0000 0000 0000 0000 0000 toto dec-268435456

Pri riešení som sa naučil veľa veci o sústavách (prevody, zápisy....) a preto nechcem cely postup len nejaké nasmerovanie, lebo mam pocit ze sa už točím stále dookola. :rolleyes:
0
O elektrotechnike nemam sajnu :)

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa peterple » 13 Feb 2014, 19:11

v tvojich uvahách sú dve chyby. Zoberme teda tieto dva riadky

Kód: Vybrať všetko

poloha = poleHodnot[7]; 
// hex: 18 = bin: 0001 1000 = dec: 24 
poloha |= poleHodnot[6] << 7;
// 78 = 0111 1000 dec:15360+24=15384
takže treba rotovať druhé číslo o 7 miest vľavo a logicky spočítať s prvým číslom. Aby to bolo celé pekne vidieť tak to budem robiť na 16 bit dlhom čísle. (procesor to robí na int a ten je 32bit, ale tie zbytočné nuly sa mi nechce písať)

0000 0000 0001 1000
0011 1100 0000 0000
0011 1100 0001 1000

červenou farbou vidíš tú pôvodnú časť 0x78
Teraz si sa dopustil druhej chyby. Píšeš síce že urobíš logický súčet ale úrobil si normálny aritmetický. Pri logickom sa nerobí prenos medzi bitmi a 1|1 = 1

teraz si to preveď na desiatkové číslo a myslím si že to bude presne ako ti písal debuger pri krokovaní.
Ak si to chceš vyskúšať otvor si kalkulačku windowsu, prepni ju do programátorského módu a skúšaj, rotáciu vľavo tam máš ako RoL.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

jurkov
Okoloidúci
Okoloidúci
Príspevky: 27
Dátum registrácie: 17 Aug 2011, 00:00

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa jurkov » 15 Feb 2014, 14:55

Podla nových (správnych :)) vedomosti opravujem svoje úvahy do podoby nasledujúcej:

0000 0000 0000 0000 0000 0000 0001 1000 18
0000 0000 0000 0000 0011 1100 0000 0000 78<<7
0000 0000 0001 1111 1100 0000 0000 0000 7F<<14
0000 1111 1110 0000 0000 0000 0000 0000 7F<<21
1111 0000 0000 0000 0000 0000 0000 0000 0F<<28
====================================
1111 1111 1111 1111 1111 1100 0001 1000

Ak použijem programátorskú kalkulačku a prevediem dec -1000 do bin tak mi ukáže horný výsledok
tak isto program mi dá správny výstup.

Postrehy:
ak v programátorskej kalkulačke chcem horný výsledok previesť na dec ukáže mi číslo 4294966296.
a teda premýšľam ako vlastne tú hodnotu ?prevediem? na záporné číslo, kedže príklad s kladným číslom je bez problémov:

00 00 00 0F 4D = 1997

0000 0000 0000 0000 0000 0000 0100 1101
0000 0000 0000 0000 0000 0111 1000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
-------------------------------------------------------
0000 0000 0000 0000 0000 0111 1100 1101=1997
0
O elektrotechnike nemam sajnu :)

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: C# a nezmyselne znaky na vystupe

Príspevok od používateľa peterple » 15 Feb 2014, 15:55

čo sa týka kalkulačky vo win to je ľahké. Nastav su ju na Dword a už to bude fungovať ako potrebuješ. Keby si to chcel pochopiť sám tak sa to volá druhý doplnok a nie je to nič iného než negácia všetkých bitov a potom plus 1.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok