webForumDet fria alternativet

Program för att skicka RS232

86 svar · 5 287 visningar · startad av Gildebrand · sida 3 av 5

nitro2k01Medlem sedan aug. 20039 342 inlägg
#41

Gildebrand skrev:

och när duken och gardinerna åkt ner så vill jag att den ska sluta skicka kommando för dukner, så därav sleep. Sleeptiden är alltså tiden det tar för duken att åka ner.

Den tanke som direkt slår mig är, vad händer om stopp-kommandot inte skickas? Fortsätter motorn att gå så att duken riskerar slitas sönder/rullas in baklänges? Sänder RS232-enheten på andra sidan tillbaka någon status? Isf, lyssna efter denna istället för att försöka tajma med sleep-kommandon.
(Det eventuella) problemet är att en dator inte alltid nödvändigtvis är helt perfekt, och tiden kan diffa ett par tiondelar av en sekund. Efter många ner och upp-rullningar kan duken komma lite ur fas. (För långt upp eller ner)

För övrigt, en annan liten detalj, du kanske borde ha en factory-metod för serieports-objektet så du slipper ändra på flera ställen om du t ex skulle byta port. Det låter trivialt, men det är lätt hänt att man glömmer att ändra något på ett ställe och undrar varför inte just den funktionen funkar. (Vet jag av egen erfarenhet)

SerialPort portFactory(){
    return new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
}
nitro2k01Medlem sedan aug. 20039 342 inlägg
#42

Gildebrand skrev:

Provade det, men det gjorde ingen skillnad.

Prova att köra port.close(), sedan port.dispose() innan sleep, och sedan skapa en nytt port-objekt efteråt.

LaspMedlem sedan juli 200012 980 inlägg
#43

Det finns sniffers. Dvs. man kan koppla in en enhet (kan vara en annan pc) med hjälp av ett kabelset och "se" vilka signaler som går fram . Normalt svara en serie enhet med ett kommando när uppdraget är slutfört!
Vad har du för specifikationer!

GildebrandMedlem sedan juni 2009920 inlägg
#44

Ingen skillnad :(
Det finns ingen möjlighet att skicka tillbaka kommandon när dukarna och gardinerna är nervevade. Däremot har de inbyggda säkerhetsfunktioner för att förhindra att de körs för långt

GildebrandMedlem sedan juni 2009920 inlägg
#45

Lasp skrev:

Det finns sniffers. Dvs. man kan koppla in en enhet (kan vara en annan pc) med hjälp av ett kabelset och "se" vilka signaler som går fram . Normalt svara en serie enhet med ett kommando när uppdraget är slutfört!
Vad har du för specifikationer!

Dukarna och Gardinerna är inte RS232 styrda. Det är däremot reläkortet som jag styr de med. Men det har ingen aning om vilken position gardinerna och duken befinner sig i.

LaspMedlem sedan juli 200012 980 inlägg
#46

Vad jag kommer ihåg har du inte angett det tidigare att det är ett reläkort du styr.
Men då kan man säkert sätta dit sensorer i ytterlägen som indikerar stopp.
Men det är svårt att ge råd när man inte har hela bilden klar för sig.

GildebrandMedlem sedan juni 2009920 inlägg
#47

Jag förstår inte vad jag har gjort fel. Måste jag lägga in något med threading i designen också så att den kan köra kodraden nedan parallellt?

        myCom.Hello();
        myCom.World();
nitro2k01Medlem sedan aug. 20039 342 inlägg
#48

Gildebrand skrev:

Jag förstår inte vad jag har gjort fel. Måste jag lägga in något med threading i designen också så att den kan köra kodraden nedan parallellt?

        myCom.Hello();
        myCom.World();

Kör du koden på det viset så kommer den inte köras trådat, så då är det inte så konstigt att world hamnar sist. Jag antog att du körde något i stil med inlägget ovan, med ThreadStart och Thread. Om du gör det och dessutom stänger porten så ärmärkligt om du fortfarande får samma fel.
Isf, pröva att skriva ut strängarna med Console.Write precis efter varje port.Write för att se om det är trådningen eller serieporten som strular.

PS: Du kan redigera inlägg om du skriver fel ;)

GildebrandMedlem sedan juni 2009920 inlägg
#49

Vad döper jag threadsen till då? Ska de heta myCom.Hello och myCom.World?

Redigerade men vart nått problem med linan och refreshade så måste vart dubbelpost.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#50

