作為1553B總線通訊軟體,軟體主要目的就是控制總線控制器BC和遠端終端RT之間的資料交換。
本實驗所用的闆卡為EXC—PCI/MCH-1,相關資料可在官網下載下傳:http://www.mil-1553.com。
<span style="font-family:KaiTi_GB2312;font-size:18px;">//1553B_BC.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"
int handle;
int numints = 0;
unsigned long Sys_Interrupts = 0;
unsigned long Tot_Sys_Interrupts = 0;
DWORD MUX_ISR(short Param);
/*1553B——BC用戶端主程式*/
int main()
{
HANDLE hThreadMuxIsr; // Thread commIsr handle
DWORD threadIdMuxIsr; // ID of thread commIsr
WORD bcdatablk[34] = {0x0000};//BC待發送資料塊數組
WORD datainblk[34] = {0x0000};//BC待接收資料塊數組
WORD * bcdata = bcdatablk; //定義數組指針bcdata
WORD * datain = datainblk; //定義數組指針datain
usint device_num=29; //闆卡通道:MCH-1
usint module_num=0; //闆卡子產品:0
usint cmdnum =0 ; //指令号初始化
char errstr[255]; //錯誤資訊字元
int Send_wdcnt=3; //發送資料個數
int Recv_wdcnt=3; //接收資料個數
struct CMDENTRY entry; //指令棧入口
short mode=BC_MODE_MCH; //闆卡工作模式:BC
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); //工作模式設定
entry={0,0,0,0,0,0,0,0}; //指令棧初始化
entry.control = SENDMSG | CW_BUS_A;//Bus_A
entry.command1 = 0x0820+Send_wdcnt;//BC向RT1_1發3個資料
entry.datablk = 0; //使用資料塊0存放
Set_BC_Cmd_MCH(handle, 0, &entry);//cmdnum=0
entry.command1 = 0x0C40+Recv_wdcnt;//RT1_2向BC發3個資料
entry.datablk = 1; //使用資料塊1存放
Set_BC_Cmd_MCH(handle, 1, &entry);//cmdnum=1
Load_BC_Datablk_MCH(handle, 0,Send_wdcnt,bcdata);//加載資料
Set_Interrupt_Mask_MCH(handle, 0x0002);
hThreadMuxIsr = CreateThread(NULL, 0,//建立線程
(LPTHREAD_START_ROUTINE)MUX_ISR,(LPVOID)1,
CREATE_SUSPENDED, &threadIdMuxIsr);
if ((hThreadMuxIsr== NULL))
{ // check creations
cout<<"Error on Thread creation "<<endl;
exit(-1);
}
SetThreadPriority(hThreadMuxIsr,THREAD_PRIORITY_TIME_CRITICAL);
ResumeThread(hThreadMuxIsr);// Start up the threads
Sleep(4000L); //Make sure that ISR thread is entered
Run_BC_MCH(handle);//發送消息
Sleep(1000L);
Last_BC_Cmdnum_MCH(handle, &cmdnum);//傳回指令入口
Get_BC_Cmd_MCH(handle,0, &entry);//讀‘0’指令塊
cout<<"status from message 0(cmd=0x0823)="<<entry.status1<<endl;//消息0狀态字
Get_BC_Cmd_MCH(handle,1, &entry);//讀'1'指令塊
Read_BC_Datablk_MCH(handle,1, Recv_wdcnt, datain);//接收資料
cout<<"status from message 1(cmd=0x0c23)="<<entry.status1<<endl;//消息0狀态字
cout<<datainblk[0]<<"_"<<datainblk[1]<<"_"<<datainblk[2] <<endl;//接收資料顯示
Stop_Card_MCH(handle); //停止闆卡運作函數
Release_Module_MCH(handle);//釋放闆卡資源函數
/*錯誤檢測處理子產品
if(error<0)
{ //char errstr[255];//main函數開始部分
Get_Error_String_MCH(error, 255, errstr);
//cout<<"Error:"<<errstr<<endl;//MFC轉換為彈窗顯示
exit(0);//退出程式
}*/
getchar();
return 0;
}
DWORD MUX_ISR(short Param)
{
int prev_total;
while (Param)
{
Wait_For_Interrupt_MCH(handle, INFINITE);
prev_total = Tot_Sys_Interrupts;
Get_Interrupt_Count_MCH(handle, &Tot_Sys_Interrupts);
Sys_Interrupts=Tot_Sys_Interrupts-prev_total;
numints++;
}
return (0);
}
</span>