⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adtdemo.cpp

📁 本程序为盛博ADT系列接口系列的实例程序
💻 CPP
字号:
#include <afxwin.h> 
#include <windows.h>
#include "resource.h"
#include "math.h"
#include "iostream.h"
#include "shlwapi.h"
#include "sbsadtdef.h"
#include "sbsadtd.h"

#define ID_TIMER    1//设定一个定时器的ID值
/*
//_ADTDEMO_MODE_1_	软件触发AD,AD完成转换触发中断  
//_ADTDEMO_MODE_2_	硬件时钟触发AD,FIFO半满触发中断
*/
#define _ADTDEMO_MODE_1_
#define _ADTDEMO_MODE_2_

BYTE m_nADTVxD = 0;
short nTmp = 0;
int  m_nADTNum = 0;
char m_chValue[20];
char TMPBuffer[20];
BOOL m_bRunning = FALSE;
SBSADTB sbscb;
SBSADSETTINGS ADSettings;
SBSCLK CLKSettings;
SBSDIOINT DIOSettings;

float ADValue = 0.0;
short ADChannel = 0;

HANDLE m_hADThread  = 0;  //ADThread
HANDLE m_hEvtThread = 0;  //EvtThread
HANDLE m_hEventAD[10];//   = 0;
DWORD  dwThreadid=0;
unsigned int m_nSec = 0;
BOOL m_bDIOREAD = TRUE;
BOOL m_bClose   = FALSE;
BYTE DIOValue = 0;
BOOL CALLBACK	DlgProc(HWND, WPARAM, WPARAM,LPARAM);
DWORD WINAPI StaADThread(LPVOID lpData);
DWORD WINAPI ServiceEvt(LPVOID lParam);
BOOL InitADTBoard(HWND hDlg);
BOOL FreeADTBroad(HWND hDlg);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	DialogBox(hInstance, (LPCTSTR)IDD_DLG_ADT_DEMO, 0, DlgProc);
	return 0;
}

