最近在學習用MFC MSComm介面來寫串口助手,遇到一個問題,發現當串口一直處在資料接收時,剛開始其他button按鍵訊息還能回應,過一會兒其他按鍵訊息也不能回應,接收的位元組數也無法更新,只有接收框內資料在更新,其他界面都無法回應。
網上查資料說需要多執行緒控制,MSComm控制元件如何使用多執行緒來解決這個問題,或是有其他辦法?求高人指點。。。。。。
如下是接收事件部分代碼:
void CSerialCommAppDlg::OnCommMscomm1()
{
// TODO: 在此處添加訊息處理程式代碼
VARIANT m_varInput;
CString strtemp;
COleSafeArray safearray_input;
long len = 0, k = 0;
BYTE RxData[MAX_BUFFER_SIZE];//設定byte陣列MAX_BUFFER_SIZE=2048
strtemp.Empty();
if (m_MSComm.get_CommEvent() == 2)//事件2表示接受緩沖區有字符
{
m_varInput = m_MSComm.get_Input();//讀接識訓沖區
//safearray_input = m_varInput;//variant資料轉換成colesafearray型變數
safearray_input.Attach(m_varInput);
len = safearray_input.GetOneDimSize();//得到有效資料長度
for (k = 0; k<len; k++) //轉換為byte型陣列
safearray_input.GetElement(&k, RxData + k);
if (m_checkHEXShow.GetCheck()) //選擇十六進制顯示
{
for (k = 0; k < len; k++)
{
strtemp.Format(_T("%02X "), *(RxData + k));//將BYTE型陣列轉換成HEX變數
m_editRecieve += strtemp; //加入接收編輯框相應字串
}
}
else
{ //選擇字符顯示
for (k = 0; k < len; k++)
{
strtemp.Format(_T("%c"), *(RxData + k));//將BYTE型陣列轉換成CString型變數
m_editRecieve += strtemp;//加入接收編輯框相應字串
}
}
m_editRecieveNum += len; //接收位元組數計數
m_strRichEditRecieve.Format(_T("接收:%d"), m_editRecieveNum);
UpdateData(false);//更新編輯框內容
//m_ceditRx.SetSel(-1, -1);
//this->SetDlgItemTextW(IDC_EDIT2, m_editRecieve);//將m_EditReceive內容顯示到ID為IDC_EDIT2的編輯框的最后位置
m_ceditRx.LineScroll(m_ceditRx.GetLineCount() - 1, 0);//將垂直滾動條滾動到最后一行
}
}
uj5u.com熱心網友回復:
求大牛指點。。。。。。uj5u.com熱心網友回復:
為什么還沒有人幫忙看看。。。自己頂一下轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/62996.html
上一篇:請問這里面的ID_COMMCTRL是什么型別,代表什么? 還有編譯出錯 'ID_COMMCTRL' : undeclared identifier請問怎么解決
