大家好:
我在VS2010上撰寫了一個串口通信程式,然后用STM32開發板通過USB轉串口向COM3間隔1秒發送0x55,經過除錯發現程式在variant_inp = m_mscomm.get_Input();這一句出現了例外。但用串口除錯助手可以正常接收0x55。程式代碼如下,煩請大家給些意見:
void CComSet::OnBnClickedButtonComset()
{
// TODO: 在此添加控制元件通知處理程式代碼
int nSel;
CString strMsg;
// 獲取組合框控制元件的串列框中選中項的索引
nSel = m_comboComNum.GetCurSel()+1;
m_mscomm.put_CommPort(nSel); //set com3
m_mscomm.put_InputMode(1);//選擇發送形式為二進制
m_mscomm.put_InputLen(0);//設定當前接收區資料長度
m_mscomm.put_InBufferSize(1024); //設定輸入緩沖區大小
m_mscomm.put_OutBufferSize(1024);//設定輸出緩沖區大小
m_mscomm.put_RThreshold(1);//當串口輸入緩沖區有一個或者一個以上字符時激發ONCOMM事件轉入ONCOMm事件處理程式
//m_mscomm.put_SThreshold(0);//每發送一個字符時,不觸發OnComm事件
m_mscomm.put_Settings(_T("115200,n,8,1"));//設定串口波特率9600,無校驗,8位資料,1個停止位,
if(m_mscomm.get_PortOpen())
{
AfxMessageBox(_T("串口不存在或者被其他應用程式占用!"));
} //檢查串口狀態,如果是打開的就把它關掉
else
{
m_mscomm.put_PortOpen(TRUE);
m_mscomm.get_Input();//預讀,清慷訓沖區
strMsg.Format(_T("the com%d is ready!"),nSel);
AfxMessageBox(strMsg);
}
}
BEGIN_EVENTSINK_MAP(CComSet, CDialogEx)
ON_EVENT(CComSet, IDC_MSCOMM1, 1, CComSet::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()
void CComSet::OnCommMscomm1()
{
// TODO: 在此處添加訊息處理程式代碼
//VARIANT variant_inp;
COleVariant variant_inp;
COleSafeArray safearray_inp;
int nEvent = 0;
long len=0,i=0;
BYTE bt = 0;
CString str;
CString strtemp; //定義CString變數
nEvent = m_mscomm.get_CommEvent();
switch(nEvent)//值為2時骸表括示接識訓沖區有效字符
{
case EV_RXFLAG:
variant_inp = m_mscomm.get_Input();
str.Format(_T("nEvent2=%d"),nEvent);
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for(i = 0; i< len; i++)
{
safearray_inp.GetElement(&i, &bt);
strtemp.Format(_T("%c"), bt);
str += strtemp;
}
AfxMessageBox(str);
break;
}
UpdateData(FALSE);
}
void CComSet::OnBnClickedClosecomm()
{
// TODO: 在此添加控制元件通知處理程式代碼
if(m_mscomm.get_PortOpen())
{
AfxMessageBox(_T("close port!!!"));
m_mscomm.put_PortOpen(FALSE);//關閉串口
}
else
{
AfxMessageBox(_T("port is not open!!!"));
}
}
uj5u.com熱心網友回復:
我遇到的和你一樣的問題,至今沒解決uj5u.com熱心網友回復:
void CSanTanGPSProgectDlg::OnCommMscomm1()
{
// TODO: 在此處添加訊息處理程式代碼
VARIANT variant_inp;
COleSafeArray safearryay_inp;
long len, k;
unsigned int data[1024] = {0};
byte rxdata[1024];
CString stremp;
CString m_RecevieCmd = _T("");
CString m_EditReceive = _T("");
if(m_mscomm.get_CommEvent() == 2)
{
Sleep(80);
variant_inp = m_mscomm.get_Input(); //讀緩沖區
safearryay_inp = variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len = safearryay_inp.GetOneDimSize(); //得到有效資料長度
// 接受資料
for(k=0;k<len;k++)
{
safearryay_inp.GetElement(&k,rxdata+k); //轉換為BYTE型陣列
}
Sleep(1);
for (k = 0; k < len; k++)
{
if (!m_bConnect)
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%c", bt); //將字符送入臨時變數strtemp存放
m_EditReceive += stremp;
}
else
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%02X ", bt); //十六進制
m_EditReceive += stremp;
}
}
}
uj5u.com熱心網友回復:
if (!m_bConnect){
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%c", bt); //將字符送入臨時變數strtemp存放
m_EditReceive += stremp;
}
else
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%02X ", bt); //十六進制
}
這一段 你要字符的就用上面的 十六進制的 就else里面的陳述句
uj5u.com熱心網友回復:
我的程式在XP上能運行,很正常,現在換了臺電腦就串口不通信了,mscomm控制元件也注冊成功了,這是什么情況呢?、、
uj5u.com熱心網友回復:
我的程式這win7上面跑一點問題都沒有啊uj5u.com熱心網友回復:
我的程式這win7上面跑一點問題都沒有啊
if (!m_bConnect)
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%c", bt); //將字符送入臨時變數strtemp存放
m_EditReceive += stremp;
}
else
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%02X ", bt); //十六進制
}
這一段 你要字符的就用上面的 十六進制的 就else里面的陳述句
我的程式在XP上能運行,很正常,現在換了臺電腦就串口不通信了,mscomm控制元件也注冊成功了,這是什么情況呢?、、
你是直接把exe拷到
我的程式這win7上面跑一點問題都沒有啊
if (!m_bConnect)
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%c", bt); //將字符送入臨時變數strtemp存放
m_EditReceive += stremp;
}
else
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%02X ", bt); //十六進制
}
這一段 你要字符的就用上面的 十六進制的 就else里面的陳述句
我的程式在XP上能運行,很正常,現在換了臺電腦就串口不通信了,mscomm控制元件也注冊成功了,這是什么情況呢?、、
我的程式這win7上面跑一點問題都沒有啊
if (!m_bConnect)
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%c", bt); //將字符送入臨時變數strtemp存放
m_EditReceive += stremp;
}
else
{
BYTE bt = *(char*)(rxdata + k); //字符型
stremp.Format("%02X ", bt); //十六進制
}
這一段 你要字符的就用上面的 十六進制的 就else里面的陳述句
我的程式在XP上能運行,很正常,現在換了臺電腦就串口不通信了,mscomm控制元件也注冊成功了,這是什么情況呢?、、
你是直接把exe拷到另一臺電腦上,然后注冊上mscomm.ocx就行了嘛?
uj5u.com熱心網友回復:
在64位Windows下:64位exe和dll在目錄c:\windows\system32目錄下;
32位exe和dll在目錄c:\windows\syswow64目錄下;
所以要注意:
在win64位系統下注冊32位ocx或dll需要將32位ocx或dll拷貝到c:\windows\syswow64\目錄下。
且注冊要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/126457.html
標籤:基礎類
