Problem att sända seriellt från VB Express

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Problem att sända seriellt från VB Express

Inlägg av Tottish »

Då har man kört fast igen, då.
Kan börja med att nämna att jag på intet sätt är en erfaren VB-programerare. Det här är första gången jag har med VB.NET att göra genom VisualBasic Express 2008. Har tidigare petat lite med VB6 och jobbat med VBA där jag gjort ett GUI för ett PIC-projekt. Tror inte att det är så många här som kör VB regelbundet men det är säkert någon som kan en del ändå.

Mitt problem består i att jag vill sända RS-232 över en COM-port men lyckas bara delvis.
Kan börja med att visa koden:

Kod: Markera allt

Imports System.IO.Ports

Public Class Form1

    Dim WithEvents com1 As New SerialPort
    Dim data As Double


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Try
            With com1
                .PortName = "Com4"
                .BaudRate = 19200
                .Parity = Parity.None
                .DataBits = 8
                .StopBits = StopBits.One
            End With

            com1.Open()

        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        com1.WriteLine(Chr(TextBox1.Text))

    End Sub


End Class
Koden kommer från VB-Forums och är något avskalad samt redigerad.
Orginalet finns här.http://www.vbforums.com/showthread.php?t=402916 Andra posten, första koden.

Mitt problem är att koden förvisso sänder "Chr(innehåll-i-textrutan)" men den sänder en till byte omedelbart efter den första.
Om det till exempel står 85 i rutan så sänder den, mycket riktigt, först:
[startbit]10101010[slutbit]
MEN omedelbart efter detta så kommer något som ser ut som [00101000] eller något liknande. Denna sekvens är densamma oavsett vilken COM-port jag sänder på och ser, enligt asciitabell.se, ut att vara ett "Device Control 4"-kommando. Tänkte först att det kunde ha att göra med att jag sände på COM4 men så var det alltså inte.

Om det är avgörande så kan jag försöka forska närmare på vad den andra byten är för sekvens men jag tror att ovanstående förslag är korrekt. Kan passa på att nämna att kontrollmetoden jag använder är oscilloskop.

Någon som kan hjälpa mig? Tänk på att jag är novis på det här området.

Om ni anser att denna tråd bör hamna i Mjukvaru-delen så står det naturligtvis mod fritt att flytta den dit. Tänkte att det var större chans att träffa på VB-proggare här eftersom det är ett enkelt lat-mans-medel att slänga ihop ett GUI för oss som hellre lägger programmeringstimmarna på Firmwaren. :D

MVH
/Tottish
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Mitt problem är att koden förvisso sänder "Chr(innehåll-i-textrutan)" men den sänder en till byte omedelbart efter den första.

Exakt som dokumenterat och förväntat :

http://msdn.microsoft.com/en-us/library ... eline.aspx

"Writes the specified string and the NewLine value to the output buffer."

Prova istället :
http://msdn.microsoft.com/en-us/library ... write.aspx
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Inlägg av Tottish »

Perfekt!
Ser bra ut det där. Jag använde fel kommando, helt enkelt.
Får prova imorgon för nu är det nog allt sovdags.
Postar igen om jag stöter på patrull.

Tack Sodjan!

MVH
/Tottish
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Japp, skriver man till en fil däremot så är det ju praktiskt att
få med radslut utan att behöva skicka LF eller CR/LF själv...
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Inlägg av Tottish »

Verkar som att jag behöver lite mer hjälp här. Jag använder samma kod som tidigare men jag har bytt ut WriteLine-kommandot mot enbart Write och nu sänder den, som väntat, bara en byte i taget.

Nu är bekymmret att den inte riktigt vill sända något som är högre än Chr(127). Allt från 1-127 sänderden precis som den ska men 127-255 sänder den som 63. Jag tänker mig att det är inställt någonstans att den bara hanterar 7 bitar och att den rullar över och fastnar på 63 när den åttonde biten blir satt.

Någon teori?

Har kollat på msdn men ärligt talat så förstår jag inte särkilt mycket av det uppslagsverket då min syntax-kunskap inte är tillräcklig i VB.

MVH
/Tottish
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> men 127-255 sänder den som 63.

Alltid 63 ?
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Inlägg av Tottish »

Yes, alltid.
EDIT:
Eller, mnja. Har ju inte provat *alla* värden däremellan men åtminstone på 10-15 olika slumpvalda nummer mellan 127 och 255.
Användarvisningsbild
AndLi
Inlägg: 18312
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Och datatypen är en vanlig 8 bitars och inte någon konstig multibytegrunk för att hantera andra teckenupprättnignar?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, märkligt.
Det är alltså tine bara högsta biten som maskas bort, utan
hela tecknet byts ut mot 63 ("?" för övrigt). Det verkar som om
det är något som inte inte vill "spela".

Om du hårdkodar ett värde write(char(nnn) ?

Varför gör du chr() förresten, är inte TextBox1.Text redan "character" ?
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Inlägg av Tottish »

AndLi: Kan tyvär inte svara på den frågan. Kan bara hänvisa till koden jag postade.

Sodjan:
Korrekt uppfattat, inte bara en maskerad bit.
Har provat att hårdkoda och det blir samma sak oavsett om jag använder t.ex. £-tecknet eller Chr(163) som alltså är samma sak.
Anledningen till att jag måste/vill använda Chr(xxx) är att jag annars måste skriva in ASCII-tecknet för den byte jag vill skicka och nu i debugfasen så tycker jag att det är trevligare att skriva in 0-255 i rutan istället för att skriva in ASCII-tecken.

MVH
/Tottish
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Aha, så du skriver ett numeriskt värde som text i rutan, I see...

Fungerar det om du lägger till en extra textbox och skriver tecknet där ?
Men sådana elementära felsökningar far du säkert redan gjort...
Tottish
Inlägg: 847
Blev medlem: 30 juni 2007, 19:11:37
Ort: Oslo, Norge

Inlägg av Tottish »

Nej, den tanken slog mig inte men nu har jag provat att skriva ut Chr(Textbox1.text) i Textbox2 och det fungerar precis som det ska, både över och under 127.
Det är alltså när det hela ska tryckas ut genom COM-porten som det trilskas.

MVH
/Tottish

Edit:
Kan tillägga att problemet kvarstår även om man använder datorns enda "riktiga" COM-port (COM1). Men det var väl kanske ingen som trodde något annat heller. :D
Senast redigerad av Tottish 9 december 2008, 14:47:18, redigerad totalt 1 gång.
Användarvisningsbild
AndLi
Inlägg: 18312
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

man kan notera att ascii symbol 63 är '?'.

MSDN forum ger lite mer ljus på det jag mena...

Den vet altså inte vad den ska ge 63 för symbol och väljer frågetecken..
Zäta
Inlägg: 181
Blev medlem: 22 september 2006, 08:25:21
Ort: Borlänge

Inlägg av Zäta »

Det står ju uttryckligen på MSDN för funktionen write...

By default, SerialPort uses ASCIIEncoding to encode the characters. ASCIIEncoding encodes all characters greater then 127 as (char)63 or '?'. To support additional characters in that range, set Encoding to UTF8Encoding, UTF32Encoding, or UnicodeEncoding.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Äh, skit också...

Allt finns ju på de länkar som jag hade i första inlägget...

Försök med "char" (eller sannolikt "byte") istället för "String"...
Exakt vad eller vad som ska fixas vet jag inte...
Skriv svar