天天看点

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();//回车键退出程序
	    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);
}
           

继续阅读