15,471
社区成员
发帖
与我相关
我的任务
分享
//定义消息
#define WM_RECVDATA WM_USER+1
//创建的线程和主进程共用窗口
struct RECVPARAM
{
HWND hwnd;
};
afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);//消息响应函数原型声明
ON_MESSAGE(WM_RECVDATA,OnRecvData)//消息映射
//下面这段代码放在初始化中的
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->hwnd=m_hWnd;
hThread = CreateThread(NULL,0,ReadDataProc,(LPVOID)pRecvParam,
CREATE_SUSPENDED,//串口还没打开,故该线程暂时不运行
NULL);
CloseHandle(hThread);
DWORD WINAPI CSerialRS232Dlg::ReadDataProc(LPVOID lpParameter)
{
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
delete lpParameter;
CString RecvData;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
COMSTAT ComStat;
DWORD dwErrorFlags;
char str[100];
memset(str,'\0',100);
DWORD dwBytesRead=100;//读取的字节数
BOOL bReadStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
while(true)
{
bReadStat=ReadFile(hCom,str,
dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
}
}
//把接收到的数据以字符的形式保存到文件,每一行以"\n"结束
RecvData = str;
if(!RecvData.IsEmpty())//收到非空的数据时保存
{
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)str);
memset(str,'\0',100);
}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
}
return 0;
}
void CSerialRS232Dlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
FILE *fpData;//保存收到的数据
CString ErrorCode;
CString sTime,strSend;
strSend = (char *)lParam;
if((fpData = fopen("data.txt","a+")) == NULL)
{
ErrorCode.Format("Open data.txt error!");
return -1;
}
if(fprintf(fpData,"%s\n",strSend) == NULL)
{
ErrorCode.Format("Appending data error!");
return -1;
}
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
sTime.Format("%d.%d.%d %02d:%02d:%02d Sending Command:%s\r\n",sysTime.wYear,sysTime.wMonth,sysTime.wDay,
sysTime.wHour,sysTime.wMinute,sysTime.wSecond,strSend);
m_Message.SetSel(-1,-1);
m_Message.ReplaceSel(sTime);
}
hCom = CreateFile(m_strCurrentCom,//打开当前端口
GENERIC_READ|GENERIC_WRITE,//读写
0,//独占
NULL,
OPEN_EXISTING,//打开
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//重叠
NULL);