📄 ioserial.c
字号:
#ifndef _IO_SERIAL_C_
#define _IO_SERIAL_C_
#include "ioserial.h"
#include "serial.h"
EMULATE_UART data giocomm;
static bit rcvBit;
#define TIME_HALF_BAUDTO_9600_TH2 0xff
#define TIME_HALF_BAUDTO_9600_TL2 0xa0
void Extern_Interrupt(void) interrupt EXTERN0_INTERRUPT_VECTOR
{
/* EMULATE_START_HALF_TIMER;*/
TH2 = TIME_HALF_BAUDTO_9600_TH2;
TL2 = TIME_HALF_BAUDTO_9600_TL2;
/*start timer*/
EMULATE_START_BAUD;
/*stop extern interrupt,only startbit enable interrupt.*/
EMULATE_STOP_EXT;
}
void Time1_Interrupt(void) interrupt TIME1_INTERRUPT_VECTOR using 1
{
EMULATE_CLEAR_PEND;
/*receive emulate UART*/
if( giocomm.status == EMULATE_RECEIVE )
{
rcvBit = RECV;
/*start bit*/
if( giocomm.bitCount == 0 )
{
giocomm.bitCount ++;
giocomm.bitTemp = 0;
return;
}
/*receive 8bits data*/
else if( giocomm.bitCount < 9 )
{
giocomm.bitCount ++;
if( rcvBit )
giocomm.bitTemp = (giocomm.bitTemp>>1) | 0x80;
else
giocomm.bitTemp >>= 1;
return;
}
/*receive the ten bits*/
else if( giocomm.bitCount == 9 )
{
giocomm.bitCount ++;
return;
}
/*stop bit*/
else if( giocomm.bitCount == 10 )
{
/*stop timer and receive bit*/
EMULATE_STOP_BAUD;
/*use interrupt, check start bit.*/
EMULATE_START_EXT;
giocomm.bitCount = 0;
giocomm.byteTemp = giocomm.bitTemp;
if( rcvBit )
{
gIoSerial.ReceiceBuffer[gIoSerial.Iocounter ++] = giocomm.byteTemp;
gIoSerial.ReveiveOverTime = RECEIVE_TIME_START;
// emulateReceiveIsr( giocomm.byteTemp );
return;
}
else
{
emulateStartReceive();
return;
}
}
return;
}
/*send emulate UART */
if( giocomm.status == EMULATE_TRANSMIT )
{
if( giocomm.bitValid == 1 )
{
/*send the start bit,start bit is 1*/
if( giocomm.bitCount == 0 )
{
sendbit( LOW );
giocomm.bitCount ++;
}
/*send the eight bit data*/
else if( giocomm.bitCount < 9 )
{
sendbit( giocomm.bitTemp );
giocomm.bitTemp >>= 1;
giocomm.bitCount ++;
}
/*send the ten bit,is a verify but no use*/
else if(giocomm.bitCount == 9)
{
giocomm.bitCount ++;
sendbit( LOW );
}
/*send the stop bit*/
else if(giocomm.bitCount == 10)
{
giocomm.bitCount ++;
giocomm.bitValid = 0;
sendbit( HIGH );
emulateTransmitIsr();
}
}
return;
}
}
void setEmulateTransmitByte(BYTE value)
{
giocomm.bitCount = 0;
giocomm.bitValid = 1;
giocomm.bitTemp = value;
return;
}
void emulateStopReceive(void)
{
DISABLE_INTERRUPT;
EMULATE_STOP_EXT;
EMULATE_STOP_BAUD;
ENABLE_INTERRUPT;
}
void emulateStartSend(void)
{
DISABLE_INTERRUPT;
giocomm.status = EMULATE_TRANSMIT;
giocomm.bitValid = 0;
emulateTransmitIsr(); /*get bit temp*/
EMULATE_STOP_EXT; /*disable extern interrupt*/
EMULATE_START_BAUD;
ENABLE_INTERRUPT;
}
void initIocomm( void )
{
IP = 0; /*clear all priority*/
EXT_IP = 1;
EXT_IE = 1;
EXT_EDGE = 1; /*down edge interrupt*/
TIMER_IP = 1; /*timer in high priority*/
TIMER_IE = 1; /*enable timer interrupt*/
T2CON = 0;
// T2MOD = 0;
RCAP2H = EMULATE_TIMER/256;
RCAP2L = EMULATE_TIMER%256;
emulateStartReceive();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -