# Programmas / Software >  Delphi7 portu programmēšana

## marizo

Kā izveidot Delphi7 programmu, kas sūta un saņem datus caur COM portu?
Ar ko sākt?
Kādas bibliotēkas lietot?
Kur internetā atrast īsu un konkrētu pamācību, programmu paraugus?

Šeit ir dažas labas lietas uzrakstītas, bet nevienā piemērā nav izmantots 2. (RxD) un 3. (Txd) COM porta kontakts. 
Atceros, kaut kad pasen nedaudz ar TurboPascal7 niekojos, varēju pārslēgt porta 4. un 7. kontaktu, bet 3. laikam ne. Varētu paniekoties ar portu programmēšanu, mēģināt savākt datu bitus no virknes, bet īsti nesaprotu, ar ko sākt.
Šāda varētu būt shēma


(i) pin 1 DCD
(i) pin 2 RxD
(o) pin 3 TxD
(o) pin 4 DTR
(-) pin 5 GND
(i) pin 6 DSR
(o) pin 7 RTS
(i) pin 8 CTS
(i) pin 9 RI

----------


## Vikings

Nu līdz šai vietai shēmā viss izskatās OK.
Par Delphi nemācēšu teikt, bet VB izmantoju MSCOMM moduli, caur kuru var sazināties jau sūtot uz COMu veselas simbolu virknes. Paskaties, droši vien Delphos arī ir kāds modulītis, kas paredzēts komunikācijai ar modemu.

----------


## M_J

Es lietoju šito: http://sourceforge.net/projects/comport/

----------


## marizo

Tātad ir jāizmanto bibliotēka, kas nav kopā ar pašu Delphi? Laikam tas viss nav tik vienkārši, kā biju iedomājies..   ::   ::

----------


## parols

Ambīļi visur nav jāmeklē gatavas bibliotekas un jāsasprauž kopā nesajēdzot kas notiek....
labāk izmantot asm - "maz" komandu,sarežģīts,bet tā vērts
pats izmantoju pascal(borlandd 7.0) ikdienā, olimpiādēs un sacensībās free pascal 2.2.0

----------


## marizo

Nedaudz mēģinu šo to iekš Delphi7 saprogrammēt. Varbūt sāku no nepareizās vietas, bet izmēģinu to, kas šobrīd vairāk interesē un noderētu - datu apmaiņu caur COM portu. Iesākumā jāpapēta jau esošie programmu piemēri, tad domāju pats kaut ko uzveidot. 
Esmu izmēģinājis TMSA32 un cport-3.10 bibliotēkas, kas ļauj piekļūt portam. Pirmā šķiet ir ar vairāk iespējām, bet nevarēju atrast plašāku informāciju par iespējām. No līdzi dotajiem programmu piemēriem neizdevās izlobīt to, ko gribēju uzzināt. Tad mēģināju cport-3.10 bibliotēku. Porta konfigurācija un izmantošana lietotājam draudzīgākā formā. Izmantoju http://www.sixca.com/eng/articles/usb_cdc/index.html doto programmu, kas caur COM portu saņemto 10bitu ACP vērtību pārveido spriegumā un attēlo. Neizmantoju gan lapā attēloto shēmu, bet PIC16F877 un FT232 USB-TTL UART pārveidotāju. Komunikācija strādā, tomēr kaut kas īsti nedarbojas tā, kā gribētos - volti un arī attēlotais stabiņš reizēm (uzkrītoši kaitinoši) mistiski lēkā, rezultāts pat neiekļaujas max 5 voltos. Izmēģinu dažādus datu pārraides ātrumus, laika intervālus starp atkārtotu rezultāta sūtīšanu, ar Realterm programmu pārliecinos, ka no PIC saņemtie dati ir pareizi, tad problēmu varētu taisīt tikai Delphi programma. 



> procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
> var InBuffer:array[0..1] of byte;
>     ADC_Hi,ADC_lo:byte;
>     ADCRes:word;
>     volt:double;
> begin
>         ComPort1.Read(InBuffer,2);
>         ADC_Hi:=InBuffer[0];
>         ADC_Lo:=InBuffer[1];
> ...


 Vienīgais, kas var radīt ACP rezultātu lielāku par 10bit, ir ADC_Hi, tāpēc arī izdomāju ADCRes:=(ADC_Hi shl  ::  or ADC_Lo; aizvietot ar ADCRes:=((ADC_Hi and 3) shl  ::  or ADC_Lo, kas atmestu ADC_Hi 7.-2. bitu. Šī darbība novērsa rezultāta kāpšanu pāri max iespējamai vērtībai, bet stabiņš joprojām lēkā. Sūtu no PICa konstantas vērtības, lieku maskas pie ADC_Hi un ADC_Lo un secinu, ka tie baiti putrojas. Droši vien bibliotēkai nav nekādas vainas, tikai nemāku lietot. Laikam viss nav tik vienkārši - skatos un lasu bibliotēkas help, redzu, ka no porta var nolasīt divos veidos (vienu baitu - Char vai no bufera n baitus), bet kāpēc jālieto viens vai otrs, saprašanas ta' nav. Ir kādas idejas, ko varētu pasākt, lai programma darbotos korekti?

----------


## marizo

Vienā citā programmā noskatīju, ka datus no kontrollera uz datoru sāk sūtīt ar kādu speciālu simbolu, piemēram *. Tad to arī ieliku programmās.



> var InBuffer:array[0..4] of byte;
>     ADC_Hi,ADC_lo:byte;
>     ADCRes:word;
>     volt:double;
> begin
>         ComPort1.Read(InBuffer,5);
>         if ((InBuffer[0]=ord('*'))and (InBuffer[count-2]=ord(#10))and (InBuffer[count-1]=ord(#13))) then
>         begin
>           ADC_Hi:=InBuffer[1];
> ...


 Papildus ieliku beigās arī speciālos simbolus LF (#10) un CR (#13), lai tajā pašā Realterm saņemtie dati izkārtotos pa rindiņām un būtu ērtāk pārskatāmi. Tagad Delphi saņemtajos datos meklē 5 baitu rindu: * ADCHI ADCLO #10 #13. Ja viss saņemts pareizi, tad rēķina spriegumu.
Šī programma beidzot dara to, ko vēlos, bet tā arī nesaprotu, kur radās kļūda. Tā dīvaini sanāk, ka 2 baitus nevar pareizi nolasīt, bet 5 var. Varbūt tā ir tikai ar FT232 čipu..

----------


## 0xDEAD BEEF

Ja tu izmanto tikai RX un TX pinus COM portam, tad tas ir ARKARTIGI slikti izmantot kreisos COM library un citus sudus. Tada gadijuma ar COM portu runa to atverot ka failu (ja nemaldos, tad ":COM1"). Windowsa system setings var uzstadit defaulto porta atrumu. Var ari to izdarit ar caur windows api setcommstate un createfile uztaisi failu uz serialo portu.
nevajag cakareties!
palasi seit!
http://msdn.microsoft.com/en-us/library/aa363194(VS.85).aspx
Beefs
p.s. lai veksmigi ar draiveriem cakaretu com portu, vinu vajag izslegt windowsa, lai pats windows nelien pa virsu, bet to izdarit NEMAZ nav tik vienkrasi!

----------


## jeecha

Es ar kaadreiz izmantoju M_J ieteikto biblioteeku.

Neliels offtopic - patreiz ar PICiem esmu paargaajis pilniibaa uz USB - cenas starpiibas kontrolieros vairs iipashi nekaadas nav ar vai bez USB transiivera, patiesiibaa USB pat driizaak sanaak leetaak - nevaig nekaadu RS232 liimenju translatoru, DB-9 vai DB-25 konektorus un vadus... uz plates vaig tikai un vieniigi USB konektoru un vienu kondensatoru. Taakaa iesaku pameegjinaat, nekaada rakjeshu zinaatne taa nav (it iipashi ar PICiem kuriem ir straadaajoshi, un tagad arii daudzmaz viegli saprotami USB koda paraugi). Saakumaa lietoju CDC klasi, bet tagad tikai un vieniigi HID - daudz vienkaarshaak uz pc nokjert vai iekaarta ir, kad taa tiek piesprausta, atrauta utml. Zem Delphi prieksh HID lietoju http://www.soft-gems.net/index.php?o...d=14&Itemid=33.

----------


## marizo

Laikam vajadzēja tikai vairāk parakties pa internetu. Atradu vēl dažus piemērus ar  TMSA32. Pārveidoju minēto Delphi programmu uz šo bibliotēku. Rezultāts mani iepriecināja - vismaz uz aci nav redzamas kļūdainas/iztrūkstošas datu pakas. Nezinu gan, vai viss tiek 100% precīzi saņemts, to varētu pārbaudīt, sūtot no PICa konstantu datu virkni un ar Delphi salīdzināt saņemtos datus ar zināmajiem sūtītajiem. Bet tas nu tā, kad būs vairāk brīva laika un vēlmes.
Tā darbojoties, rodas visādas domas. Viena no tām - varbūt sūtot/saņemot datus ir vērts paredzēt datu pareizības pārbaudi? Piemēram, pēc kāda algoritma aprēķinātu baitu sūtīt datu pakas beigās.
Vispār varbūt ir kādi standarti, pēc kuriem varētu vadīties, realizējot datu apmaiņu starp datoru un PICu? Iedomājos kaut kāda secība - starta baits, kontroles baits, dati, beigu baits.

Jā, es arī palēnām domāju par PICiem ar USB, bet pagaidām neesmu tik spēcīgs kontrolleru programmēšanā ne ASM, ne C. Esmu palasījis par USB PICiem, liekas jau vilinoši. No ICD2 klona taisīšanas palika pāri vēl viens PIC 18F4550, kas būtu kāreiz piemērots.  ::  Paldies par linku, jeecha, jāpaskatās, kas ar to bibliotēku.

Papildināts:
Nu re! Ar pēdējo dzelzs hlorīdu izkodināju speciāli priekš 18F4550:
[attachment=1:37jell94]4550_1.jpg[/attachment:37jell94]
[attachment=0:37jell94]4550_2.jpg[/attachment:37jell94]

Personīgi man kaut kā galīgi nepatīk pat mazus štruntus lodēt uz maketplatēm (ja vien tas nav kaut kas, pilnīgi jauns, par kura darbību, savienojumiem man nav ne jausmas). 
PIC18F4550 maketplate ar visu nepieciešamo, lai pieslēgtu pie USB. Ideja ņemta no www.sprut.de un pārveidota pa savam. Izmēģināju dažas programmas no neta - soļu motora vadību no http://www.sixca.com, USB Data Acquisition Card no http://www.elektor.com un ACP vērtības nolasīšanu no http://www.sixca.com. Patīkami piespraust kaut ko pie kompja un redzēt New Hardware Found... Nojaušu, ka potenciāls šim PICam ir pietiekami manām vajadzībām ilgu laiku. Jautājums tikai - kā apgūt PIC un Delphi programmēšanu normālā līmenī? Laikam vajag talantu, kura man nav.
/Mirgojošas gaismas diodes atstāj nelabvēlīgu iespaidu./

----------


## ansius

kļūdu kontrole ir ļoti nederīga lieta, taču bet bez "hand shake" algoritmiem tam nav ne jēgas. pilns RS-232 protokols paredz parity pārbaudi, kā pēdējo bitu, bet tas ir tikai viena baita robežās (kopā 10 biti, 1 x start, 8 x data, 1 x parity, 1-2x stop), lielākiem datiem, vajag ko sarežģītāku taču tas nozīmē atkal lieki noslogot mikrokontrolieri. http://en.wikipedia.org/wiki/Checksum - šis tas par populārākajām lietā šinī jomā.

----------

