MScomm + bcb 串口编程

angelcode 2009-04-13 11:02:57
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如: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;

}
...全文
531 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiaoyu007 2010-03-19
  • 打赏
  • 举报
回复
我也碰到了这个问题 看看咋做呢..
angelcode 2009-04-23
  • 打赏
  • 举报
回复
先将解决办法公布出来


void __fastcall TForm1::Button4Click(TObject *Sender)
{
unsigned char OutBuf[256];
AnsiString chr;
chr=Memo2->Text.Trim();
MSComm1->InputMode=1;
int le=StringHex(chr, OutBuf);
ShowMessage(IntToStr(le));
if(le==(-2))
ShowMessage("十六进制数字错误");
MSComm1->Output=OutBuf;
}

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);
}

int __fastcall TForm1::StringHex(AnsiString str,unsigned char *senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.Length();
for (int i=1;i<=len;)
{
char *ch,*cl;
ch=str.SubString(i,1).c_str();
ShowMessage(*ch);
cl= ch=str.SubString(i+1,1).c_str();
ShowMessage(*cl);
hexdata=ConvertHexChar(*ch);
lowhexdata=ConvertHexChar(*cl);
if(hexdata==-1||lowhexdata==-1) //十六进制中有错误的数字
{
return (-2);
}
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
senddata[hexdatalen]=(unsigned char)hexdata;
hexdatalen++;
i=i+3;
}
//ShowMessage((AnsiString)senddata[0]);
return hexdatalen;
}
mooncbz 2009-04-16
  • 打赏
  • 举报
回复
关注中……
bcb的串口编程
angelcode 2009-04-16
  • 打赏
  • 举报
回复
谢谢各位兄弟了
本来说偷懒来要个demo回去改下
后来发现根本就不是那回事,所以我重新把上面的代码审视了一边 修改如下

int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.Length();
if(len!=25)
{
return (-1);
}
for(int i=0;i <len;)
{
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;
zhoucs21 2009-04-15
  • 打赏
  • 举报
回复
关于动态数组:用vector

去掉空格我有笨办法:Edit1->Text.SubString(i*3+1,2)
angelcode 2009-04-13
  • 打赏
  • 举报
回复
我的意思 通过C++bulider6.o+MScomm控件调试串口

如何发送命令“F5 09 00 00 00 00 09 F5”
以上的代码是我通过串口调试助手编写的 不过测试没有办法通过 因此希望各位高手能够帮忙解决 非常感谢
在线等
我的邮箱udai@163.com
qq:179882178
我不懂电脑 2009-04-13
  • 打赏
  • 举报
回复
不清楚。

[Quote=引用 2 楼 Behard 的回复:]
什么意思?楼主想问什么问题,有什么不明白的?
[/Quote]
Behard 2009-04-13
  • 打赏
  • 举报
回复
什么意思?楼主想问什么问题,有什么不明白的?
angelcode 2009-04-13
  • 打赏
  • 举报
回复
我的邮箱 udai@163.com 分数不够的话可以加
angelcode 2009-04-13
  • 打赏
  • 举报
回复
如何通过bcb+mscomm发送“F5 09 00 00 00 00 09 F5”命令 ;

Behard 2009-04-13
  • 打赏
  • 举报
回复
我有点理解楼主的意思了,不过还是有几种理解。

如果想讨论一些问题,我觉得楼主还是应该清楚、明白的表述问题或者论点,否则要别人猜是很不好的。
angelcode 2009-04-13
  • 打赏
  • 举报
回复
我的意思就是哪个大哥帮我看下上面的代码 为什么老报错
创建动态数组的时候老报错
xjq2003 2009-04-13
  • 打赏
  • 举报
回复
请参考里面的程序,看怎么去掉空格的
我用的是PCOMM.DLL
int counter,i;
i=0;
unsigned char chr[1];
String data;
if (cansend>0){
data=StringReplace(Memo2->Lines->CommaText," ","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);//.Length();
data=StringReplace(data,"\"","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
data=StringReplace(data,",","",TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase);
counter= data.Length();

while(i++ < counter)
{
chr[0] = StrToInt("0x"+data.SubString(i++,2));
sio_write(port,chr,1);
}
}else{
MessageBox(Handle,"请确认此端口存在且已被打开","发送提示",0);
}
xjq2003 2009-04-13
  • 打赏
  • 举报
回复
怎么测试不能通过啊?
是不是里面的空格去不掉啊?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