BOOL CALLBACK DlgProc(HWND hDlg, WPARAM uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) 
	{
		case WM_CLOSE:				//关闭窗口消息
			//卸载设备驱动程序
			if(0!=m_nADTVxD)
				break;
			KillTimer (hDlg, ID_TIMER);	
			//关闭对话框
			EndDialog(hDlg,TRUE);	
			break;

		case WM_TIMER://定时器消息
			if (0!=m_nADTVxD)
				break;
			if (!m_bRunning) break;
		//	sbsDAConvert(m_nADTNum, GetDlgItemInt(hDlg, IDC_COMBO_DA, NULL, FALSE), GetDlgItemInt(hDlg, IDC_EDIT_DA, NULL, FALSE));
			sbsUpDataDA(m_nADTNum);

			/* DIO read 20070111
			if (m_bDIOREAD) 
			{
				sbsDIOInputByte(m_nADTNum, GetDlgItemInt(hDlg, IDC_COMBO_IO, NULL, FALSE), &DIOValue);
				itoa(DIOValue, TMPBuffer, 10);
				SetDlgItemText(hDlg, IDC_EDIT_IO, TMPBuffer);
			}
			else
			{
				sbsDIOOutputByte(m_nADTNum, GetDlgItemInt(hDlg, IDC_COMBO_IO, NULL, FALSE), \
											GetDlgItemInt(hDlg, IDC_EDIT_IO, NULL, FALSE));
			}
			*/
			break;

		case WM_INITDIALOG:	
			m_nADTVxD = sbsInit(2);
			if (m_nADTVxD!=0) 
			{
				MessageBox(hDlg,"Load Device Error","error",MB_OK);
				ExitProcess(1);
				EndDialog(hDlg,TRUE);	//关闭对话框
			}

			SetDlgItemText(hDlg, IDC_EDIT_BASE, "768");
			/*ADT cards list*/
			SetDlgItemText(hDlg, IDC_EDIT_ADT, "ADT680");
		/*	SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT650");
			SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT652");
			SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT860");
			SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)"ADT680");
			SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hDlg, IDC_COMBO_ADTLIST, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
        */
		/*	DIO ports list
			SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_ADDSTRING, (WPARAM)0, (LPARAM)"0");
			SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_ADDSTRING, (WPARAM)0, (LPARAM)"1");
			SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_ADDSTRING, (WPARAM)0, (LPARAM)"2");
			SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hDlg, IDC_COMBO_IO, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hDlg, IDC_COMBO_IO, CBS_SORT, (WPARAM)0, (LPARAM)0);
		*/	
			/*D/A channels list
			for (nTmp=0; nTmp<4; nTmp++)
			{
				char value[8] = {0};
				itoa(nTmp, value, 10);
				SendDlgItemMessage(hDlg, IDC_COMBO_DA, CB_ADDSTRING, (WPARAM)0, (LPARAM)value);
			}
	    	SendDlgItemMessage(hDlg, IDC_COMBO_DA, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hDlg, IDC_COMBO_DA, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hDlg, IDC_COMBO_DA, CBS_SORT, (WPARAM)0, (LPARAM)0);
            */
			/*IRQ NO list*/			
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)0, (LPARAM)"2");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)1, (LPARAM)"5");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)2, (LPARAM)"7");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)3, (LPARAM)"9");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)4, (LPARAM)"10");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)5, (LPARAM)"11");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)6, (LPARAM)"12");
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_ADDSTRING, (WPARAM)7, (LPARAM)"15");			
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_SETITEMDATA, (WPARAM)0, (LPARAM)0);
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CB_SETCURSEL, (WPARAM)2, (LPARAM)0);			
			SendDlgItemMessage(hDlg, IDC_COMBO_IRQ, CBS_SORT, (WPARAM)0, (LPARAM)0);

			/*Initialization variables*/
			m_bRunning = FALSE;
			m_bClose   = FALSE;
			m_bDIOREAD = TRUE;
			
			/*Initialization Dialog*/			
		//	CheckRadioButton(hDlg, IDC_RADIO_READ, IDC_RADIO_WRITE, IDC_RADIO_READ);
			SetDlgItemText(hDlg, IDC_BUTTON_RUN, "Start");
		//	SetDlgItemText(hDlg, IDC_EDIT_DA, "2048");
						
			/****************************************/
			//设置系统定时器
			//为I/O
			/****************************************/
			if (!SetTimer (hDlg, ID_TIMER, 100, NULL))  //  启动定时器
			{
				MessageBox (hDlg, "定时器太多!","error", MB_OK) ;
				return FALSE ;
    		}
			break;

		case WM_COMMAND:
			switch (LOWORD(wParam))
			{
	/*	case IDC_RADIO_READ:
				m_bDIOREAD = TRUE;
				break;
			case IDC_RADIO_WRITE:
				m_bDIOREAD = FALSE;
				break;
       */
			case IDC_BUTTON_RUN:
				GetDlgItemText(hDlg, IDC_BUTTON_RUN, m_chValue, 255);
				if (strcmp(m_chValue, "Start")==0)
				{
					if (!InitADTBoard(hDlg)) return FALSE;
					SetDlgItemText(hDlg, IDC_BUTTON_RUN, "Pause");
#ifdef _ADTDEMO_MODE_2_										
					for (nTmp=0; nTmp<1024; nTmp++)
						sbsADSample(m_nADTNum, &ADValue, &ADChannel);
#endif
					sbsIRQClear(m_nADTNum);
					m_bRunning = TRUE;
					m_bClose   = FALSE;
				}
				else
				{					
					m_bRunning = FALSE;
					m_bClose   = TRUE;
					FreeADTBroad(hDlg);
					SetDlgItemText(hDlg, IDC_BUTTON_RUN, "Start");
				}
				break;
			}
	}
	return FALSE;
}

BOOL InitADTBoard(HWND hDlg)
{
	//线程处理转换
	m_hADThread = CreateThread(NULL,
   							   0,
							   StaADThread,
							   hDlg,
							   CREATE_SUSPENDED,
							   &dwThreadid);
	if (m_hADThread)
	{
		ResumeThread(m_hADThread);
	}
	else
	{
		MessageBox (hDlg, "启动A/D失败!","error", MB_OK) ;
		EndDialog(hDlg,TRUE);
		return FALSE;
	}

	m_hEvtThread = CreateThread(NULL,
   							   0x1000,
							   ServiceEvt,
							   hDlg,
							   CREATE_SUSPENDED,
							   &dwThreadid);
	if (m_hEvtThread)
	{
		ResumeThread(m_hEvtThread);
	}
	else
	{
		MessageBox (hDlg, "启动Event thread失败!","error", MB_OK) ;
		EndDialog(hDlg,TRUE);
		return FALSE;
	}

	/*from dialog get value for run*/
	nTmp = SBS_ADT_860;
/*	GetDlgItemText(hDlg, IDC_COMBO_ADTLIST, m_chValue, 255);
	if (strcmp(m_chValue, "ADT650")==0) 
	{
		nTmp = SBS_ADT_650;
	}
	else if (strcmp(m_chValue, "ADT652")==0) 
	{
		nTmp = SBS_ADT_652;
	}
	else if (strcmp(m_chValue, "ADT700")==0) 
	{
		nTmp = SBS_ADT_700;
	}
	else if (strcmp(m_chValue, "ADT860")==0) 
	{
		nTmp = SBS_ADT_860;
	}
	else if (strcmp(m_chValue, "ADT680")==0) 
	{
		nTmp = SBS_ADT_680;
	}
	else if (strcmp(m_chValue, "ADT800")==0) 
	{
		nTmp = SBS_ADT_800;
	}
	else return FALSE;
*/
	/*Init Board*/
	sbscb.boardtype = nTmp;
	sbscb.base_address = GetDlgItemInt(hDlg, IDC_EDIT_BASE, NULL, FALSE);
	sbscb.DMA_level = 0;
	sbscb.int_level = GetDlgItemInt(hDlg, IDC_COMBO_IRQ, NULL, FALSE);
	m_nADTNum = sbsInitBoard(&sbscb);
	if (m_nADTNum<0) 
	{
		MessageBox(0, "Can't InitBoard with m_nADTNum", "Error", MB_OK);
		return FALSE;
	}

#ifdef _ADTDEMO_MODE_1_
	/*AD Set*/
	ADSettings.sedi = 0;  //单端
	ADSettings.scnint = 2;//0: 9.3us 1: 5.3us 2:AD多通道不自动扫描 
	ADSettings.ADOutType = 0;//AD完成后的输出方式 0:不用FIFO 1:使用FIFO
	ADSettings.ADTrig = 0;   //AD的触发方式  0:软件触发, 1:硬件触发,具体为计数/定时器2(OUT2)触发
	ADSettings.low_channel = 0;
	ADSettings.gain = 1;//1倍增益
	ADSettings.high_channel = 15;
	ADSettings.polarity = 0;//0:双极性  1:单极性
	ADSettings.range = 0;   //0:量程为5V 1:量程10
	sbsADSetConfig(m_nADTNum, &ADSettings);
#endif

#ifdef _ADTDEMO_MODE_2_
	/*AD Set*/
	ADSettings.sedi = 0;  //单端
	ADSettings.scnint = 2;//0: 9.3us 1: 5.3us 2:AD多通道不自动扫描 
	ADSettings.ADOutType = 1;//AD完成后的输出方式 0:不用FIFO 1:使用FIFO
	ADSettings.ADTrig = 1;   //AD的触发方式  0:软件触发, 1:硬件触发,具体为计数/定时器2(OUT2)触发
	ADSettings.low_channel = 0;
	ADSettings.gain = 1;//1倍增益
	ADSettings.high_channel = 15;
	ADSettings.polarity = 0;//0:双极性  1:单极性
	ADSettings.range = 0;   //0:量程为5V 1:量程10
	sbsADSetConfig(m_nADTNum, &ADSettings);
#endif
	/*clock set*/
	CLKSettings.ClkFrq   = 0;
	CLKSettings.ClkDevNo = 0;
	CLKSettings.Clk1Mode = 2;
	CLKSettings.Clk2Mode = 2;
	CLKSettings.Clk3Mode = 2;
	CLKSettings.Clk1Divisor = 60000;
	CLKSettings.Clk2Divisor = 200;
	CLKSettings.Clk3Divisor = 5000;
	sbsCLKSetConfig(m_nADTNum, &CLKSettings);

	/*DIO set*/
	DIOSettings.DIODevNo =0;// GetDlgItemInt(hDlg, IDC_COMBO_IO, NULL, FALSE);
	if (m_bDIOREAD)
	{
		
		DIOSettings.DIOPort1RW = 1;
		DIOSettings.DIOPort2RW = 1;
		DIOSettings.DIOPort3RW = 1;
	}
	else
	{
		DIOSettings.DIOPort1RW = 0;
		DIOSettings.DIOPort2RW = 0;
		DIOSettings.DIOPort3RW = 0;
	}
	sbsDIOSetConfig(m_nADTNum, &DIOSettings);	

	/*Event*/
//	if (m_nADTNum == 0)
	{
	m_hEventAD[m_nADTNum] = CreateEvent(NULL, FALSE, FALSE, NULL);     //*****************响应中断的事件句柄
	if (!m_hEventAD[m_nADTNum])
	{
		MessageBox(0, "Can't create event with m_hEventAD", "Error", MB_OK);
		return FALSE;
	}
	}

	/*irq set*/
	/************************************************************************/
	/*	IRQS1 IRQS0 中断源													*/
	/*	0     0		AD 转换数据有效											*/
	/*	0	  1		计数/定时器0(OUT0)										*/
	/*	1	  0		外部中断(下降沿有效)									*/
	/*	1	  1		计数/定时器1(OUT1)										*/
	/************************************************************************/
	sbsIRQSetConfig(m_nADTNum, 0, m_hEventAD[m_nADTNum]);                        //***********AD转换数据有效
	return TRUE;
}

