MFC简单线程使用

线程并不是MFC的,只是为了分类,所有加个标题,望误解

因为上篇说到串口,那就离不开线程了,

第一,需要不断刷新串口接收的数据

第二,需要不断刷新串口连接状态(必要时自动断开和连接)

那么就需要2个线程来服务这个串口了

这里使用简单的创建方法,和linux的c线程类似

//子线程函数  
DWORD WINAPI ThreadFun(LPVOID pM)  
{  
		while(1)
		{
		if(hCom!=NULL)
		OnBnClickedRecv();
		else
		{
			while(!OnBnClickedInit());
			cout<<"重新连接完成"<<endl;
		}
		//Sleep(20);
		}
} 

 HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);  
这样就把一个线程跑起来了。

下面还是给一个完整的串口程序吧,可以实时接收串口数据,可以发送数据,可以自动重新连接,不过是控制台的,也没有封装。


// ConsoleA-串口.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "windows.h"
#include "iostream"

using namespace std;

HANDLE hCom;  //全局变量,串口句柄


bool OnBnClickedInit()
{
	hCom=CreateFile( _T("COM3"),
      GENERIC_READ|GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      0,
      NULL);
 if(hCom==(HANDLE)-1)
 {
//  MessageBox(_T("打开COM 失败!"));
	 cout<<"打开COM 失败!"<<endl;
  return false;
 }
 else
 {
	//  MessageBox(_T("打开COM 成功!"));
	  cout<<"打开COM 成功!"<<endl;

 }
			 SetupComm(hCom,100,100);//输入缓冲区和输出缓冲区的大小都是1024
			 COMMTIMEOUTS TimeOuts;
			 //设定读超时
			 TimeOuts.ReadIntervalTimeout=MAXDWORD;
			 TimeOuts.ReadTotalTimeoutMultiplier=0;
			 TimeOuts.ReadTotalTimeoutConstant=0;
			 //在读一次输入缓冲区的内容后读操作就立即返回,
			 //而不管是否读入了要求的字符.
			 //设定写超时
			 TimeOuts.WriteTotalTimeoutMultiplier=100;
			 TimeOuts.WriteTotalTimeoutConstant=500;
			 SetCommTimeouts(hCom,&TimeOuts);//设置超时
			 DCB dcb;
			 GetCommState(hCom,&dcb);
			 dcb.BaudRate=115200;//波特率为9600
			 dcb.ByteSize=8;//每个字节有8 位
			 dcb.Parity=NOPARITY;//无奇偶校验位
			 dcb.StopBits= ONE5STOPBITS;//两个停止位
			 SetCommState(hCom,&dcb);
			 PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); 
return true;
	// TODO: 在此添加控件通知处理程序代码
}



BOOL Write_Byte(char ch)
{
	 DWORD dwBytesWrite=0;
	 COMSTAT ComStat;
	 DWORD dwErrorFlags;
	 BOOL bWriteStat;
	 ClearCommError(hCom,&dwErrorFlags,&ComStat);
	 bWriteStat=WriteFile(hCom,&ch,1,&dwBytesWrite,NULL);
	 if(!bWriteStat)
	 {
	  //MessageBox(_T("写串口失败!"));
		 printf("写串口失败!\n");
		  CloseHandle( hCom ); 
		  hCom=NULL;
		 return false;
	 } 
	return true;
}

void OnBnClickedRecv()
{

char str[100];
char ch;
 memset(str,'\0',100);
 DWORD wCount=0;//读取的字节数
 BOOL bReadStat;
 bReadStat=ReadFile(hCom,&ch,1,&wCount,NULL);

 if(!bReadStat)
 {
  cout<<"读失败!"<<endl;
 //  printf("写串口失败!\n");
	 CloseHandle( hCom ); 
	 hCom=NULL;
 }
 else
 {
	if(ch-'0'!=-100)
	 cout<< ch;
	// MessageBox(_T("读串口成功!"));
 }
  
	
	// TODO: 在此添加控件通知处理程序代码
}

//子线程函数  
DWORD WINAPI ThreadFun(LPVOID pM)  
{  
		while(1)
		{
		if(hCom!=NULL)
		OnBnClickedRecv();
		else
		{
			while(!OnBnClickedInit());
			cout<<"重新连接完成"<<endl;
		}
		//Sleep(20);
		}
}  

int _tmain(int argc, _TCHAR* argv[])
{
	OnBnClickedInit();
	 HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);  
	while(1)
	{
		char ch=getch();
		if(hCom!=NULL)Write_Byte(ch);
	}
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值