用MSCOMM控件做上位机的收发问题

QxiaoQQ 2016-03-28 12:52:38
刚刚学习上位机编程,用MSCOMM控件做了一个上位机,用定时器每个100MS发送数据00 55 ba 00 ff 45 每隔100MS发送00 55 fb。
用usb转串口自发自收,收到的应该是55 fb 00 55 ba 00 ff 45 00。但收到的数据是变的,而且会有重复的,像收到很多ba。求大神帮忙看看代码。

void PASCAL CallBackFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
CLinMasterNodeTestDlg* dlg = (CLinMasterNodeTestDlg*)dwUser;

if(!dlg->m_mscomm.GetPortOpen())
{
if(NOTopenCOMflagonce==0)
{
NOTopenCOMflagonce=1;

}
return;
}
if(stream==0)
{

dlg->m_mscomm.SetBreak(1);

stream=1;
}
else if(stream==1)
{



if(dlg->m_Frei.GetCheck())
{
LIN_txdata1|=1<<1;
}
else
{
LIN_txdata1&=~(1<<1);
}
if(dlg->m_Autark.GetCheck())
{
LIN_txdata1|=1<<0;
}
else
{
LIN_txdata1&=~(1<<0);
}
if(dlg->m_Vorw.GetCheck())
{
LIN_txdata1|=1<<2;
}
else
{
LIN_txdata1&=~(1<<2);
}
dlg->m_mscomm.SetBreak(0);
CByteArray array2;

static int x=0;
x++;
if(x&1)
{

array2.SetSize(5);
array2.SetAt(0,0x55);
T_u8 PIDresult=0;
PIDresult=IDconvertPID(58);
array2.SetAt(1,PIDresult);
array2.SetAt(2,LIN_txdata1);
array2.SetAt(3,Send59dataarray[1]);
Send59dataarray[0]=LIN_txdata1;
T_u8 Enhancecheksum1=0;
Enhancecheksum1=EnhancedChecksum(Send59dataarray,2,PIDresult);
array2.SetAt(4,Enhancecheksum1);
dlg->m_mscomm.SetOutput(COleVariant(array2));
}
else
{
//dlg->m_mscomm.SetOutBufferCount(0);
array2.SetSize(2);
array2.SetAt(0,0x55);
T_u8 PIDresult1=0;
PIDresult1=IDconvertPID(59);
array2.SetAt(1,PIDresult1);
dlg->m_mscomm.SetOutput(COleVariant(array2));
Requestflag=1;
}


delay=100;
stream=2;
}

else if(stream==2)
{
if(delay)
delay--;
else
{
stream=0;
//while(dlg->m_mscomm.GetOutBufferCount()>5);
//dlg->m_mscomm.SetSettings("19200,n,8,1");
//delay=100;
}
}

}
void CLinMasterNodeTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
unsigned char rxdata[30]; //设置BYTE数组An 8-bit integerthat is not signed.
CString strtemp;
CString recd;
int arayindextemp=0;
static char recordlength=0;
//static char streamRx=0;
unsigned char rxarray[30];
// int rxdindex=0;
// int rxaindex=0;
// bool flag=0;

switch(m_mscomm.GetCommEvent())
{
case 1: // comEvSend发送数据
break;
case 2: // comEvReceive读取数据
{
// MessageBox(_T("读取数据事件"), _T("TRACE"), MB_OK);

variant_inp=m_mscomm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为COleSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
// 接受数据

//m_www=len;
//UpdateData(0);
for(k=0;k<len;k++)
{
//unsigned char Hexchange=0;
safearray_inp.GetElement(&k,rxarray+k); //转换为BYTE型数组
}
if(Requestflag==1)
{
if(recordlength<9)
{
int templength=recordlength+len;
for(long u16=recordlength;u16<templength;u16++)
{
//safearray_inp.GetElement(&u16,rxarray+u16); //转换为BYTE型数组
aray[u16]=*(unsigned char*)(rxarray+(u16-recordlength));
recordlength++;
Watchstr.Format(_T("%02x"),aray[u16]); //十六进制显示

Watchstrun+=Watchstr;

Watchstrun+=" ";

}
}
else
{
Requestflag=0;
m_qqqq=Watchstrun;
UpdateData(0);
Watchstrun=" ";
recordlength=0;


}


}
break;
}
...全文
741 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
farfrome 2017-12-31
  • 打赏
  • 举报
回复
void CTabPage1::readComm2(CByteArray& arr) { if(h_mscomm1.get_PortOpen()){ if(h_mscomm1.get_InBufferCount()>0) { h_mscomm1.put_InputMode(1); //二进制模式输入 VARIANT var1; COleSafeArray arr1; var1=h_mscomm1.get_Input(); arr1=var1; DWORD len=arr1.GetOneDimSize(); long i=0; for(;i<len;i++) { BYTE byte_1; arr1.GetElement(&i,&byte_1); arr.Add(byte_1); } h_mscomm1.put_InBufferCount(0); //清空接收缓冲区 } } } CString CTabPage1::readComm() { CString str1=_T(""); if(h_mscomm1.get_PortOpen()){ if(h_mscomm1.get_InBufferCount()>0) { h_mscomm1.put_InputMode(0); //文本模式输入 VARIANT val=h_mscomm1.get_Input(); str1=val.bstrVal; h_mscomm1.put_InBufferCount(0); //清空接收缓冲区 } } return str1; } void CTabPage1::writeComm(CByteArray& arr) { if(h_mscomm1.get_PortOpen()){ h_mscomm1.put_OutBufferCount(0); //清空发送缓冲区 h_mscomm1.put_InputMode(1); h_mscomm1.put_Output(COleVariant(arr)); } } void CTabPage1::writeComm(CString str) { if(h_mscomm1.get_PortOpen()){ h_mscomm1.put_OutBufferCount(0); //清空发送缓冲区 h_mscomm1.put_Output(COleVariant(str)); } }
McuPlayer 2016-04-11
  • 打赏
  • 举报
回复
用原生串口试试看 USB设备,本身是bulk方式的,小数据,多频次,的情况下,效率很低,丢数据也有可能

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