线程并不是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;
}