最近在做一個串口通信實驗,串口終端是用mscomm控制元件的MFC寫的,遇到的問題如下:
(1) 使用Vitual Serial Port工具測時,收發資料沒問題
(2) 與STM32開發板通信時,只能發資料,接收資料時由于觸發不了OnComm事件,所以接收不到資料
(3) 將串口轉USB模塊的TX與RX短接測驗時,串口終端可發資料,但不會觸發OnComm事件。
不知道怎么解決這個問題?
OnCommon事件我是在添加msmcomm控制元件時創建的。這部分應該沒問題的。

部分代碼附錄如下:
void CTerminalDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控制元件通知處理程式代碼
// TODO: 在此添加控制元件通知處理程式代碼
int nSel;
nSel = m_comboCom.GetCurSel();//獲取組合框控制元件的串列框中選中項的索引
m_CtrlComm.put_CommPort(nSel+1);//選擇串口號(這里因為串列框的索引號是從0開始,所以(nSel+1)對應的才是我們所選的串口號)
//設定串口
m_CtrlComm.put_InBufferSize(1024); //接收快取區大小
m_CtrlComm.put_OutBufferSize(1024); //發送快取區大小
m_CtrlComm.put_InputLen(0); //設定當前接收區資料長度為0
m_CtrlComm.put_InputMode(1);//輸入模式選為二進制
m_CtrlComm.put_RThreshold(1); //引數1表示每當串口接識訓沖區中有多于或等于1個字符時將引發一個接收資料的OnComm事件
m_CtrlComm.put_Settings(_T("115200,n,8,1"));//設定串口引數,波特率,無奇偶校驗,位停止位,位資料位
m_CtrlComm.put_PortOpen(TRUE);//打開串口
if(m_CtrlComm.get_PortOpen())
{
//點亮指示燈
m_cstatSerial.SetIcon(m_hIconLedON);
m_setOK = true; //標記串口設定OK
}
else
MessageBox(_T("串口打開失敗!"));
}
BEGIN_EVENTSINK_MAP(CTerminalDlg, CDialogEx)
ON_EVENT(CTerminalDlg, IDC_MSCOMM, 1, CTerminalDlg::OnCommMscomm, VTS_NONE)
END_EVENTSINK_MAP()
void CTerminalDlg::OnCommMscomm()
{
// TODO: 在此處添加訊息處理程式代碼
VARIANT variant_inp; //Variant 是一種特殊的資料型別,除了定長String資料及用戶定義型別外,可以包含任何種類的資料。
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設定BYTE陣列 An 8-bit integer that is not signed.
CString strtemp;
if(m_CtrlComm.get_CommEvent() == CMscomm::comEvReceive) //事件值為2表示接識訓沖區內有字符
{
////////以下你可以根據自己的通信協議加入處理代碼
variant_inp = m_CtrlComm.get_Input(); //讀緩沖區
safearray_inp = variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len = safearray_inp.GetOneDimSize(); //得到有效資料長度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型陣列
for(k=0;k<len;k++) //將陣列轉換為Cstring型變數
{
BYTE bt = *(char*)(rxdata+k);//字符型
strtemp.Format(_T("%c"),bt); //將字符送入臨時變數strtemp存放
m_strRXData += strtemp; //加入接收編輯框對應字串
}
m_strRXData += _T("\r\n"); //顯示完資料后自動換行
}
UpdateData(FALSE); //更新編輯框內容
}
void CTerminalDlg::OnBnClickedBtnSend()
{
// TODO: 在此添加控制元件通知處理程式代碼
if (m_setOK == true) //判斷是否打開并初始化串口
{
UpdateData(TRUE); //讀取編輯框內容
m_CtrlComm.put_Output(COleVariant(m_strTXData)); //發送資料
m_strTXData.Empty(); //清空輸入框
UpdateData(FALSE); //更新輸入框內容
}
else
{
MessageBox(_T("請先選擇COM口"));
}
}
uj5u.com熱心網友回復:
程式我看了下沒有問題 你是自發自收測驗的嗎 你用串口助手看看能不能收到 加斷點在接受函式那邊 緩沖區有資料會自動觸發接收函式uj5u.com熱心網友回復:
加斷點除錯過了,用串口除錯助手測沒有問題的,但是單片機發資料就是觸發不了OnComm事件uj5u.com熱心網友回復:
通過除錯發現,將串口模塊的TX與RX短接,發送資料時,可以進入到OnCommMscomm()函式,即可以觸發接收資料事件,但執行到這行陳述句: variant_inp = m_CtrlComm.get_Input(); //讀緩沖區系統就會自動退出,并拋出兩個例外,情況和下面一樣:

當我將該軟體在別人機器上面測驗時又可以正常收發資料,好奇怪呀?
uj5u.com熱心網友回復:
重裝系統試試
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/125143.html
標籤:網絡編程
上一篇:句柄的作用?或者說好處?
