Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Prenos dat mezi 2 PC po seriove lince

Dobrý den,

Vyřešil jsem ovládání pomocí LPT (výstupy ovládají kolejiště, tedy výhybky, návěstidla, závory). Vyřešil jsem i příjem pomocí GAMEportu (počítač indikuje obsazení a uvolnění koleje vlakem) a ted me ješte napadlo vyřešit komunikaci mezi 2 počítači po seriové lince.

Takže problém je následující.

Jsou 2 počítače propojene klasickým COM kabelem (9 pin CANNON) a potřebuji pomoci sestavit program, který bude schopen posílat libovolně dlouhé zprávy z jednoho počítače do druhého a naopak. Vlastne vznikne jednoduchy chat. K programování používám dnes netradiční jazyk Visual Basic 6.0, rozhraní WinAPI a případně i potřebné knihovny, které se dají stáhnout (RSCOM.DLL).

Zdrojový kod na inicializaci COM portu použil jsem tento:
Declare Function OPENCOM Lib "RSCOM" (ByVal OpenString$) As Integer

Declare Sub TIMEOUTS Lib "RSCOM" (ByVal b%)

Declare Sub BUFFERSIZE Lib "RSCOM" (ByVal b%)

Declare Sub CLOSECOM Lib "RSCOM" ()

Declare Sub SENDBYTE Lib "RSCOM" (ByVal Dat%)

Declare Function READBYTE Lib "RSCOM" () As Integer

Declare Sub SENDSTRING Lib "RSCOM" (ByVal Dat$)

Declare Function READSTRING Lib "RSCOM" () As String

Declare Sub CLEARBUFFER Lib "RSCOM" ()

Declare Function INBUFFER Lib "RSCOM" () As Integer

Declare Function OUTBUFFER Lib "RSCOM" () As Integer

Declare Sub DTR Lib "RSCOM" (ByVal b%)

Declare Sub RTS Lib "RSCOM" (ByVal b%)

Declare Sub TXD Lib "RSCOM" (ByVal b%)

Declare Function CTS Lib "RSCOM" () As Integer

Declare Function DSR Lib "RSCOM" () As Integer

Declare Function RI Lib "RSCOM" () As Integer

Declare Function DCD Lib "RSCOM" () As Integer

Declare Function INPUTS Lib "RSCOM" () As Integer

Declare Sub TIMEINIT Lib "RSCOM" ()

Declare Function TIMEREAD Lib "RSCOM" () As Double

Declare Sub DELAY Lib "RSCOM" (ByVal ms As Double)

Declare Sub REALTIME Lib "RSCOM" ()

Declare Sub NORMALTIME Lib "RSCOM" ()

rem otevreni portu

Private Sub Form_Load()

i = OPENCOM("COM1,1200,N,8,1")

If i = 0 Then

i = OPENCOM("COM2,1200,N,8,1")

ElseIf i = 0 Then

i = OPENCOM("COM3,1200,N,8,1")

End If

If i = 0 Then MsgBox ("Chyba při pokusu otevřít port")

End Sub

tyto kody mám z ruzných internetových zdrojů, tento funguje bez závad. Jenže nastal pro mě ohromný problém, nikde jsem nenašel příkazy které by mi prozradily že právě ony posílají data po serii. Analogický příklad (OUT COM1,DATA) a zároven jak hlídat druhy port a zjistit zda nepřišly nejaká data. Opět příklad prijate = INP (COM1).

Pokud stím někdo má zkušenost a je se ochoten se mnou o to podělit, předem děkuji za pomoc.

Závěrem dodávám že nečekám až to někdo vyřeší za mě, ale stále hledám na internetu postupy.

Příjemný den.

