LabWindows多线程实现串口读写

多线程方式,实现串口读写

#include <rs232.h>
#include <utility.h>
#include "toolbox.h"
#include <cvirte.h>
#include <userint.h>

#include <WxpFunction.h>
#include "mainWindow.h"


//线程开始标记,值为1时开始多线程
int threadID=0;

static int startflag = 0;
//传递所创建线程的callbackData参数
static void   *threadfunctiondata = "这是一个多线程的示例!";
//声明多线程回调函数
int CVICALLBACK ThreadFunction (void *functionData);

static int panelHandle;

int portNum = 3;
int baudRate = 19200;
int parity = 0;
int dataBits = 7;
int stopBits = 1;
int portOpenFlag = 0;

int sendDataLen = 0;
char sendData[512];
volatile int sendDataFlag = 0;

char receiveData[513];
int receiveLen=0;
volatile int packetComDataFlag = 0;

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "mainWindow.uir", MainPanel)) < 0)
		return -1;

	//创建一个线程函数
	CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction, threadfunctiondata, &threadID);

	DisplayPanel (panelHandle);

    //设置STRIPCHART属性标题
    SetTraceAttributeEx(panelHandle, PANEL_STRIPCHART,1,ATTR_TRACE_LG_TEXT,"通道1"); 
	RunUserInterface ();

	//等待线程执行,直到结束
	CmtWaitForThreadPoolFunctionCompletionEx (DEFAULT_THREAD_POOL_HANDLE, threadID,
			OPT_TP_PROCESS_EVENTS_WHILE_WAITING, CMT_WAIT_FOREVER);
	//释放线程函数
	CmtReleaseThreadPoolFunctionID (DEFAULT_THREAD_POOL_HANDLE, threadID);

	DiscardPanel (panelHandle);
	return 0;
}

//多线程回调函数
int CVICALLBACK ThreadFunction(void *functionData)
{

	double result;

	while(startflag == 1)
	{
		result = Random(-10,10);

		Delay(0.02);

		//发送数据
		if(sendDataFlag==1)
		{
			ComWrt(portNum,sendData,sendDataLen);
			sendDataFlag=0;
			//	FlushOutQ(portNum);
		}

		//接收数据
		receiveLen = GetInQLen(portNum);
		if(receiveLen > 0)
		{
			//超过512字节,则按512字节接收;
			//没有超过,则按实际字节数接收;
			if(receiveLen > 512)
				receiveLen=512;

			ComRd(portNum,receiveData,receiveLen);
			//FlushInQ(portNum);
			SetCtrlVal(panelHandle,MainPanel_ReceiveData,receiveData);
		}
	}

	//退出时,关闭串口
	CloseCom(portNum);
	return 0;
}


int CVICALLBACK mainFunction (int panel, int event, void *callbackData,
							  int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:

			startflag=0;

			QuitUserInterface(0);

			break;
	}
	return 0;
}

int CVICALLBACK SendData (int panel, int control, int event,
						  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:

			if(startflag==1)
			{
				GetCtrlVal(panelHandle,MainPanel_SendData,sendData);
				sendDataLen = strlen(sendData);
				sendDataFlag = 1;
			}
			else
				MessagePopup("提醒","请先打开串口");

			break;
	}
	return 0;
}

int CVICALLBACK TimerFunction (int panel, int control, int event,
							   void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_TIMER_TICK:


			WxpIntTest= rand();
			char tt[100];
			sprintf(tt,"%d",Declare_Your_Functions_Here (rand())) ;

			SetCtrlVal(panelHandle,MainPanel_SendData,tt);

			SetCtrlVal(panelHandle,MainPanel_waterwww,sqrt(rand()%100));

			break;
	}
	return 0;
}

int CVICALLBACK ConfigSerial (int panel, int control, int event,
							  void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			int ret = OpenComConfig(portNum,"",baudRate,parity,dataBits,stopBits,512,512);
			char tt[300];
			sprintf(tt,"%s",GetRS232ErrorString(ret) );
			if(ret < 0)
			{
				portOpenFlag = 0;
				MessagePopup("msg",tt);
			}
			else
			{
				MessagePopup("msg","success");
				portOpenFlag = 1;

				startflag = 1;     //线程标志位  值为1时,表示线程开始
				CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadFunction, threadfunctiondata, &threadID);

				SetCtrlAttribute(panelHandle,MainPanel_COMMANDBUTTON_2,ATTR_VISIBLE,0);
				// SetCtrlAttribute(panelHandle,MainPanel_COMMANDBUTTON_2,ATTR_ENABLED,1);
			}

			break;
	}
	return 0;
}

增加一个串口获取函数

//==========================================================================
/*
 #include <windows.h>
 #include <winreg.h>
 * 功  能: 通过访问注册表获得串口号。
 * 参  数:二维数组用来存放返回数组   
 * 返回值:返回-1失败,返回0成功
 */
static int GetComNum(char strSerialList[256][25], int *comNum)
{
	char Name[25];
	int i = 0;
	unsigned char szPortName[25];
	long Status = 0.0;
	int dwIndex = 0;
	int dwName;
	int dwSizeofPortName;
	int Type;
	HKEY hKey; 						 								//返回注册表项的句柄
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM\\", 0, KEY_READ, &hKey) != ERROR_SUCCESS) //打开注册表
		return -1;
	dwName = sizeof(Name);
	dwSizeofPortName = sizeof(szPortName);
	while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
	{
		Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type, szPortName, &dwSizeofPortName); //列举注册表的值
		if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
		{
			strcpy(strSerialList[i], (const char*)szPortName);       // 串口字符串保存
			i++;
		}
		dwName = sizeof(Name); 
		dwSizeofPortName = sizeof(szPortName); 
	}
	*comNum = i;
	RegCloseKey(hKey);												//关闭注册表
	return 0;	
}

int CVICALLBACK GetComm (int panel, int control, int event,
						 void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
		//	string str;
			char tt[20];
			char strSerialList[256][25];
			int comNum;
			
			int k=GetComNum(strSerialList,&comNum);
			
			sprintf(tt,"%d",comNum);
			if(k==-1)
				MessagePopup("notice","no com");
			else
			{
				for(int i=0;i< comNum;i++)
					MessagePopup("notice",strSerialList[i]); 
			}
			break;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值