?? mbus.c
字號:
#include"mbus.h"
#include <reg52.h>
/**************************串口通信初始化**************************/
void InitSerialcom( void )
{
SCON = 0xD0 ; //UART為模式3,9位數據,第9位用于奇偶校驗,允許接收
TMOD |= 0x20 ; //定時器1為模式2,8位自動重裝
PCON &= 0x7F ; //SMOD=0;
TH1 = 0xFA ; //11.0592MHZ晶振下串口波特率為4800bit/s
IE |= 0x90 ; //使能串口中斷
TR1 = 1 ; //啟動定時器1
TI=1;
//初始化串口接收和發送緩沖區
rxHead = 0;
rxTail = 0;
txHead = 0;
txTail = 0;
}
/************************串口中斷服務函數****************************/
void serial () interrupt 4 using 1
{
if ( RI )
{
RI = 0;
tempData = SBUF; //將數據放入C51寄存器時,計算數據中1的個數,
ACC = tempData; //如果個數為偶數,則P=0,否則P=1,用于奇偶校驗
if( TB8 == P ) //對數據進行偶校驗
{
rxBuf[rxHead] = tempData;
if ( rxHead == rxMax )
{
rxHead = 0;
}
else
{
rxHead++;
}
}
else
{
//如果校驗錯誤,不接收數據
}
}
else if ( TI )
{
TI = 0;
if( txTail != txHead ) //如果緩沖區有數據則發送數據
{
ACC = txBuf[txTail]; //數據放入寄存器A,計算數據的偶校驗,
TB8 = P; //將偶校驗結果放入串口發送的第9位數據位
SBUF = txBuf[txTail];
}
if( txTail == txMax )
{
txTail = 0;
}
else
{
txTail ++;
}
}
}
/****************從串口緩沖區中讀取數據,返回讀取數據的個數**************/
unsigned char SerialcomRead( unsigned char *buf, unsigned char len )
{
unsigned char cnt = 0;
//當緩沖區中有數據時,開始讀<=len個數的數據
while ( ( rxTail != rxHead ) && ( cnt < len ) )
{
*buf ++ = rxBuf[rxTail];
if( rxTail == rxMax )
{
rxTail = 0;
}
else
{
rxTail ++;
}
cnt ++;
}
return cnt;
}
/************向串口發送緩沖區中寫入數據,并發起串口發送數據**************/
unsigned char SerialcomWrite( unsigned char *buf, unsigned char len )
{
unsigned char cnt;
//計算發送緩沖區中可用容量
if( txHead > txTail )
{
cnt = txMax - txHead + txTail + 1;
}
else
{
cnt = txTail - txHead;
}
//如果有足夠的緩沖區空間,則將數據寫入緩沖區
if( cnt >= len )
{
for ( cnt = len; cnt; cnt -- )
{
txBuf[txHead] = *buf++;
if( txHead == txMax )
{
txHead = 0;
}
else
{
txHead ++;
}
}
SBUF = txBuf[txTail];
return len;
}
else
return cnt;
}
/************發送MBUS數據幀,溫度巡回檢測系統只傳遞溫度信息*****/
/*****************所以數據域為一個字節*************************/
unsigned char send_mbus_frame(unsigned char *addr,unsigned char type, unsigned char cntr,unsigned char temperature)
{
unsigned char i;
unsigned char res;
m_frame_buffer[0]=0xFE; //封裝前導字節
m_frame_buffer[1]=0xFE;
m_frame_buffer[2]=0x68; //封裝幀起始符
m_frame_buffer[3]=type; //封轉儀表類型
for( i=0;i<7;i++) //封裝七個字節的地址
{
m_frame_buffer[4+i]=*addr++;
}
m_frame_buffer[11]=cntr; //封轉控制碼
m_frame_buffer[12]=1; //數據長度,一個字節
m_frame_buffer[13]=temperature; //溫度
m_frame_buffer[14]=0x16; //幀結束符
res =SerialcomWrite(m_frame_buffer,15); //發送MBUS幀
return res;
}
/************接收MBUS數據幀,溫度巡回檢測系統只傳遞溫度信息*****/
/*****************所以數據域為一個字節*************************/
unsigned char receive_mbus_frame(unsigned char *addr,unsigned char *type, unsigned char *cntr,unsigned char *temperature)
{
unsigned char i=0;
unsigned char res=0;
SerialcomRead(m_frame_buffer,15);//從緩沖區讀取MBUS幀
//讀到一個完整的MBUS幀
if(m_frame_buffer[0]==0xFE&&m_frame_buffer[1]==0xFE&&m_frame_buffer[15]==0x16)
{
*type=m_frame_buffer[3]; //讀取儀表類型
for( i=0;i<7;i++) //讀取七個字節的地址
{
*addr=m_frame_buffer[4+i];
*addr++;
}
*cntr= m_frame_buffer[11];//讀取控制碼
*temperature= m_frame_buffer[13];//讀取數據
res==15;
}
else
res=0;
return res;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -