?? serial.c
字號(hào):
/*
名稱:main.c
日期:2005.01.12
作者:廖志凱
功能:
說(shuō)明:程序使用RTX51實(shí)時(shí)多任務(wù)系統(tǒng),
*/
#pragma large
#include "serial.h"
/*------------------------------------------------------------------------------*/
//定義串口緩沖區(qū)
uchar xdata cRecvBuff[RECV_GRUOP][RECV_LENGTH]; //接收緩沖區(qū)
uchar xdata cRecvBuffNum; //已接收數(shù)據(jù)的字節(jié)數(shù)
uchar xdata cRecvBuffPtr; //接收緩沖區(qū)有效數(shù)據(jù)起始指針
uchar xdata cRecvBuffCnt; //接收緩沖區(qū)有效數(shù)據(jù)總數(shù)
uchar xdata cTranBuff[TRAN_GRUOP][TRAN_LENGTH]; //發(fā)送緩沖區(qū)
uchar xdata cTranBuffNum; //已發(fā)送數(shù)據(jù)的字節(jié)數(shù)
uchar xdata cTranBuffPtr; //發(fā)送緩沖區(qū)有效數(shù)據(jù)起始指針
uchar xdata cTranBuffCnt; //發(fā)送緩沖區(qū)有效數(shù)據(jù)總數(shù)
/*------------------------------------------------------------------------------*/
uchar xdata cRecvBuff2[RECV_LENGTH2]; //接收緩沖區(qū)
uchar xdata cRecvBuffNum2; //已接收數(shù)據(jù)的字節(jié)數(shù)
uchar xdata cTranBuff2[TRAN_GRUOP2][TRAN_LENGTH2]; //發(fā)送緩沖區(qū)
uchar xdata cTranBuffNum2; //已發(fā)送數(shù)據(jù)的字節(jié)數(shù)
uchar xdata cTranBuffPtr2; //發(fā)送緩沖區(qū)有效數(shù)據(jù)起始指針
uchar xdata cTranBuffCnt2; //發(fā)送緩沖區(qū)有效數(shù)據(jù)總數(shù)
/*===============================================================
功能:串口初始化
參數(shù):
返回:
說(shuō)明:
===============================================================*/
void Init_Serial(void)
{
//初始化串口寄存器
SCON = 0x50; //模式1,8位通訊,允許接收
SCON2 = 0x50; //模式1,8位通訊,允許接收
PCON = 0x00; //SMOD,SMOD1=0;
TMOD |= 0x20; //模式2,8位自載
TH1 = 0xFA;
TL1 = 0xFA; //波特率9600
TR1 = 1; //啟動(dòng)Timer1
ET1 = 0; //禁止Timer1中斷
os_enable_isr(SIO_VECTOR);
os_enable_isr(SI1_VECTOR);
//os_disable_isr(SI1_VECTOR);
//初始化緩沖區(qū)
memset(cRecvBuff,0x00,RECV_GRUOP*RECV_LENGTH);
cRecvBuffNum = 0x00;
cRecvBuffPtr = 0x00;
cRecvBuffCnt = 0x00;
memset(cTranBuff,0x00,TRAN_GRUOP*TRAN_LENGTH);
cTranBuffNum = 0x00;
cTranBuffPtr = 0x00;
cTranBuffCnt = 0x00;
memset(cRecvBuff2, 0x00, RECV_LENGTH2);
cRecvBuffNum2 = 0x00;
memset(cTranBuff2, 0x00, TRAN_GRUOP2*TRAN_LENGTH2);
cTranBuffNum2 = 0x00;
cTranBuffPtr2 = 0x00;
cTranBuffCnt2 = 0x00;
}
/*===============================================================
功能:
參數(shù):
返回:
說(shuō)明:
===============================================================*/
void Write_serial_buff(uchar *buff, uchar len)
{
uchar _index;
if(cTranBuffCnt < TRAN_GRUOP)
{
_index = (cTranBuffPtr + cTranBuffCnt) % TRAN_GRUOP;
memcpy(cTranBuff[_index], buff, len);
cTranBuffCnt++;
//os_send_message(MBX_SERAIL_TRAN, 0x00, T10MS);
}
}
/*===============================================================
功能:串口0 中斷程序
參數(shù):無(wú)
返回:無(wú)
說(shuō)明:只給相應(yīng)任務(wù)發(fā)送信號(hào)
===============================================================*/
void Int_Serial0(void) interrupt SIO_VECTOR
{
uchar xdata _index;
uchar xdata _data;
if(RI)
{//接收中斷
RI = 0;
_data = SBUF;
//isr_send_message(MBX_SERAIL_RECV, SBUF);
if(cRecvBuffCnt < RECV_GRUOP)
{//接收緩沖區(qū)未滿
_index = (cRecvBuffPtr+cRecvBuffCnt) % RECV_GRUOP; //緩沖區(qū)的偏移地址
if(_data == 0xFF)
{//如果收到起始符
cRecvBuff[_index][0] = 0xFF;
cRecvBuffNum = 0x01;
}
else if( (cRecvBuffNum > 0x00) && (cRecvBuffNum < RECV_LENGTH) )
{//其他數(shù)據(jù)
cRecvBuff[_index][cRecvBuffNum] = _data;
cRecvBuffNum++;
if(cRecvBuffNum == (cRecvBuff[_index][1] + 3) )
{//接收完畢
cRecvBuffCnt++;
cRecvBuffNum = 0x00;
}
}
else if(cRecvBuffNum >= RECV_LENGTH)
{//接收的數(shù)據(jù)超過緩沖區(qū)容量清除當(dāng)前接收的數(shù)據(jù)
cRecvBuffNum = 0x00;
memset(&cRecvBuff[_index][0],0x00,RECV_LENGTH);
}
}
}
if(TI)
{//發(fā)送中斷
TI = 0;
isr_send_signal(STRAN_TASK_ID);
}
}
/*===============================================================
功能:串口1 中斷程序
參數(shù):無(wú)
返回:無(wú)
說(shuō)明:只給相應(yīng)任務(wù)發(fā)送信號(hào)
===============================================================*/
void Int_Serial1(void) interrupt SI1_VECTOR
{
if(SCON2&0x01)
{//接收中斷
SCON2 &= 0xFE;
cRecvBuff2[cRecvBuffNum2] = SBUF2;
if( ((cRecvBuff2[cRecvBuffNum2] == 'D') || (cRecvBuff2[cRecvBuffNum2] == 'W'))
&& (cRecvBuff2[cRecvBuffNum2-1] == 'D') )
{//接收到數(shù)據(jù)頭
cRecvBuff2[0] = 'D';
cRecvBuff2[1] = cRecvBuff2[cRecvBuffNum2];
cRecvBuffNum2 = 1;
}
else if( (cRecvBuff2[cRecvBuffNum2] == 0x0A) && (cRecvBuff2[cRecvBuffNum2-1] == 0x0D) )
{//接收完畢
isr_send_signal(CONFIG_TASK_ID);
}
cRecvBuffNum2++;
}
if(SCON2&0x02)
{//發(fā)送中斷
SCON2 &= 0xFD;
isr_send_signal(DEBUG_TASK_ID);
}
}
/*===============================================================
功能:串口接收任務(wù)
參數(shù):無(wú)
返回:無(wú)
說(shuō)明:緩沖區(qū)采用先進(jìn)先出的原則,當(dāng)緩沖區(qū)已滿則停止接收
郵件的參數(shù)是接收數(shù)據(jù)的長(zhǎng)度。只有接收到數(shù)據(jù)頭才開始接收數(shù)據(jù)
===============================================================*/
void Serial_RECV_Task(void) _task_ SRECV_TASK_ID
{
static uchar xdata _index;
static uint xdata _data;
while(1)
{
//os_wait(K_SIG,0x00,0x00); //等待串口接收數(shù)據(jù)
os_wait(K_MBX+MBX_SERAIL_RECV, 0x00, &_data);
if(cRecvBuffCnt < RECV_GRUOP)
{//接收緩沖區(qū)未滿
_index = (cRecvBuffPtr+cRecvBuffCnt) % RECV_GRUOP; //緩沖區(qū)的偏移地址
if((uchar)_data == 0xFF)
{//如果收到起始符
cRecvBuff[_index][0] = 0xFF;
cRecvBuffNum = 0x01;
}
else if( (cRecvBuffNum > 0x00) && (cRecvBuffNum < RECV_LENGTH) )
{//其他數(shù)據(jù)
cRecvBuff[_index][cRecvBuffNum] = (uchar)_data;
cRecvBuffNum++;
if(cRecvBuffNum == (cRecvBuff[_index][1] + 3) )
{//接收完畢
cRecvBuffCnt++;
cRecvBuffNum = 0x00;
}
}
else if(cRecvBuffNum > RECV_LENGTH)
{//接收的數(shù)據(jù)超過緩沖區(qū)容量清除當(dāng)前接收的數(shù)據(jù)
cRecvBuffNum = 0x00;
memset(&cRecvBuff[_index][0],0x00,RECV_LENGTH);
}
}
}
}
/*===============================================================
功能:串口發(fā)送任務(wù)
參數(shù):無(wú)
返回:無(wú)
說(shuō)明:發(fā)送
郵件的參數(shù)是要發(fā)送數(shù)據(jù)的長(zhǎng)度
===============================================================*/
void Serial_Tran_Task(void) _task_ STRAN_TASK_ID
{
static uchar xdata _sendNum;
while(1)
{
if( (cTranBuffCnt != 0x00) && (cTranBuffPtr < TRAN_GRUOP) )
{//有數(shù)據(jù)要發(fā)送
_sendNum = 0x00;
while(_sendNum < cTranBuff[cTranBuffPtr][1]+3)
{//數(shù)據(jù)是否發(fā)送完畢
SBUF = cTranBuff[cTranBuffPtr][_sendNum];
os_wait(K_SIG,0x00,0x00); //等待數(shù)據(jù)發(fā)送完畢
_sendNum++;
}
//清除發(fā)送完畢的數(shù)據(jù)
memset(&cTranBuff[cTranBuffPtr][0], 0x00, TRAN_LENGTH);
cTranBuffPtr = (cTranBuffPtr+1) % TRAN_GRUOP;
cTranBuffCnt --;
}
os_wait(K_TMO, T10MS, 0x00);
}
}
/*===============================================================
功能:調(diào)試任務(wù)
參數(shù):無(wú)
返回:無(wú)
說(shuō)明:發(fā)送調(diào)試信息,第一個(gè)字節(jié)為發(fā)送長(zhǎng)度,后面為協(xié)議
===============================================================*/
void Debug_Task(void) _task_ DEBUG_TASK_ID
{
while(1)
{
if( (cTranBuffPtr2<TRAN_GRUOP2) && (cTranBuffCnt2 != 0x00) )
{
cTranBuffNum2 = 0x01;
while(cTranBuffNum2 < cTranBuff2[cTranBuffPtr2][0])
{
SBUF2 = cTranBuff2[cTranBuffPtr2][cTranBuffNum2];
cTranBuffNum2++;
os_wait(K_SIG, 0x00, 0x00);
}
//清除發(fā)送完畢的數(shù)據(jù)
memset(&cTranBuff2[cTranBuffPtr2][0], 0x00, TRAN_LENGTH2);
cTranBuffPtr2 = (cTranBuffPtr2+1) % TRAN_GRUOP2;
cTranBuffCnt2 --;
}
else
os_wait(K_TMO, T10MS, 0x00);
}
}
/*===============================================================
功能:寫入調(diào)試信息
參數(shù):type-類型;buff-數(shù)據(jù);
返回:無(wú)
說(shuō)明:
===============================================================*/
void Write_Debug_Info(uchar* buff, uchar len)
{
uchar _tmp;
if( (cTranBuffCnt2 < TRAN_GRUOP2) && ((len+3) <TRAN_LENGTH2) )
{//緩沖區(qū)還有空間
_tmp = (cTranBuffPtr2+cTranBuffCnt2)%TRAN_GRUOP2; //計(jì)算偏移地址
memset(cTranBuff2[_tmp], 0x00, TRAN_LENGTH2);
cTranBuff2[_tmp][0] = len+3;
memcpy(&cTranBuff2[_tmp][1], buff, len);
cTranBuff2[_tmp][len+1] = 0x0D;
cTranBuff2[_tmp][len+2] = 0x0A;
cTranBuffCnt2++;
}
}
/*===============================================================
功能:設(shè)置任務(wù),完成組號(hào)的設(shè)定和讀取
參數(shù):
返回:
說(shuō)明:組號(hào)從地址0x8000開始放置,每個(gè)組號(hào)共五個(gè)漢字
總共16組
===============================================================*/
void Config_Task(void) _task_ CONFIG_TASK_ID
{
static uchar xdata _tmp;
static uchar xdata _buff[160];
while(1)
{
os_wait(K_SIG, 0x00, 0x00);
//去除回車符
cRecvBuff2[cRecvBuffNum2-1] = 0x00;
cRecvBuff2[cRecvBuffNum2-2] = 0x00;
_tmp = (cRecvBuff2[2]-'0')*10 +cRecvBuff2[3] - '0';
}
}
/*===============================================================
功能:
參數(shù):
返回:
說(shuō)明:
===============================================================*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -