Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[8326] c로 짠 프로그램을 delphi로 바꿔주세요..
델초보 [] 1062 읽음    2002-09-26 15:55
제가 너무 초보라 어찌해야 할지를 모르겠습니다.


아래 두개의 볼랜드 c를 통해 온도측정을 해야 하는데

콤퍼넌트를 어찌 대입해야 할찌 잘모르겠습니다.. 제발 도와주십시요.. 부탁드립니다..

리퀘스트 없이 읽고만 하면 되거든요.. 온도부분만요..

온도측정기의 온도값을 시리얼통신으로 받아 차트로 표현 하고 싶습니다..


=========================================================================
참조


규격은 RE-232c, 19200bps, 8bit, 1stop bit, No parity

1packet =3byte

header는 7bit,
data는 2개의 7bit 총 14bit


그중 [2CH]TEMP
범위 :ㅣ0~500(step 1), 그리고 512
단, 512는 OFF(---)를 의미하고요
단위는 0.1도
Data 0iiidddddddddd 로 표현한다면

(0=TEMP 1,1=TEMP2)
ex)iii=0, dddddddddd=367 이면 temp1=36.7도를 의미하거든요.



==========================================================================

comm.cpp  통신초기화 하는 곳



#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>

/**/

// Port & Interrupt

#define COM1 0
#define COM2 1

#define IRQ4 0x0C
#define IRQ3 0x0B

// BiosCom Function number

#define CInit    0
#define CSend    1
#define CReceive 2
#define CStatus  3

// BiosCom Parameter

#define Data7 0x02
#define Data8 0x03
#define Stop1 0x00
#define Stop2 0x04
#define NoParity   0x00
#define OddParity  0x08
#define EvenParity 0x18
#define B1200 0x80
#define B2400 0xA0
#define B4800 0xC0
#define B9600 0xE0

// 8250 UART : Universal Asynchronous Receiver Transmitter

#define BRDL 0xF8
#define BRDH 0xF9
#define DBR 0x0F8       // Data Buffer Register
#define IER 0x0F9       // Interrupt Enable Register
#define LCR 0x0FB       // Line Control Register
#define MCR 0x0FC       // Modem Control Register
#define LSR 0x0FD       // Line Status Register

// PIC : Programable Interrupt Controller

#define PICMSK 0x21     // 8259 mask register
#define PICEOI 0x20     // 8259 EOI
#define MSKON  0xE7     // IRQ4/IRQ3 On
#define MSKOFF 0x18     // IRQ4/IRQ3 Off

/**/

int UART;

void interrupt (*CommOldInt)(...);

#define QueLen 1024
int CommQue[QueLen];
int QueHead, QueTail;

/**/

void CommOpen  ( int port );
void CommClose ( int port );

int  CommGetCh ( void );
void CommPutCh ( int data );

#define CommHit()  (QueHead!=QueTail)

void interrupt CommNewInt ( ... );

/**/

void CommOpen( int port )
{
   if( !port )
   {
      CommOldInt = getvect( IRQ4 );     // COM1
      UART = 0x300;
      setvect( IRQ4,CommNewInt );
   } else {
      UART = 0x200;
      CommOldInt = getvect( IRQ3 );        // COM2
      setvect( IRQ3,CommNewInt );
   }

   bioscom( CInit, Data8|Stop1|NoParity|B4800, port );

   outportb( UART+LCR, inportb(UART+LCR)|0x80 );
   outportb( UART+BRDL, 0x06 );
   outportb( UART+BRDH, 0x00 );
   outportb( UART+LCR, inportb(UART+LCR)&0x7F );

   outportb( UART+MCR,0x0B );
   outportb( UART+IER,0x01 );
   outportb( PICMSK,(inportb(PICMSK)&(MSKON)));
}

void CommClose( int port )
{
   outportb( UART+MCR,0x00 );
   outportb( UART+IER,0x00 );
   outportb( PICMSK,(inportb(PICMSK)|MSKOFF) );

   if( !port ) setvect( IRQ4,CommOldInt );
   else        setvect( IRQ3,CommOldInt );
}

int CommGetCh()
{
   register int ch;
   if( QueHead==QueTail ) return (-1);
   ch = CommQue[QueTail];
   QueTail ++;
   QueTail %= QueLen;
   return( ch );
}

void CommPutCh( int data )
{
   register int count = 0;

   while( !(inportb(UART+LSR)&0x20) && count<30000 ) count++;

   if( count<30000 ) outportb( UART+DBR,data );
   else              puts( "[ Data Send Error ] - not Ready" );
}

void interrupt CommNewInt(...)
{
   CommQue[QueHead] = inportb( UART+DBR );
   QueHead ++;
   QueHead %= QueLen;
   outportb( PICEOI,0x20 );
}

/**/

void main_test()
{
    int nData;

    CommOpen( 1 );

    while( !bioskey(1) )
    {
        nData = CommGetCh();
        if( nData >= 0 )
            printf( "%02X", nData );
    }

    CommClose( 1 );
}