Předmět Autor Datum
Pod win s COM portom pracujes jak so suborom. Otvoris, citas a zapisujes. Z toho otvoreneho handle.…
MM.. 30.08.2013 17:11
MM..
Pokud pracuji jako se souborem, tak používám příkaz: Open "disk:\cesta\soubor.xxx" for output as #1…
Peršink163054 30.08.2013 17:28
Peršink163054
keby si pracoval s WinAPI tak by si videl ze to je stejne. Ked ty pouzivas nejake visualbasic nadsta…
MM.. 30.08.2013 17:36
MM..
Mas ich tam predsa aj zadeklarovane v tom tvojom programe Declare Sub SENDBYTE Lib "RSCOM" (ByVal D…
MM.. 30.08.2013 17:41
MM..
Tak za odkaz děkuji, protože zdá se že to je to co jsem hledal. Ted jen čekám až přijde druhý kolega…
Peršink163054 30.08.2013 17:52
Peršink163054
Netuším prečo takto "kostrbate" a nemotorne to riešiš, ale ak sa nemýlim, tak VB6 je: Object-based a…
pme 30.08.2013 17:49
pme
Visual Basic 6.0 je objektově orientovaný jazyk, jenže moje verze jaksi nemá komponentu pro COM, LPT…
Peršink163054 30.08.2013 17:55
Peršink163054
Nepotrebujes na vsetko komponenty. Skutocne programovanie neni len lepenie nejakych hotovych kompone… poslední
MM.. 30.08.2013 18:06
MM..

Pod win s COM portom pracujes jak so suborom. Otvoris, citas a zapisujes. Z toho otvoreneho handle.
Predtym musis nastavit parametre, okrem baudrate a datovegho formatu aj ci sa ma pouzivat handshaking a jaky.

A dve PC sa prepajaju ne klasickym kablom ale nullmodem kablom. Vpodstate stacia 3 draty (Rx, Tx, zem) pricom Rx a Tx sa krizia. Pre taky kabel musis nastavit handshaking na ziaden.

Pokud pracuji jako se souborem, tak používám příkaz:
Open "disk:\cesta\soubor.xxx" for output as #1

potom uložím data (větu)
print #1,"věta"

a nakonec
Close #1

jenže u příkazu

i = OPENCOM("COM1,1200,N,8,1")

kterým otevírám port nevidím kanal (#x)

nebo se to řeší příkazem
print #i,"veta" tj. cislo kanalu za křížkem je shodné jako proměnná i u příkazu který otevírá com?

Omlouvám se jsou to začátecnické kroky.

Jinak kabel donedávna sloužil u kamaráda a přenášel data po serii (M602), takže jsem sice napsal klasický ale byl tím myšlen tebou zminovaný nullmodem kabel.

keby si pracoval s WinAPI tak by si videl ze to je stejne. Ked ty pouzivas nejake visualbasic nadstavby (alebo kniznice) a ne WinAPI, v tvojom pripade asi RSCOM alebo co to tam pouzivas, tak si musis o nich nieco precitat (www.google.com a zadaj si tam RSCOM visualbasic) aby si vedel co ten tvorca toho RSCOMu pre teba pripravil a jak sa to pouziva.

nejaky priklad asi tuto, predpokladam ze to je to co pouzivas
http://www.elektronik-labor.de/RS232/RS232_3_8.htm

Mas ich tam predsa aj zadeklarovane v tom tvojom programe

Declare Sub SENDBYTE Lib "RSCOM" (ByVal Dat%)
Declare Function READBYTE Lib "RSCOM" () As Integer

Declare Sub SENDSTRING Lib "RSCOM" (ByVal Dat$)
Declare Function READSTRING Lib "RSCOM" () As String

Declare Sub CLEARBUFFER Lib "RSCOM" ()
Declare Function INBUFFER Lib "RSCOM" () As Integer
Declare Function OUTBUFFER Lib "RSCOM" () As Integer

su to anglicke slova a su uplne jasne.
posledne dve zrejme nastavuju velkost bufferu pre prijmanie a posielanie, volas to raz po otvoreni portu. Je to vidiet aj v tom priklade co som dal vyssie. //edit: kecam, BUFFERSIZE nastavuje velkost bufferu, tie INBUFFER a OUTBUFFER vracaju nejaku velkost asi kolko je aktualne v buffri znakov, najdi si to googlom konkretne zadas si tam RSCOM INBUFFER a citas si.

Tak za odkaz děkuji, protože zdá se že to je to co jsem hledal. Ted jen čekám až přijde druhý kolega a dáme se do testování v praxi.

Já jsem zkoušel mnoho slov a vet do googlu, ovšem chyba u mě jak ted vidim, protože v českém jazyce (ekvivalenty nadpisu). Přiznávám RSCOM.DLL do googlu jsem nedával, odted mám zkušenost.

Nadeklarované příkazy tam mám, jen jsem nevěděl jak jich použít.

Ještě jednou díky a ted už jen čekám na kolegu a přejdeme z teoretické do praktické části.

Netuším prečo takto "kostrbate" a nemotorne to riešiš, ale ak sa nemýlim, tak VB6 je: Object-based and Event-driven jazyk.
Proste treba použiť objekt a reagovať na udalosti...

Závěrem dodávám že nečekám až to někdo vyřeší za mě, ale stále hledám na internetu postupy.

takže študuj: www.control.com

Visual Basic 6.0 je objektově orientovaný jazyk, jenže moje verze jaksi nemá komponentu pro COM, LPT, GAME. Proto musím použít knihovny nebo jiný způsob.

Na odkaz mrknu, hledám to už celý týden, ale po tom týdnu jsem si řekl že zkusím požádat o pomoc. Ono těch odkazů je skutečně moc a zase nemůžu sedět u počítače od rána do večera

Nepotrebujes na vsetko komponenty. Skutocne programovanie neni len lepenie nejakych hotovych komponent, na event handling a priame pouzitie WinAPI apod nepotrebujes ziadne komponenty. Oni tie komponenty tiez nepadaju z neba ale niekto to naprogramoval, ty si mozes naprogramovat to same, a trebars trochu inac (presne tak jak to potrebujes), potom nie si obmedzeny komponentou a nemusis hladat popis tej komponenty (v tomto pripade tej dll). Navyse komponenty mozu byt aj chybne ptz nevies kto to programoval a nevies ci to nebol nejaka truba.

Zpět do poradny Odpovědět na původní otázku Nahoru