天天看點

1553B通訊軟體設計BC用戶端

作為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>