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.
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...
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.