저희 업체가 rs232c를 이용한 프로그래밍 작업을 많이 했거든요...
저는 주로 PLC 및 바코드 관련 장비들하고 232 시리얼 통신하는 걸 많이 했구요.
아직 문제를 해결하지 못하셨다면 제가 조금은 도움 드릴 수 있을 거 같네요...
필요하시면 메일 주세요...(j8041@chollian.net)
---------------------------------------------------------------------------
델초보 님이 쓰신 글 :
: 제가 너무 초보라 어찌해야 할지를 모르겠습니다.
:
:
: 아래 두개의 볼랜드 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
:
:
: 이 모든 것을 델파이로 차트로 표현 해주실 수 있을까요?
:
|