Läsa av serieport

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Swedish to

Threaded View

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

 

Re: Läsa av serieport

Quoted text here. Click to load it

.
.

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


Re: Läsa av serieport
On 21 Dec 2004 22:57:20 GMT,

Quoted text here. Click to load it

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


Re: Läsa av serieport
On 21 Dec 2004 22:57:20 GMT,

Quoted text here. Click to load it

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



  

Re: Läsa av serieport
Quoted text here. Click to load it

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

--

Re: Läsa av serieport

Quoted text here. Click to load it

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

Stiften på com-porten (bra-att-ha):
http://here.is/olof/files/serial_com_port.gif

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.

Quoted text here. Click to load it

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
We've slightly trimmed the long signature. Click to see the full one.
Re: Läsa av serieport
Jag hoppas att vi inte pratar WinDosNT eller nyare här?
Ingen direkt access till hårdvaran på dessa system.
Janne G

Olof Lagerkvist wrote:
Quoted text here. Click to load it

Re: Läsa av serieport
Quoted text here. Click to load it

Orginalförfattarens meddelande:

Quoted text here. Click to load it


Re: Läsa av serieport

Quoted text here. Click to load it

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

Quoted text here. Click to load it

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.
http://msdn.microsoft.com/library/en-us/devio/base/communications_functions.asp

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
We've slightly trimmed the long signature. Click to see the full one.
Re: Läsa av serieport
Quoted text here. Click to load it


Hupp, missade den raden.

Quoted text here. Click to load it

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.

Quoted text here. Click to load it
http://msdn.microsoft.com/library/en-us/devio/base/communications_functions.asp
Quoted text here. Click to load it

Re: Läsa av serieport

Quoted text here. Click to load it


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.

Quoted text here. Click to load it

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
We've slightly trimmed the long signature. Click to see the full one.

Site Timeline