logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Delphi] [Delphi]: Jak wysłać nową linię na rs232 do uC AVR przez ComPORT?

xPatryk 09 Sie 2005 19:07 3589 8
REKLAMA
  • #1 1720362
    xPatryk
    Poziom 15  
    Posty: 208
    Ocena: 7
    Witam,

    ze specyfikacji comport'u wynika, iż aby uzyskać nową linię, należy dodać do wysyłanego ciągu wartość hex "#13#10" i o ile na terminalu wygląda to poprawnie, to przy urządzeniach opartych o uC AVR nie działa (tzn urządzenie pracuje poprawnie przy przekazywaniu poleceń z terminala a przy ComPort'cie głupieje... Oczywiście prędkość i parametry transmisji ustawione są poprawnie

    Pozdrawiam i proszę o pomoc - jak wysłać nową linię?

    Patryk
  • REKLAMA
  • #2 1721204
    Piroman1024
    Poziom 17  
    Posty: 171
    Pomógł: 18
    Ocena: 17
    W ustawieniach ComPORT-u masz właściwość czy przy wysyłaniu ma dodawać znak końca lini(#13#10) czy nie.
    Byc może masz to ustawione i sam dodatkowo jeszcze dopisujesz to na końcu lini i powstaje dublowanie tego znaku?

    W czym programujesz te AVR-y w bascomie?
    Polecenie bascoma PRINT samo dodaje tą końcówkę i może z tąd wynikać problem.

    Opisz dokładniej problem bo wtej chwili do końca nie wiem w czym on tkwi.
  • #3 1722964
    xPatryk
    Poziom 15  
    Posty: 208
    Ocena: 7
    Witam,
    która opcja odpowiada za wysyłanie nowej lini?
    Raczej nie jest włączona, bo gdy nie dodam #13#10 tekst wysyłany jest w tej samej lini...

    AVR sa pod bascomem, wykorzystuja instrukcje INPUT - zakladam ze np Mamy:

    
    Input A
    If A = 1 Then 
     Print "1 OK"
     Input B
      If B = 2 Then Print "2 OK" 
      Else Print "2 ZLE"
    End If
    


    (ten przykład oczywiscie nie ma nic współnego z projektem nad ktorym pracuje ;p)

    I teraz jezeli z terminala wysle najpierw "1" potem "2" to bede mial 2 OK, jezeli wysle te same liczby z ComPorta, pierwsze bedzie OK, drugie juz nie...

    I nie rozumie dlaczego :(

    Co zrobić?
  • REKLAMA
  • #4 1723009
    Piroman1024
    Poziom 17  
    Posty: 171
    Pomógł: 18
    Ocena: 17
    Instrukcja Bascom-a INPUT a; wymaga aby na końcu wysyłanego ciagu był znak końca lini.
    Spróbuj zrobić tak:

    port1.SendStr('1'+chr(13)+chr(10)); - wysyłanie '1' + koniec lini
    port1.SendStr('2'+chr(13)+chr(10)); - wysyłanie '2' + koniec lini


    port1 - to nazwa jaka ma twój komponent ComPort.

    Napisz jeszcze jak wysyłasz i odbierasz te dane w Delphi.
  • REKLAMA
  • #5 1723866
    xPatryk
    Poziom 15  
    Posty: 208
    Ocena: 7
    Heh, tak jak pisałem, dodałem #13#10 i to nie pomogło... Nadal mam inny znacznik konca niż wymagany...

    Swoją drogą czy +chr(13)+chr(10) to nie jest dokładnie to samo co +#13#10 ?
  • REKLAMA
  • #6 1724293
    Piroman1024
    Poziom 17  
    Posty: 171
    Pomógł: 18
    Ocena: 17
    Naprawde trudno mi tobie odpowiedziec tak z powietrza,tym bardziej że nie mam obecnie zainstalowanego Delphi.
    Możesz zamieścić lub wyłać na PW kawałki kodu żródłowego odpowiedzialne za przesyłanie danych(Bascom i Delphi).
    Ja u siebie juz dawno ten proble rozwiazałem - teraz juz pisze C na AVR bo Bascom jest zbyt wolny i występowały błędy o których Ty mówisz.
    Ja rozwiazałem to monitorując każdy znak przychodzący/wychodzący z/do mikrokontrolera.
    Prześlij te kawałki kodu to coś się wymysli.
  • #7 1729673
    xPatryk
    Poziom 15  
    Posty: 208
    Ocena: 7
    Witam,

    do wysyłania poleceń z pod delphi używam dokładnie tej funkcji, którą przytoczyłeś w poprzednim poście

    (com2.SendStr(command + #13#10);)

    a do odbierania (Bascom) funkcji Input zmienna;

    Myślę, że umieszczenie całego kodu tylko utrudniłoby rozwiązanie problemu, gdyż jest dosyć długi i pokręcony (min. brak komentarzy (jest to część programu sterującego nawadnianiem roślin doniczkowych z dozowaniem nawozu i określaniem ilości wody wypływającej), a przytoczony przezemnie przykład z tą 1 i 2 dobrze odzwierciedla schemat wymiany danych :/
  • #8 1729837
    Piroman1024
    Poziom 17  
    Posty: 171
    Pomógł: 18
    Ocena: 17
    ja też jak pisałem swój pierwszy program do komunikacjo to zaczynałem od przesyłania pojedynczych bajtów.
    Cóż mogę poradzić?
    A próbowałeś nie dodawać na końcu tego znacznika końcu lini - może jest dublowany?
    Spróbij jednak przesłać te kawałki kodu - okrojone jednak ze wszystkich zbednych rzeczy - może coś się wymysli.
  • #9 2134370
    romantv
    Poziom 17  
    Posty: 328
    Pomógł: 11
    Ocena: 8
    Witam Panów
    Czytałem całe zagadnienie, mam chyba podobny problem.
    Napisałem program w VB komunikacja odbywa sie po RS232 do uC Atmega8 Tu natomiast program jest napisany w bascomie.
    I co sie okazuje Program VB prawidłowo wysyła komunikaty jednak zle one są odbierane przez bascoma?? Co jest nie wiem. Wszystko jest ustawione tak jak powinno przesle do analizy wycinek progrmu :
    VB :
    ...
    Private Sub Form_Load()


    MSComm1.CommPort = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.RThreshold = 1
    MSComm1.InputLen = 0


    MSComm1.PortOpen = True

    end sub
    ...
    'W LEWO
    Private Sub Command10_Click()
    If (Form1.Picture11.Visible = False) Then
    MSComm1.Output = "W1" & Chr(13) & Chr(10)
    MSComm1.Output = "W2" & Chr(13) & Chr(10)
    MSComm1.Output = "W4" & Chr(13) & Chr(10)
    ElseIf (Form1.Picture11.Visible = True) Then
    MSComm1.Output = "S0" & Chr(13) & Chr(10)
    End If

    If (Form1.Picture11.Visible = True) Then
    Form1.Picture11.Visible = False
    ElseIf (Form1.Picture11.Visible = False) Then
    Form1.Picture11.Visible = True
    End If
    End Sub

    'PLAY
    Private Sub Command11_Click()
    If (Form1.Picture12.Visible = False) Then
    MSComm1.Output = "S3" & Chr(13)
    ElseIf (Form1.Picture12.Visible = True) Then
    MSComm1.Output = "S0" & Chr(13)
    End If

    If (Form1.Picture12.Visible = True) Then
    Form1.Picture12.Visible = False
    ElseIf (Form1.Picture12.Visible = False) Then
    Form1.Picture12.Visible = True
    End If
    End Sub
    ...
    to jest napisane w VB
    a w bascomie ( odbiór danych)


    $regfile = "m8def.dat"

    $crystal = 8000000 ' Kwarc zewnętrzny8MHz

    $baud = 9600
    'Baud = 9600
    Echo Off

    '******** KONFIGURACJA WYŚWIETLACZA LCD *********************************************************************

    Config Lcd = 16 * 2 ' Deklaracja wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Initlcd ' Inicjalizacja wyświetlacza LCD
    Cls ' Czyszczenie
    Cursor Off
    Cursor Noblink



    '******** KONFIGURACJA MAGISTRALI I2C ***********************************************************************

    Config Sda = Portb.1 ' Sda
    Config Scl = Portb.0 ' Scl

    '******** USTAWIENIA POCZĄTKOWE *****************************************************************************

    'Portd.6 = 1 'S1
    'Portd.7 = 1 'S2


    'Wyzerowanie wyjść expanderów
    I2csend 64 , &B11111111
    I2csend 66 , &B11111111
    I2csend 70 , &B11111111
    I2csend 78 , &B11111111
    I2csend 74 , &B00011111

    '******** DEKLARACJE ZMIENNYCH ******************************************************************************


    Dim I As Byte
    Dim Kod As String * 8


    '******** DEKLARACJE PROCEDUR *******************************************************************************

    'Brak




    '******** PROGRAM GŁÓWNY ************************************************************************************



    Cls
    Lcd "Ok..."
    Wait 2
    Cls


    Locate 1 , 1 : Lcd " Sterownik DVD "
    Locate 2 , 1 : Lcd " RS 232 "
    Wait 2
    Locate 1 , 1 : Lcd " sterownik v1.1 "
    Locate 2 , 1 : Lcd " Wersja testowa "


    Do
    'Locate 1 , 1 : Lcd " sterownik v1.1 "
    'Locate 2 , 1 : Lcd " Wersja testowa "

    If Ischarwaiting() <> 0 Then
    Cls
    Kod = ""
    Input Kod

    Cls
    Locate 1 , 1
    Lcd " KOD STEROWANIA "
    Locate 2 , 1
    Lcd Kod
    ' Wait 2

    'DVD-1

    Select Case Kod

    Case "C1"
    I2csend 64 , &B11111110
    Locate 2 , 1
    Lcd Kod ; " - DVD - 1 "
    Waitms 100
    I2csend 66 , &B11111110
    Locate 2 , 1
    Lcd Kod ; " - REC "
    Waitms 100
    I2csend 64 , &B11111111
    I2csend 66 , &B11111111
    Locate 2 , 1
    Lcd Kod ; " - KASOWANIE "
    'Waitms 200
    'End Select
    ...

    Ciekawe co jest powodem!
    Jeszcze jedno ten problem jest w momęcie kiedy pokolei wysylam informacje lub bardzo szybko naduszam przyciski w programie napisany,które wysyłają komędy.
    proszę o pomoc.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu wysyłania znaków nowej linii (#13#10) przez port szeregowy RS232 z aplikacji Delphi do mikrokontrolera AVR programowanego w Bascomie. Pomimo poprawnego ustawienia parametrów transmisji i dodawania sekwencji końca linii, urządzenie AVR nie interpretuje ich prawidłowo, co powoduje błędy w odbiorze poleceń. Wskazano, że instrukcja INPUT w Bascom wymaga znaku końca linii na końcu przesyłanego ciągu, a funkcja PRINT w Bascomie automatycznie dodaje tę końcówkę, co może powodować podwójne znaki końca linii. Sugerowano monitorowanie przesyłanych znaków oraz przesłanie fragmentów kodu odpowiedzialnych za komunikację w Delphi i Bascomie w celu diagnozy. Przykładowo, w Delphi stosuje się funkcję SendStr z dodaniem chr(13) i chr(10). Poruszono także podobny problem z komunikacją RS232 między programem napisanym w Visual Basic a mikrokontrolerem Atmega8 w Bascomie, gdzie pomimo poprawnych ustawień transmisji dane są źle odbierane. Wskazano na konieczność dokładnej analizy i testów przesyłanych znaków oraz unikanie dublowania znaków końca linii.
Wygenerowane przez model językowy.
REKLAMA