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;

}
...全文
529 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
  • 打赏
  • 举报
回复
怎么测试不能通过啊?
是不是里面的空格去不掉啊?
内容概要:本文围绕“可再生能源发电与电动汽车的协同调度策略”展开硕士论文级别的研究与复现工作,基于Matlab平台构建了高比例可再生能源接入背景下电力系统与电动汽车(EV)之间的多时间尺度协同优化模型。研究重点在于应对风光发电不确定性,充分利用电动汽车作为移动储能单元的灵活充放电能力(含V2G技术),实现电网削峰填谷、提升新能源消纳效率与系统运行经济性。文中综合考虑了异质电动车集群特性、V2G过程中的损耗约束以及随机因素影响,采用如深度确定性策略梯度(DDPG)强化学习、混合整数线性规划(MILP)等先进优化算法进行求解,并通过基准模型对比验证了所提自适应调度策略在提升电网稳定性、降低运行成本方面的有效性。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员,以及从事新能源并网、智能电网调度、车网互动(V2G)等方向的工程技术人员。; 使用场景及目标:①学习并复现已发表高水平硕士论文中的协同调度建模方法与仿真流程;②掌握将深度强化学习(如DDPG)应用于虚拟电厂、电动汽车集群调度等复杂非线性决策问题的技术路径;③为开展新能源消纳、需求侧响应、微电网优化运行等相关课题的研究提供可复用的代码框架与创新思路参考。; 阅读建议:建议读者结合文中提供的完整Matlab代码与技术文档,深入理解模型构建逻辑、算法实现细节与参数设置依据,优先在Simulink/Matlab环境中运行并调试仿真案例,通过调整场景参数与算法超参,探究不同策略对调度效果的影响,从而深化对协同调度机制与智能优化方法应用的理解。

1,317

社区成员

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

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