作為1553B總線通訊軟體,軟體主要目的就是控制總線控制器BC和遠端終端RT之間的資料交換。
本實驗所用的闆卡為EXC—PCI/MCH-1,相關資料可在官網下載下傳:http://www.mil-1553.com。
//1553B_RT.CPP
#include <iostream>
using namespace std;
#include <stdio.h>
#include <conio.h>
/***API函數頭檔案包含***/
#include "Proto_mch.h"
#include "deviceio.h"
#include "error_devio.h"
#include "Error_mch.h"
#include "exc4000.h"
#include "excdef.h"
#include "excsysio.h"
#include "flags_mch.h"
#include "Instance_mch.h"
#include "mchIncl.h"
#include "mem_mch.h"
#include "Proto_mch.h"
#include "Proto_mch_back.h"
usint ttag;
DWORD MuxIsr(int param);
unsigned int numints=0, oldnumints = -1;
int handle;
BYTE shadowByte;
ULONG uInterruptsTotal, uInterrupts[8];
/*******1553B——RT用戶端主程式********/
int main()
{
HANDLE hThreadMuxIsr; // Thread commIsr handle
DWORD threadIdMuxIsr; // ID of thread commIsr
WORD rtdatablk[32] ={0x1111,0x2222,0x3333};//RT待接收資料
WORD dataoutblk[32]={0x1111,0x2222,0x3333};//RT待發送資料
WORD * rtdata=rtdatablk; //RT待接收數組指針
WORD * dataout=dataoutblk; //RT待發送數組指針
int Send_wdcnt=3; //發送資料個數
int Recv_wdcnt=3; //接收資料個數
char errstr[255]; //錯誤資訊字元
usint device_num=29; //闆卡通道:MCH-1
usint module_num=0; //闆卡子產品
short mode=RT_MODE_MCH; //闆卡工作模式:RT
int handle=Init_Module_MCH(device_num,module_num);//初始化
if(handle<0)
{
Get_Error_String_MCH(handle, 255, errstr);
cout<<"Error:"<<errstr<<endl;//MFC轉換為彈窗顯示
getchar();//Enter鍵退出程式
exit(0);//退出程式
}
Set_Mode_MCH(handle,mode); //工作模式設定
Set_RT_Num_MCH(handle, 1); //設定RT位址:1
Set_Subaddr_Int_MCH(handle, 1,RECEIVE,STANDARD_CMD,ACCESS); //設RT1_1收資料
Set_Subaddr_Int_MCH(handle, 2,TRANSMIT,STANDARD_CMD,ACCESS);//設RT1_2發資料
Load_Datablk_MCH (handle,2,Send_wdcnt,dataout);//載入資料到RT1_2
Set_Interrupt_Mask_MCH(handle, SUBAD);//允許中斷
Run_RT_MCH(handle);
hThreadMuxIsr = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MuxIsr, (LPVOID) 1,
CREATE_SUSPENDED, &threadIdMuxIsr);//建立線程
if ((hThreadMuxIsr == NULL))
{ // failed to create some thread
cout<<"Error on thread creation:"<<GetLastError()<<endl;
Release_Module_MCH(handle);
getchar();
exit(-1);
}
ResumeThread(hThreadMuxIsr);// Start up the threads
while (1)
{
if (numints != oldnumints)
{
oldnumints = numints;
Read_Datablk_MCH (handle,1,Recv_wdcnt,rtdata,STANDARD_CMD,RECEIVE);
cout<<rtdatablk[0]<<"_"<<rtdatablk[1]<<"_"<<rtdatablk[2] <<endl;//接收資料顯示
}
if (kbhit())
{
TerminateThread(hThreadMuxIsr, 0);
getchar();
break;
}
}
Stop_Card_MCH(handle); //停止闆卡運作函數
Release_Module_MCH(handle);//釋放闆卡資源函數
getchar();
return 0;
}
DWORD MuxIsr(int param)
{
WORD rcvbuf[34];
while (param) /* use param for TRUE */
{
Wait_For_Interrupt_MCH(handle, INFINITE);
numints++;
Peek_Register_MCH(handle, 0xe/2, &ttag);
/* get the data from subaddress 2 of the receiver */
Read_Datablk_MCH (handle, 1, 0, rcvbuf,STANDARD_CMD, RECEIVE);
}
return(0);
}