Läsa av serieport

Hur skriver man en programsnutt i QBASIC för att göra lopbackläsning från en serieport?

Ska koppla en serieport till ett flis-eldnings-styrkort för att mäta den tid som skruven drar. Skruvmotorn kopplas till och från via ett relä och tiden som relät är draget på styrs via potentialmetrar.

Skruvmotorn drar sådär en 10 till 60 sekunder beroende på hur potientalmetern är inställd sedan står den stilla beroende på hur en annan potientalmeter är inställd.

Tar ut en signal från styrkortet som matar en optokopplare vars transistor är kopplade till serieportens RX RI.

I stället för att stå där med en klocka och mäta tid så är det tänkt att tidsintervallerna när flisskruven roterar respektive står stilla ska presenteras på bildskärmen som ett streck, avbrott, streck, avbrott, streck, avbrott eller på nåt liknade sätt.

Signalen ska tas ut från en redan befintlig lysdiod som indikerar när flisskruven roterar.

Nu är ju QBASIC inte så exakt när det gäller tidskritiska situationer men i det här fallet är det fullt tillräckligt.

Det help som medföljer QBASIC är alldeles för knapphändigt för att jag ska kunna skriva ett program som läser av serieportarna.

Det är tänkt att QBASIC ska köras på en ren DOS-burk.

/Göran

Reply to
Goran Soderlind
Loading thread data ...

. .

Får man föreslå Borland Turbo-C v2.x ?, den är släppt fri. Se dock upp med att skapa program som är större än 32 kB ;)

Där finns en funktion som heter bioscom() (Se den inbyggda hjälpen). Som läser serie porten. Annars kan man anropa bios rutiner efter behag med andra funktioner. Kolla då med "freds interrupt list" (om jag minns rätt.. )

Reply to
pbdelete

Det enda programspråk jag förstår mig på lite grann är gwbasic och qbasic. Att börja med Borland är uteslutet just nu. Det blir som att börja från början och det borde inte vara nödvändigt i det här fallet.

/Göran

Reply to
Goran Soderlind

Du får läsa direkt på porten med INP(Portadress). Ämnet diskuterades här (swnet.teknik.elektronik) i september, kolla efter "Läsa på ser porten" i Google.

Parallellporten är dock i 9 fall av 10 lite smidigare för denna typ av uppgift.

/Henrik

Reply to
Henrik Johnsson

Jag kan sammanfatta lite för den tråden blev kanske lite rörig...

Stiften på com-porten (bra-att-ha):

formatting link

Motsvaras i modemstatusregistret så här: Port 3FE - Modem Status Register - MSR (read only) ¦7¦6¦5¦4¦3¦2¦1¦0¦ 2FE, 3FE Modem Status Register ¦ ¦ ¦ ¦ ¦ ¦ ¦ +---- 1 = DCTS Delta CTS (CTS changed) ¦ ¦ ¦ ¦ ¦ ¦ +----- 1 = DDSR Delta DSR (DSR changed) ¦ ¦ ¦ ¦ ¦ +------ 1 = RI ring indicator changed ¦ ¦ ¦ ¦ +------- 1 = DDCD Delta Data Carrier Detect (DCD changed) ¦ ¦ ¦ +-------- 1 = CTS ¦ ¦ +--------- 1 = DSR ¦ +---------- 1 = ring indicator (RI) +----------- 1 = receive line signal detect

Dvs uttryckt i Basic-kod så blir uttrycket INP(&H3FE) AND &H10 skilt från 0 när CTS är hög respektive lika med 0 när CTS är låg.

Man kan dock inte lita på att I/O-adressen till första serieporten är

03FEh, det kan nästan lika ofta vara 02FEh istället. För att ta reda på vad den verkligen är kan man läsa från minnesadress 0000:0400h. (QBasic kan bara läsa 8 bitar från en minnesadress så det blir 2 st PEEK().)

DEF SEG = 0 COM1Address = PEEK(&H401) * 256 + PEEK(&H400) IF INP(COM1Address) AND &H10 THEN PRINT "H" ELSE PRINT "L" END IF

Om du nu kopplar din signal till CTS på serieporten (pinne 8 på 9-poliga varianten resp pinne 5 på 25-poliga varianten) så ska du få ett H eller L på skärmen av ovanstående program beroende på signalen till stiftet.

Det håller jag iofs med om, men för bara en insignal så bör detta också fungera.

--
Olof Lagerkvist           sm6xmk
ICQ: 724451                     @ssa.se
 Click to see the full signature
Reply to
Olof Lagerkvist

Reply to
Janne G

Org>

Reply to
Anders

Nej, OP skrev att det handlade om en ren DOS-dator.

Njae, men just den här saken hade varit lika enkel ändå i ett vanligt Win32-program eftersom serieportsdrivrutinen släpper igenom direktaccess till statuspinnarna.

Man använder då SetCommMask(), WaitCommEvent() och GetCommModemStatus() för att läsa av status på in-pinnarna respektive EscapeCommFunction() för att ställa om ut-pinnarna.

formatting link

Detta gäller alltså serieportarna men däremot går parallellportens pinnar inte att programmera direkt från ett usermodeprogram i Windows NT. Man måste i så fall använda någon drivrutin (det finns gratisdrivrutiner för detta).

--
Olof Lagerkvist           sm6xmk
ICQ: 724451                     @ssa.se
 Click to see the full signature
Reply to
Olof Lagerkvist

Hupp, missade den raden.

Statuspinnarna ja men inte direkt med inp() och outp() utan man måste gå igenom device drivern och hoppas att den inte filtrerar något. Jag har för mig att det var något "rackel" med att programmera någon av pinnarna i serie porten genom devicen men det är några år sedan och mitt minne blir inte bättre med åren.

formatting link

Reply to
Janne G

Precis, men med undantag för felet jag nu nämner här under så filtreras egentligen ingenting utan man kan använda GetCommModemStatus() till samma saker som man använder inp(0x03FE) till i drivrutiner eller DOS.

Man kan ändå inte läsa/ställa stiften direkt med inp() eller outp() på det sätt som man kan med parallellporten ens i DOS eftersom UART-kretsen sitter mellan och styr vad som egentligen händer.

Ja, det finns en konstighet i serieportsdrivrutinen på en del Windows-versioner (eller möjligen något trassel med en del UART-kretsar) som gör att man inte kan komma åt CTS direkt om DCB-informationen för XonLim och XoffLim (alltså limits för XON/XOFF-handskakning) av någon anledning har hamnat på felaktiga värden, t ex 0, även om man väljer att inte använda XON/XOFF-handskakning.

Tar man för vana att alltid ställa in rimliga XonLim och XoffLim innan man gör något annat så är det dock inget problem.

--
Olof Lagerkvist           sm6xmk
ICQ: 724451                     @ssa.se
 Click to see the full signature
Reply to
Olof Lagerkvist

Bara för att testa så laddade jag ner Borland Turbo-C v2.1 och installerade efter anvisningarna.

Jag begrep ingenting av det där. Det är säkert bra men det tar nog ett halvår på heltid att lära sig.

/Göran

Reply to
Goran Soderlind

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.