15,978
社区成员
发帖
与我相关
我的任务
分享
void CSatCtrlComDlg::OnBnClickedButton2() //发送数据 并将发送历史在对话框中显示
{
VARIANT str;
UpdateData(true);
str = COleVariant(mEditSend);
cMSCommPort.put_Output(str);
mEditHsty += str;
mEditHsty += "\r\n";
UpdateData(false);
int linecnt = cEditHsty.GetLineCount();
cEditHsty.LineScroll(linecnt-1,0);
}
BEGIN_EVENTSINK_MAP(CSatCtrlComDlg, CDialog)
ON_EVENT(CSatCtrlComDlg, IDC_MSCOMM1, 1, CSatCtrlComDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()
void CSatCtrlComDlg::OnCommMscomm1() //串口有接收时显示在接收区
{
if(cMSCommPort.get_CommEvent()==2)
{
char str[1024] = {0};
long k;
VARIANT InputData = cMSCommPort.get_Input();
COleSafeArray fs;
fs = InputData;
for(k=0;k<fs.GetOneDimSize();k++)
{
fs.GetElement(&k,str+k);
}
mEditRcv += str;
UpdateData(false);
int linecnt = cEditRcv.GetLineCount();
cEditRcv.LineScroll(linecnt-1,0);
}
}
// ANSI To UNCODE转换
CString AnsiToUnicode(char * szAnsi, int len=0);
// Unicod To ANSI转换
int UnicodToAnsi(CString str,char* buff);
// ANSI To UNCODE转换
CString CStringProc::AnsiToUnicode(char * szAnsi, int len)
{
CString str;
// ansi to unicode
//预转换,得到所需空间的大小
int wcsLen;
if(len>0)
wcsLen=len;
else
wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0'; // UNICODE字串
str=wszString;
delete wszString;
return str;
}
// Unicod To ANSI转换
int CStringProc::UnicodToAnsi(CString str,char* buff)
{
int len=0;
// UNICODE编码 转换成 ANSI编码
len = ::WideCharToMultiByte(CP_ACP, NULL, str,
str.GetLength(), NULL, 0, NULL, NULL); // 取字串长度
::WideCharToMultiByte(CP_ACP, NULL, str, str.GetLength(),
buff, len, NULL, NULL);
buff[len++]=0x00; // 写字串尾部结束标志
return len; // 转换长度
}
// "65 A3A8 CAD5 B2D8 A3" // problem at A3
// "A9 0D0A 0D0A D2BB A1" // problem at A9 and A1 !!!!
#define SZ 1
BYTE *CPeekCommDlg::KillHalfHZ(BYTE *pdata,UINT len)
{//
static BYTE HalfHz=0;
BYTE firstHalf=0;
UINT HalfAt=0;
UINT total=0;
BYTE *copy=0;
BYTE *pTmp=0;
//
// afxDump << len << "\r\n";
//
if(HalfHz != 0)
{// add last half HZ to newline
copy=new BYTE[len+1+SZ];
memset(copy,0,len+1+SZ);
copy[0]=HalfHz;
HalfHz=0;
memcpy(©[1],pdata,len);
total=len+1;
}
else
{// keep original
copy=new BYTE[len+SZ];
memset(copy,0,len+SZ);
memcpy(copy,pdata,len+SZ);
total=len;
}
pTmp=copy;
// check this new line
for(UINT i=0; i < total; i++)
{
if(*pTmp >= 0x80)
{
if(firstHalf==0)
{// half hz
firstHalf = *pTmp;
HalfAt = i+1;
}
else
{// has half hz
if(i==HalfAt)
{// 1 hz
HalfAt=0;
firstHalf=0;
}
else
{// middle or end ? 0xA8 0x44
break;
}
}
}//if(*pTmp >= 0x80)
pTmp++;
}
//
if(HalfAt==0)
{// newline no half HZ
copy[total]=0;
}
else if (HalfAt==total)
{// newline has half HZ at end
HalfHz=firstHalf;
copy[total-1]=0;
}
// you must delete it later !
return copy;
}
使用
DWORD CPeekCommDlg::AppendText(BYTE *pdata,UINT len,COLORREF FgColor)
{
CharNewColor(FgColor);
// make a sz
BYTE *pnew=KillHalfHZ(pdata,len);
//
LONG nStartChar;
LONG nEndChar;
m_RichEdit.GetSel(nStartChar,nEndChar);
m_RichEdit.SetSel(nEndChar,nEndChar);// go end
m_RichEdit.ReplaceSel((char*)pnew);
delete [] pnew;
//
int all=m_RichEdit.GetLineCount();
if(all > 17 ) m_RichEdit.LineScroll(all-17,0);
//
return len;
}