多线程方式,实现串口读写
#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;
}