64,637
社区成员
发帖
与我相关
我的任务
分享
void CCommTestDlg::OnBnClickedOpenUsart()
{
// TODO: 在此添加控件通知处理程序代码
if(m_mscomm.get_PortOpen()) //若串口打开,则关闭串口
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(5);
m_mscomm.put_Settings(_T("115200,n,8,1"));
m_mscomm.put_InBufferSize(1024);//接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);// 以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
m_mscomm.put_SThreshold(0);//每发送1个字符时,不触发OnComm事件
if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{
try
{
m_mscomm.put_PortOpen(TRUE);
AfxMessageBox(_T("串口打开成功"));
}
catch (...)
{
AfxMessageBox(L"串口打开失败");
return;
}
m_mscomm.get_Input(); //先预读缓冲区以清除残留数据
}
}
void CCommTestDlg::OnCommMscomm1()
{
static unsigned int cnt=0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
unsigned intdata[1024]={0};
byte rxdata[1024]; //设置BYTE数组
CString strtemp,string;
if (m_mscomm.get_CommEvent()==2) //值为2表示接收缓冲区内有字符
{
cnt++;
variant_inp= m_mscomm.get_Input(); //读取缓冲区
safearray_inp= variant_inp; //变量转换
len= safearray_inp.GetOneDimSize(); //得到有效的数据长度
for (k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);
}
for (k=0;k<len;k++)
{
if(m_ctrlHexDiaplay.GetCheck())
strtemp.Format(_T("%02X "),*(rxdata+k)); //16进制显示
else
strtemp.Format(_T("%c "),*(rxdata+k)); //字符显示
m_EditReceive+=strtemp;
UpdateData(FALSE);
if (m_EditReceive.GetLength()>4000) //清空接收框
{
m_EditReceive=" ";
UpdateData(FALSE);
}
}
FILE *p= fopen( "pic1.dat","ab");
fwrite(rxdata,len,1,p);
fclose (p);
}