MScomm + bcb 串口编程
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:F5 09 00 00 00 00 09 F5
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CSCommTestDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
改成bcb的写法如下 测试没有办法通过 那位大哥能给修改下 或是直接发送一个demo学习下 谢谢
int __fastcall TForm1::String2Hex(AnsiString str,unsigned char *senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.Length()+1;
if(len&0x01)
{
return (-1);
}
for(int i=0;i<len;i=i+3)
{
char lstr,hstr=str[i+1];
i++;
if(i>=len)
break;
lstr=str[i+1];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if(hexdata==-1||lowhexdata==-1) //十六进制中有错误的数字
return (-2);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(unsigned char)hexdata;
hexdatalen++;
}
ShowMessage((AnsiString)(char *)senddata);
return hexdatalen;
}
char __fastcall TForm1::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
//----------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
unsigned char OutBuf[256];
OleVariant TxBuff;
AnsiString chr;
int len,j;
memset(OutBuf,0,256);
MSComm1->InputMode=1;
chr=Memo2->Text;
len=String2Hex(chr,OutBuf);
if(len==-1)
ShowMessage("十六进制数个数错误");
if(len==-2)
ShowMessage("十六进制数字错误");
TxBuff = VarArrayCreate(OPENARRAY(int,(0,len-1)),varByte);
for(j = 0; j < len; j ++)
TxBuff.PutElement(OutBuf[j], j);
MSComm1->Output = TxBuff;
}