3,245
社区成员
发帖
与我相关
我的任务
分享
void CCommAssistDlg::OnButtonSendData() //发送数据按键函数
{
UpdateData(TRUE); //刷新数据
switch(State_Tx_Format)
{
case Format_Char : //如果是字符发送则直接发送数据
{
m_comm.SetOutput(COleVariant(m_edit_TxData)); //发送数据
}break;
//如果是16进制发送则需将16进制数字字符串转化成对应的16进制数,如"23569a" --> 0x23 0x56 0x9a
//字符串没有格式限制,但必须是合法的16进制数0 - 9,a - f,A - F,或者空格符
//空格符区分两个16进制数,如"12 34 5 67" --> 0x12 0x34 0x05 0x67
//若字符连在一起,则认为两个两个一组,落单的字符为一个,如"1234567"--> 0x12 0x34 0x56 0x07
case Format_Hex :
{
int TxData_length,counter = 0;
BYTE bt;
CByteArray TxData_temp; //存储转换后的16进制数据
TxData_length = m_edit_TxData.GetLength(); //获取发送数据长度
for(counter = 0; counter < TxData_length; counter ++) //检查字符是否合法
{
bt = m_edit_TxData.GetAt(counter);
if(!((bt == ' ') || ((bt >= '0') && (bt <= '9')) || ((bt >= 'a') && (bt <= 'f')) || ((bt >= 'A') && (bt <= 'F')) ))
{
CString str;
str.Format("第%d个发送字符不是合法的16进制数!",counter + 1);
MessageBox(str);
return ; //如果有非法的字符则结束此时数据发送
}
}
counter = 0;
while(counter < TxData_length) //将当前十六进制字符串转换成字符串发送
{
bt = m_edit_TxData.GetAt(counter);
if(bt == ' ') //当前字符为空格符则跳过至下一个字符
{
counter ++;
}
else if((m_edit_TxData.GetAt(counter + 1) == ' ') || (counter + 1 >= TxData_length)) //当前下一个字符为空格符 或 当前字符位置为尾部,即1位十六进制符,如"123" "123 45" 字符串中的3
{
//转换成相应16进制数
if((bt >= '0') && (bt <= '9')) //0-9字符
{
TxData_temp.Add(bt - '0');
counter ++;
}
else if((bt >= 'a') && (bt <= 'f')) //a-f字符
{
TxData_temp.Add(bt - 'a' + 10);
counter ++;
}
else if((bt >= 'A') && (bt <= 'F')) //A-F字符
{
TxData_temp.Add(bt - 'A' + 10);
counter ++;
}
}
else //2位十六进制符连在一起,如 "1234",因为是数字和大小写字母两两组合,所以共9种情况
{
BYTE bt_2;
bt_2 = m_edit_TxData.GetAt(counter+1); //读取下一字符
if((bt >= '0') && (bt <= '9')) //高位0-9字符
{
if((bt_2 >= '0') && (bt_2 <= '9')) //高位0-9字符 低位0-9字符
{
TxData_temp.Add((bt - '0') * 16 + (bt_2 - '0'));
counter +=2;
}
else if((bt_2 >= 'a') && (bt_2 <= 'f')) //高位0-9字符 低位a-f字符
{
TxData_temp.Add((bt - '0') * 16 + (bt_2 - 'a' + 10));
counter +=2;
}
else if((bt_2 >= 'A') && (bt_2 <= 'F')) //高位0-9字符 低位A-F字符
{
TxData_temp.Add((bt - '0') * 16 + (bt_2 - 'A' + 10));
counter +=2;
}
}
else if((bt >= 'a') && (bt <= 'f')) //高位a-f字符
{
if((bt_2 >= '0') && (bt_2 <= '9')) //高位a-f字符 低位0-9字符
{
TxData_temp.Add((bt - 'a' + 10) * 16 + (bt_2 - '0'));
counter +=2;
}
else if((bt_2 >= 'a') && (bt_2 <= 'f')) //高位a-f字符 低位a-f字符
{
TxData_temp.Add((bt - 'a' + 10) * 16 + (bt_2 - 'a' + 10));
counter +=2;
}
else if((bt_2 >= 'A') && (bt_2 <= 'F')) //高位a-f字符 低位A-F字符
{
TxData_temp.Add((bt - 'a' + 10) * 16 + (bt_2 - 'A' + 10));
counter +=2;
}
}
else if((bt >= 'A') && (bt <= 'F')) //高位A-F字符
{
if((bt_2 >= '0') && (bt_2 <= '9')) //高位A-F字符 低位0-9字符
{
TxData_temp.Add((bt - 'A' +10) * 16 + (bt_2 - '0'));
counter +=2;
}
else if((bt_2 >= 'a') && (bt_2 <= 'f')) //高位A-F字符 低位a-f字符
{
TxData_temp.Add((bt - 'A' +10) * 16 + (bt_2 - 'a' + 10));
counter +=2;
}
else if((bt_2 >= 'A') && (bt_2 <= 'F')) //高位A-F字符 低位A-F字符
{
TxData_temp.Add((bt - 'A' +10) * 16 + (bt_2 - 'A' + 10));
counter +=2;
}
}
}
}
m_comm.SetOutput(COleVariant(TxData_temp)); //发送数据
}break;
}
}
if((m_edit_TxData.GetAt(counter + 1) == ' ') || (counter + 1 >= TxData_length)) //当前下一个字符为空格符 或 当前字符位置为尾部,即1位十六进制符,如"123" "123 45" 字符串中的3
以上这句除了问题,在循环过程中counter + 1会超出m_edit_TxData字符边界,因此会产生错误,但是对于这种错误在后一句counter + 1 >= TxData_length中有处理,实际是不会出问题,所以在Release版本中没有这种错误,解决的办法是将这两句左右交换位置,即改变运行顺序,先判断有没有超出边界,然后在判断空格,就没问题了