==========================================================


아래부터는 읽고 온도부분을 찾아내는 곳


#include <bios.h>
#include <conio.h>
#include <ctype.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>

#include "Comm.cpp"

typedef unsigned char UCHAR;
typedef unsigned int  UINT;

typedef char * PSTR;
typedef char huge * LPSTR;

typedef const PSTR  PCSTR;
typedef const LPSTR LPCSTR;

enum bool { true=1, false=0, TRUE=1, FALSE=0 };
typedef enum bool BOOL;

#define PORT_COM 1

#if PORT_COM == 1
    #define PORT_BASE 0x3F8
    #define INTR_NO   0xC
    #define INTR_MASK 0x10
#else
    #define PORT_BASE 0x3F8
    #define INTR_NO   0xC
    #define INTR_MASK 0x10
    #if 0
    #define PORT_BASE 0x2F8
    #define INTR_NO   0xB
    #define INTR_MASK 0x08
    #endif
#endif

#define COLOR_BACK   BLACK
#define COLOR_WAVE   WHITE
#define COLOR_PR     GREEN
#define COLOR_FINE   RED
#define COLOR_CENTER BLUE
#define COLOR_ACG    BLUE
#define COLOR_ACGGO  YELLOW

#define SIZE_POS 640

#define PORT_TRB  (PORT_BASE+0)
#define PORT_BRD0 (PORT_BASE+0)
#define PORT_BRD1 (PORT_BASE+1)
#define PORT_IER  (PORT_BASE+1)
#define PORT_LCR  (PORT_BASE+3)
#define PORT_LSR  (PORT_BASE+5)
#define PORT_PIC  0x21

#define SIZE_BUF  32

#define IsRxReady() (inportb(PORT_LSR)&0x01)
#define IsRxEmpty() !(inportb(PORT_LSR)&0x01)
#define IsTxReady() (inportb(PORT_LSR)&0x20)
#define GetRxData() (inportb(PORT_TRB))

#define TxData(X) (outportb(PORT_TRB,X))

class CInterrupt
{
protected:
    BOOL m_bOpen;
    int m_nHead, m_nTail;
    UINT m_anBuf[SIZE_BUF];
public:
    CInterrupt();
    ~CInterrupt();
public:
    void Open    (void);
    void Close   (void);
    void PutData (UINT uiData);
    int  GetData (void);
public:
    inline BOOL IsDataExist (void)
    { if( m_nHead == m_nTail ) return FALSE; else return TRUE; }
    inline BOOL IsDataEmpty (void)
    { if( m_nHead == m_nTail ) return TRUE; else return FALSE; }
};

void interrupt (*ProcIntOld)(...);
void interrupt ProcIntNew(...);

CInterrupt theTx, theIntr;

void vWaveDraw(int &nPos, int nOfs, int nNewData, int &nOldData);

int ConvDigit10to16(int nData)
{
    if(nData&0x200) nData |= 0xFC00;
    return nData;
}

void main()
{
    int nGD, nGM;
    int nHead, nData, nTemp;
    char szBuf[128] = {0};
    int nPacket1, nPacket2, nPacket3, nPacketCount = 0;

    PCSTR pszAni = "|/-\\";
    int nAniHR = 0, nAniSpO2 = 0, nAniCCHK = 0;
    int nAniT0 = 0, nAniT1 = 0, nAniResp = 0;

    //volatile UINT vuiTemp;

    for( nTemp = 0; nTemp < 10; nTemp ++ )
    {
        nMaxR[nTemp] = nMinR[nTemp] =
        nMaxI[nTemp] = nMinI[nTemp] =
        nPR[nTemp] = nPI[nTemp] =
        nMinBR[nTemp] = nMinBI[nTemp] =
        0;
    }

    nGD = DETECT;
    initgraph( &nGD, &nGM, "C:\\Dos\\Bc31\\Bgi" );
    setfillstyle( SOLID_FILL, COLOR_BACK );

   
    theTx.Open();

    BOOL bLoop = TRUE;
    while( bLoop )
    {
        if( theTx.IsDataExist() )
            if( IsTxReady() )
                TxData( theTx.GetData() );
        nTemp = CommGetCh();
        if( nTemp == -1 ) continue;

        nHead = -1;

        if( nTemp & 0x80 )
        {
            nPacketCount = 1;
            nPacket1 = nTemp;
        }
        else
        {
            switch( nPacketCount )
            {
            case 1:
                nPacket2 = nTemp;
                nPacketCount ++;
                break;
            case 2:
                nPacket3 = nTemp;
                nPacketCount = 0;
                nHead = nPacket1 & 0x7F;
                nData = (nPacket2 << 7) | nPacket3;
                break;
            }
        }


        switch( nHead )
        {
        case -1:
            break;
       
        case 0x2C: // Temp
            nTemp = (nData>>10) & 7;
            nData = ConvDigit10to16( nData&0x3FF );
            switch( nTemp )
            {
            case 0:
                sprintf( szBuf, "Temp0=%4d %c", nData, pszAni[nAniT0] );
                nAniT0 = (nAniT0 + 1) % 4;
                setcolor( COLOR_WAVE );
                bar( 200, 401-16, 299, 400 );
                outtextxy( 201, 401-16, szBuf );
                szBuf[0] = 0;
            case 1:
                sprintf( szBuf, "Temp1=%4d %c", nData, pszAni[nAniT1] );
                nAniT1 = (nAniT1 + 1) % 4;
                setcolor( COLOR_WAVE );
                bar( 300, 401-16, 399, 400 );
                outtextxy( 301, 401-16, szBuf );
                szBuf[0] = 0;
            }
            break;
       
        default:
            sprintf( szBuf, "[Packet ?(%X,%X)]", nHead, nData );
        }

        if( szBuf[0] )
        {
            #define _POS_MSGTOP    401+8+8
            #define _POS_MSGBOTTOM 480-1

            strcat( szBuf, " ? );
            nTemp = strlen( szBuf ) * 8;
            if( nColMessage + nTemp > 640 )
            {
                bar( 0+nColMessage, _POS_MSGTOP+nRowMessage,
                    0+nColMessage+7, _POS_MSGTOP+nRowMessage+7 );
                nColMessage = 0;
                nRowMessage += 8;
                if( _POS_MSGTOP+nRowMessage + 8 > _POS_MSGBOTTOM )
                    nRowMessage = 0;
            }
            bar( 0+nColMessage, _POS_MSGTOP+nRowMessage,
                0+nColMessage+nTemp-1, _POS_MSGTOP+nRowMessage+7 );
            outtextxy( 0+nColMessage, _POS_MSGTOP+nRowMessage, szBuf );
            nColMessage += (nTemp - 8);
            szBuf[0] = 0;

            #undef _POS_MSGBOTTOM
            #undef _POS_MSGTOP
        }
    }

    while( bioskey(1) ) bioskey( 0 );

    closegraph();
}

void vWaveDraw(int &nPos, int nOfs, int nNewData, int &nOldData)
{
    int nPosTemp;

    if( ++ nPos >= 640 ) nPos = 0;
    nNewData = ((512-nNewData)*50+512/2) / 512;
    if( nNewData > 49 ) nNewData = 49;
    if( nNewData < -49 ) nNewData = -49;
    nPosTemp = nPos + 1;
    if( nPosTemp >= SIZE_POS ) nPosTemp -= SIZE_POS;
    setcolor( COLOR_WAVE );
    line( nPosTemp, nOfs, nPosTemp, nOfs+nNewData );
    setcolor( COLOR_BACK );
    line( nPos, nOfs-50, nPos, nOfs+50 );
    putpixel( nPos, nOfs, COLOR_CENTER );
    setcolor( COLOR_WAVE );
    line( nPos, nOfs+nNewData, nPos, nOfs+nOldData );
    //putpixel( nPos, nOfs-49, COLOR_BACK );
    //putpixel( nPos, nOfs+49, COLOR_BACK );
    nOldData = nNewData;
}

CInterrupt::CInterrupt()
{
    m_bOpen = FALSE;
}

CInterrupt::~CInterrupt()
{
    if( m_bOpen ) Close();
}

void CInterrupt::Open()
{
    m_nHead = m_nTail = 0;
    CommOpen( PORT_COM-1 );
    m_bOpen = TRUE;
}

void CInterrupt::Close()
{
    CommClose( PORT_COM-1 );
    m_bOpen = FALSE;
}

void CInterrupt::PutData(UINT uiData)
{
    int nHeadNext;

    nHeadNext = m_nHead + 1;
    if( nHeadNext >= SIZE_BUF )
        nHeadNext = 0;

    if( nHeadNext == m_nTail )
        return; /* Buffer Full */

    m_anBuf[m_nHead] = uiData;
    m_nHead = nHeadNext;
}

int CInterrupt::GetData()
{
    int nTailNext, nData;

    nTailNext = m_nTail + 1;
    if( nTailNext >= SIZE_BUF )
        nTailNext = 0;

    nData = m_anBuf[m_nTail];
    m_nTail = nTailNext;
    return nData;
}

#if 0
void interrupt ProcIntNew(...)
{
    theIntr.PutData( GetRxData() );
}
#endif


이 모든 것을 델파이로 차트로 표현 해주실 수 있을까요?

+ -

관련 글 리스트
8326 c로 짠 프로그램을 delphi로 바꿔주세요.. 델초보 1062 2002/09/26
9260     Re:c로 짠 프로그램을 delphi로 바꿔주세요.. 장군 872 2002/10/08
9259     Re:c로 짠 프로그램을 delphi로 바꿔주세요.. 장군 903 2002/10/08
9258     Re:c로 짠 프로그램을 delphi로 바꿔주세요.. 이용윤 906 2002/09/28
8348     Re:c로 짠 프로그램을 delphi로 바꿔주세요.. 장군 1393 2002/10/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.