När du anropar myCom.Hello() så anropar du funktionen direkt. Då blockeras körningen till funktionen är klar. (Som "vanligt")
När du däremot anropar new ThreadStart(Hello) så skickar du med en referens som pekar mot funktionen Hello. Det du får tillbaka är en så kallad delegate, som du skickar vidare till anropet new Thread(tsHello) som skapar en ny tråd utifrån funktionsreferensen. Först när du anropar tHello.Start() så körs Hello i en egen tråd, och kommandot efter tHello.Start() (Det som körs i den ursprungliga Main-tråden) kan köras direkt efteråt, då Hello körs i en egen tråd.
Join-kommandona gör att Main-tråden väntar på de andra trådarna innan den avslutas.

        public void Main(string[] args)
        {
            ThreadStart tsHello = new ThreadStart(Hello);
            ThreadStart tsWorld = new ThreadStart(World);

            Thread tHello = new Thread(tsHello);
            Thread tWorld = new Thread(tsWorld);

            tHello.Start();
            tWorld.Start();

            // Quite important. You won't get at all the behaviour you'd
            // expect if you don't do this. See MSDN for details.
            tHello.Join();
            tWorld.Join();
        }
GildebrandMedlem sedan juni 2009920 inlägg
#51

"The name Hello does not exist in the current context"
Samma sak för World också.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#52

Jag försöker googla mig fram till svaren, eftersom jag egentligen inte kan .net. Men pröva new ThreadStart(myCom.Hello) eller new ThreadStart(this.Hello)

GildebrandMedlem sedan juni 2009920 inlägg
#53

Ingetdera funkade :@

Bifogar projektet så kan den som känner för det kolla på det. Har säkert missat något eftersom jag inte lagt upp hela koderna till allt.

GildebrandMedlem sedan juni 2009920 inlägg
#54

Jag tänkte undersöka vart felet ligger, så jag funderar på om det går att göra en textruta i WinForms som jag skickar text till. Så jag byter ut com-koden till text i en textruta. Nån idé om hur man gör det?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#55

Ungefär så här: Skapa en ny textbox. Placera ut detta på lämpliga platser:

textBox1.Text = textBox1.Text + "Hello";

(textBox1 byter du ut mot det namnet som textboxen har, jag vet inte hur VS döper textboxar per default)

GildebrandMedlem sedan juni 2009920 inlägg
#56

Den hittar inte textbox1 när jag lägger in den i com.cs, så verkar vara lite kass kommunikation mellan form1.cs och com.cs. Hur får jag com.cs att hitta textbox1?

headbugMedlem sedan sep. 2006867 inlägg
#57

Det är för att din com.cs är bara en skiss över hur ditt com-objekt ska se ut och det blir att hoppa i galen tunna att skriva till textboxar därifrån.

Det man i normala fall gör är att exponera dina variabler som du har skissat upp inne i com.cs med så kallade properties, genom att använda get och set och när du sedan väljer att skapa din com() så kan du sedan plocka ut värdena i dina properties.

till exempel så kan du i com.cs vilja ha läsa av variabeln _baudrate (bara ett exempel:) ). Då skapar vi en public propety:


#region ::: MEMBER VARIABLES :::
int _baudrate = 9600;
#endregion

#region ::: PUBLIC PROPERTIES :::
public int baudrate
{
 get {return _baudrate;}
 set {_baudrate = [I]value[/I]; }
}
#endregion

Variablen value är en skyddad specialvariabel, det ska stå så.

Sen kan man tänka sig att du bara vill se det här när du debuggar, det kanske inte är så viktigt sen när du släpper din skarpa verision, då kan du istället välja att använda dig av exempelvis console och skriva ut värden där. Det gör man genom att skriva

Debug.Write("någon sträng här");
GildebrandMedlem sedan juni 2009920 inlägg
#58

Hmm, hittade timer-funktionen. Det måste väl gå att använda sig utav den på något sätt stället för att krångla till det med trådar.

tänkte något i stil med

timer1.start();
timer1. (nånting med tick så att den fortsätter när timern löpt ut)

EDIT: Kom på att jag måste köra trådar andå, men det funkar förhoppningsvis bättre med timer än sleep

GildebrandMedlem sedan juni 2009920 inlägg
#59

Nu har jag fått det mesta att funka, men undrade en liten sak. Hur plockar jag ut värdet från en trackbar?

Provade att lägga in

dB1.Text = "dB" + trackBar1.Value;

under trackbar1_scroll men funkade inte.

GildebrandMedlem sedan juni 2009920 inlägg
#60

Jag provade även att köra som en string men det hjälpte inte.

skrev det såhär nu, men när jag drar i trackbaren så händer ingenting.

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            int Mic1 = trackBar1.Value;
            string Mic1Value = Mic1.ToString();
            dB1.Text = (Mic1Value) + ("dB");
        }
135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)