串口应用中不能触发OnCommMscomm事件,已居初始化时做m_COM.SetRThreshold(1),发送数据后接收区没有任何显示,跟踪程序发现OnCommMscomm事件不能触发,OnCommMscomm函数根本就没有调用到,不知是什么原因?
解决方案 »
- 怎么更换MFC的图标?
- 求助,帮忙
- 如何刷新tabctrl的内容?解决马上给分
- ▲▲请问如何得到WM_DEVICECHANGE消息
- 有谁对wingate比较了解?
- 如何在创建快捷方式,以及在快捷方式中创建快捷键?
- Win2000 Professional 下谁在用端口80
- 我要压缩一个图片,要求用jpeg2000进行无损压缩,哪里有这样的控件或代码下载?
- 各位庄家:polygon函数要求提供一个POINT*类型的变量,用于画一个闭合的多边形。我现在只能提供一个动态的数组,各元素都是POINT型的,我有什么比较简单的方法可以实现类似polygon函数的功能?千万不要告诉我一个点一个点地去连!
- CListBox的双击消息不响应?
- vc6.0制作的ocx控件在vb中使用的一些怪问题
- vs2008建立服务程序问题
2 波特率是否统一
3 是否关闭端口流控制
4 初始化是否正确,是否正确打开串口
m_ComCtrl.SetCommPort(port_num);
m_ComCtrl.SetSettings("115200,n,8,1");//波特率、校验位、数据位、停止位
m_ComCtrl.SetInputMode(1); //comInputModeBinary
m_ComCtrl.SetRThreshold(1);
m_ComCtrl.SetPortOpen(true);
if (m_COM.GetPortOpen())
{
m_COM.SetPortOpen(FALSE);
} m_COM.SetCommPort(1);
if (!m_COM.GetPortOpen())
{
m_COM.SetPortOpen(TRUE);
m_szStatus = "Open";
UpdateData(FALSE);
GetDlgItem(IDC_OPEN_CLOSE)->SetWindowText("Close");
}
else
{
AfxMessageBox("Can't Open The Serial Port !");
} m_COM.SetSettings("9600,n,8,1");
m_COM.SetInputMode(1);
m_COM.SetRThreshold(1);
// m_COM.SetRTSEnable(1); m_COM.SetInputLen(0);
m_COM.GetInput();// m_COM.SetSThreshold(1); m_nRecvCount = 0;
m_nSendCount = 0;
发送数据:
if (m_COM.GetPortOpen())
{
UpdateData(TRUE);
if (!m_szSendData.IsEmpty())
{
CByteArray hexdata;
int len; len = String2Hex(m_szSendData,hexdata);
m_COM.SetOutput(COleVariant(hexdata));
m_nSendCount += len;
UpdateData(FALSE);
m_COM.GetInput();
}
else
{
AfxMessageBox("No Data to Send !");
}
}
接收数据代码: VARIANT variant_in;
COleSafeArray safearray_in;
LONG len,k;
BYTE rxdata[2048], bt;
CString strtemp;
variant_in = m_COM.GetInput();
safearray_in = variant_in;
len = safearray_in.GetOneDimSize();
for (k = 0; k < len; k++)
{
safearray_in.GetElement(&k,rxdata+k);
}
for (k = 0; k < len; k++)
{
m_nRecvCount++;
bt = *(char*)(rxdata+k);
strtemp.Format("%02X", bt);
m_szRecvData += strtemp;
UpdateData(FALSE);
}
先用串口调试软件测试串口硬件是否正常
可以把DB9的Pin2 Pin3 短接,自发自收试试看
m_Send 是关联了发送编辑框的CString
m_Receive 是关联了接收编辑框的CString
m_ComPort 是关联了CMSComm的 控件变量//打开端口
BOOL CD2Dlg::PortOpen()
{
m_ComPort.SetCommPort(1);
m_ComPort.SetSettings("115200,n,8,1");//波特率、校验位、数据位、停止位
m_ComPort.SetInputMode(1); //comInputModeBinary
m_ComPort.SetRThreshold(1);
m_ComPort.SetPortOpen(true);
return(m_ComPort.GetPortOpen());
}//编辑框输入信息后点击发送
void CD2Dlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(); VARIANT var = COleVariant(m_Send);
m_ComPort.SetOutput(var);
m_Send.Empty();
UpdateData(false);
}//接收响应
void CD2Dlg::OnCommEvent()
{
// TODO: Add your control notification handler code here
switch(m_ComPort.GetCommEvent())
{
case 2:
{
VARIANT var;
var = m_ComPort.GetInput();
TCHAR buff[1024] = {0}; //假设接收不超过1024字节
memcpy(buff,var.parray->pvData,var.parray->rgsabound[0].cElements);
m_Receive += buff;
UpdateData(false);
break;
}
}
}
m_nSendCount += len;
UpdateData(FALSE);
m_COM.GetInput();
。
去掉m_COM.GetInput(); 就可以了。
感谢zgl7903!!!