// Mscomm事件
void CcomDlg::OnCommMscomm()
{
// TODO: 在此处添加消息处理程序代码
static unsigned int cnt  = 0;
VARIANT variant_inp;
OleSafeArray safearray_inp;
long len,k;
unsigned int data[1024]={0};
byte rxdata[1024];
CString strtemp;
if(m_mscomm.get_CommEvent()==2)
{//MessageBox(_T("接收缓冲区内有字符"),_T("接收提示")); 
  cnt++;
  variant_inp = m_mscomm.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++)
{ strtemp.Format(_T("%c"),*(rxdata+k)); // 将字符送入临时变量strtemp存放
   m_EditRec += strtemp;          // 组拼字符串
 }
}
 UpdateData(FALSE); // 更新编辑框内容:由字符变量内容更新至编辑框
}我上述的代码只能做到接收每个字符,但同一发过来的字符串中还有Tab制表符、\r\n字符。
关键在于strtemp.Format(_T("%c"),*(rxdata+k)); 只转换字符。
现在我的问题是如何将发过来的字符串的中的Tab制表符、\r\n字符一起在接收到的编辑框中显示呢?
比如我的TAB是用于字符串之间隔开的,而\r\n是换行的。这样在编辑框看起十分有格式的。
请问上述的代码该如何修改?
谢谢!

解决方案 »

  1.   

    /*
    for(k=0;k<len;k++)
    {
     strtemp.Format(_T("%c"),*(rxdata+k)); 
      m_EditRec += strtemp;
    }
    */
    m_EditRec += (LPCSTR)rxdata;
      

  2.   

    按楼二的做法出来的效果是“015.315.31.000.066233.3” 且制表符没有体现出来、回车换行也没有。按我的做法出来的效果是“015.3015.31.000.066233.1”纯属字符而我想要的理想结果是: "015.3   015.3   1.00   0.066   233.1" 一个数据里头之间有有一个TAB符\t的。最后还有一个\r\n符用于换行。
    多次读取时则为
    015.3   015.3   1.00   0.066   233.1
    015.3   015.3   1.00   0.066   233.1
    015.3   015.3   1.00   0.066   233.1
    015.3   015.3   1.00   0.066   233.1
    这样的效果,每次三十个字节。
      

  3.   

    你编辑框的格式应该是ES_MULTILINE & ES_WANTRETURN,在对话框编辑器改一下应该就可以了...
      

  4.   

    我用VS10,接收编辑框属性“Multiline”为True 和“Went Return”为True。
    但信然无效。
    请各手多给办法,我在线等多试试。
      

  5.   

    首先要保证是否收到\t,最简单的方法是输出成16进制.
    或者将rxdata输出到文件,查看是否有\r\n数据.如果你的数据是纯ASCII码,不如串口用comInputModeText,然后接收代码改为
    CComVariant varText;
    varText.Attach(m_mscomm.get_Input());
    varText.ChangeType(VT_BYREF|VT_I1);
    strTemp=varText.pcVal;
    m_EditRec += strtemp;