BOOL FreeADTBroad(HWND hDlg)
{
	sbsFreeBoard(m_nADTNum);
	if (m_hEventAD[m_nADTNum]){
		CloseHandle(m_hEventAD[m_nADTNum]);
		m_hEventAD[m_nADTNum] = NULL;
	}
	sbsIRQClear(m_nADTNum);

	if(m_hADThread)
	{
		CloseHandle(m_hADThread);
		m_hADThread = NULL;
	}

	if(m_hEvtThread)
	{
		CloseHandle(m_hEvtThread);
		m_hEvtThread = NULL;
	}
	return TRUE;
}

DWORD WINAPI ServiceEvt(LPVOID lpData)
{
	HWND hDlg = (HWND)lpData;
	char buffer[512] = {0};
	memset(buffer, 0, sizeof(buffer));
#ifdef _ADTDEMO_MODE_1_
	while (1)
	{
		if (!m_bRunning) continue;
		if (m_bClose) 
		{
			m_bRunning = FALSE;
			break;
		}
		WaitForSingleObject(m_hEventAD[m_nADTNum], INFINITE);  //*****************直到采集到输入信号后返回,否则一直等待
		sbsIRQClear(m_nADTNum);     //  清除中断
		if (m_nSec > 2000000000)	m_nSec = 0;
		memset(m_chValue, 0, sizeof(m_chValue));
		sprintf(m_chValue, "%d", m_nSec);
		SetDlgItemText(hDlg, IDC_EDIT_IRQ, m_chValue);	
		m_nSec++;
	}
#endif
#ifdef _ADTDEMO_MODE_2_
	while (1)
	{
		if (!m_bRunning) continue;
		WaitForSingleObject(m_hEventAD[m_nADTNum], INFINITE);
		sbsIRQClear(m_nADTNum);     //  清除中断
		
		for (short i=0; i<512; i++)
			sbsADSample(m_nADTNum, &ADValue, &ADChannel);       //*******************读AD卡。
		sprintf(buffer, "%f", ADValue);
		SetDlgItemText(hDlg, IDC_EDIT_AD0, buffer);

		if (m_nSec > 2000000000)	m_nSec = 0;
		memset(m_chValue, 0, sizeof(m_chValue));
		sprintf(m_chValue, "%d", m_nSec);
		SetDlgItemText(hDlg, IDC_EDIT_IRQ, m_chValue);	
		m_nSec++;
	}
#endif

	return 0;
}

DWORD WINAPI StaADThread(LPVOID lpData)
{
#ifdef _ADTDEMO_MODE_1_
	char buffer[512] = {0};
	memset(buffer, 0, sizeof(buffer));

	HWND hDlg = (HWND)lpData;
	float ADValue = 0.0;
	signed short ADChannel = 0;
	int nIDEDIT = 0;

	//采用事件驱动
	while (1)
	{
		if (!m_bRunning) continue;
		if (m_bClose) 
		{
			m_bRunning = FALSE;
			break;
		}
		
		/* AD 转换和显示 20070111*/		
		sbsADStartConversion(m_nADTNum);   //  启动A/D变换		

		//Sleep(100);
		while (sbsADConversionDone(m_nADTNum) == 2); //  监测A/D变换是否结束 
		sbsADSample(m_nADTNum, &ADValue, &ADChannel);
		switch(ADChannel) 
		{
		case 0: nIDEDIT = IDC_EDIT_AD0;	break;
		case 1: nIDEDIT = IDC_EDIT_AD1;	break;
		case 2: nIDEDIT = IDC_EDIT_AD2;	break;
		case 3: nIDEDIT = IDC_EDIT_AD3;	break;
		case 4: nIDEDIT = IDC_EDIT_AD4;	break;
		case 5: nIDEDIT = IDC_EDIT_AD5;	break;
		case 6: nIDEDIT = IDC_EDIT_AD6;	break;
	/*	case 7: nIDEDIT = IDC_EDIT_AD7;	break;
		case 8: nIDEDIT = IDC_EDIT_AD8;	break;
		case 9: nIDEDIT = IDC_EDIT_AD9;	break;
		case 10: nIDEDIT = IDC_EDIT_AD10;	break;
		case 11: nIDEDIT = IDC_EDIT_AD11;	break;
		case 12: nIDEDIT = IDC_EDIT_AD12;	break;
		case 13: nIDEDIT = IDC_EDIT_AD13;	break;
		case 14: nIDEDIT = IDC_EDIT_AD14;	break;
		case 15: nIDEDIT = IDC_EDIT_AD15;	break;
		*/
		}
		sprintf(buffer, "%f", ADValue);
		SetDlgItemText(hDlg, nIDEDIT, buffer);
		Sleep(500);			
	}
#endif
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -