제가 너무 초보라 어찌해야 할지를 모르겠습니다.
아래 두개의 볼랜드 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
이 모든 것을 델파이로 차트로 표현 해주실 수 있을까요?
|