天天看點

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

作為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);
}
           

繼續閱讀