描述:
数据包格式如下:
@xx$
求如何实现@与$之间所有字符代码的低4位校验和,再转换成ASCII字符
BOOL CAkcy2008Dlg::OnInitDialog()
{
// .....省略
//-----------初始化com1-----------------------------
m_MsCom1.SetCommPort(1); //选择串口号
m_MsCom1.SetInputMode(1); //以文本方式取回数据(接收)
m_MsCom1.SetInBufferSize(1024); //设置输入缓冲区大小
m_MsCom1.SetOutBufferSize(10); //设置输出缓冲区大小(发送)
m_MsCom1.SetSettings("19200,n,8,1");//波特率19200,无校验,8个数据位,1个停止位
m_MsCom1.SetRThreshold (1); //接收缓冲区>=1个字符时将引发oncomm事件
if(!m_MsCom1.GetPortOpen()) //打开串口
m_MsCom1.SetPortOpen(true);
m_MsCom1.SetInputLen(0); //读取接收缓冲区中所有的内容
m_MsCom1.GetInput(); //先预读缓冲区,以清除残留数据
m_MsCom1.SetInBufferCount(0);//清除接收缓冲区
m_MsCom1.SetOutBufferCount(0);//清除发送缓冲区
}
//----------------------------------------------
void CAkcy2008Dlg::OnCom1()
{
COleSafeArray safearray_inp;
COleVariant myVar;
BYTE rxdata[2048];
long len,k;
len=0;
static long checksum; //校验码
switch(m_MsCom1.GetCommEvent())
{
case 2:
CString strtemp;
myVar.Attach(m_MsCom1.GetInput());//读缓冲区
safearray_inp=myVar; //COleVarian型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
//下面是数据处理函数-------------------------------------------------
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
char ch=(char)bt;
//获取字符串并校验,,,,乱了套了...............................................????????(问题就在这儿)
switch(ch)
{
case '@': //字符串开始
checksum=0; //开始计算CheckSum
sRecStr1="";
break;
case '$'://字符串结束
checksum=checksum & 0x0f;//校验
if (checksum < 10) checksum+= '0'; else checksum += 'A' - 10;
break;
default:
sRecStr1+=strtemp;
checksum =checksum^ch;//校验
break;
}
}
break;
}
}