16,471
社区成员
发帖
与我相关
我的任务
分享
LONG CDDAAnalyzerDlg::OnSerialPortCommunication(WPARAM ch, LPARAM port)
{
str_myCommTemp.Format("%X", ch);
//遍历串口资源
for (int i = 0; i < COMMNUMBER; i++)
{
if (my_stuComm.b_comm[i])//已打开的串口
{
if (port == my_stuComm.i_commNum[i])//找对应的串口号
{
是这一句 my_stuComm.str_comm[i] += str_myCommTemp;//收到数据
my_stuComm.i_timeCount[i] = (int)TIMEOUT;//重置定时器计数
break;
}
}
}
return 0;
}
这个结构体
struct my_comminfo
{
int i_commNum[COMMNUMBER];//打开过的串口号
BOOL b_comm[COMMNUMBER];//与之对应的串口打开标志
CSerialPort my_SerialPort[COMMNUMBER];//串口资源对象
CString str_comm[COMMNUMBER];//串口收到数据
int i_timeCount[COMMNUMBER];//定时器计数
};
my_comminfo my_stuComm;
str_myCommTemp;//这是个Cstring类型成员变量
//调试崩溃断点
extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
const void * pUserData
)
{
if (!pUserData)
return FALSE;
if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
return FALSE;
return HeapValidate( _crtheap, 0, pHdr(pUserData) );
}//断点在这
//定时器处理
void CALLBACK CDDAAnalyzerDlg::my_TimeEvent(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
CDDAAnalyzerDlg* mainDlg = (CDDAAnalyzerDlg*)dwUser;
for (int i = 0; i < COMMNUMBER; i++)
{
if (mainDlg->my_stuComm.i_timeCount[i] <= 0 && mainDlg->my_stuComm.b_comm[i])//串口定时器计数小于等于0 //串口是打开的
{
//处理串口数据
if (mainDlg->my_stuComm.str_comm[i] != "")//串口有数据
{
mainDlg->str_myTimerComm.Format("COM%dRecv:%s", mainDlg->my_stuComm.i_commNum[i], mainDlg->my_stuComm.str_comm[i]);
mainDlg->DataDisplay(mainDlg->str_myTimerComm);///???
mainDlg->my_stuComm.str_comm[i].Empty();//清空
}
}
mainDlg->my_stuComm.i_timeCount[i]--;//定时器计数减1
}
}
我该怎么处理呢,我已经有定时器计数来控制了,再加个互斥变量?//串口消息响应
LONG CDDAAnalyzerDlg::OnSerialPortCommunication(WPARAM ch, LPARAM port)
{
str_myCommTemp.Format("%X", ch);
//遍历串口资源
for (int i = 0; i < COMMNUMBER; i++)
{
if (my_stuComm.b_comm[i])//已打开的串口
{
if (port == my_stuComm.i_commNum[i])//找对应的串口号
{
my_stuComm.b_strcomm[i] = FALSE;
my_stuComm.str_comm[i] += str_myCommTemp;//收到数据
my_stuComm.b_strcomm[i] = TRUE;
my_stuComm.i_timeCount[i] = (int)TIMEOUT;//重置定时器计数
break;
}
}
}
return 0;
}
//定时器处理
void CALLBACK CDDAAnalyzerDlg::my_TimeEvent(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
CDDAAnalyzerDlg* mainDlg = (CDDAAnalyzerDlg*)dwUser;
for (int i = 0; i < COMMNUMBER; i++)
{
if (mainDlg->my_stuComm.i_timeCount[i] <= 0 && mainDlg->my_stuComm.b_comm[i])//串口定时器计数小于等于0 //串口是打开的
{
//处理串口数据
if (mainDlg->my_stuComm.str_comm[i] != "" && mainDlg->my_stuComm.b_strcomm[i])//串口有数据 //互斥变量判断
{
mainDlg->str_myTimerComm.Format("COM%dRecv:%s", mainDlg->my_stuComm.i_commNum[i], mainDlg->my_stuComm.str_comm[i]);
mainDlg->DataDisplay(mainDlg->str_myTimerComm);///???
//mainDlg->my_stuComm.str_comm[i].Empty();//清空
mainDlg->my_stuComm.str_comm[i] = "";
}
}
mainDlg->my_stuComm.i_timeCount[i]--;//定时器计数减1
}
}
不知道我这样加的锁对不对