用C++ Builder和Pcomm控件写串口通信程序遇到的问题,请大家不吝赐教!先跪谢(在线等!)

zcq129 2005-07-25 11:38:00
小弟用C++ Builder和Pcomm控件写了一个串口的通信程序,是PC与单片机(C51)通信的,需要发送16进制的数据,只需要发送一个16进制的数据CC,程序如下:
以下两个函数是参考串口调试工具的源代码,是把字符串形式的16进制数据转换成10进制后,再转换成(char *)形式,Pcomm的sio_write函数要求是(char *)形式
int __fastcall TForm1::String2Hex(String str, char* senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len;
len=str.Length();

for(int i=1;i<len+1;)
{

char lstr;
char hstr;

hstr=str[i];

if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len+1)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;
ShowMessage("senddata"+IntToStr(hexdatalen)+senddata[hexdatalen]);
hexdatalen++;
}
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 0x10;
}
void __fastcall TForm1::StopCCClick(TObject *Sender)
{
int datalen;
String HexData;
char SendData[2];

HexData="CC";

datalen=String2Hex(HexData,SendData);
sio_open(1);

sio_write(1,SendData,strlen(SendData));

}

只发送一个CC,应该不是很难吧,小弟初次写串口程序,没有经验,还请各位大侠指教!
小弟在线等回音!

...全文
314 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcq129 2005-07-25
  • 打赏
  • 举报
回复

写串口函数sio_write(int port, char *buf, int len)要求的是char *型的数据,不能直接用char型的数据.我把程序重新改了一下:
void __fastcall TForm1::testClick(TObject *Sender)
{

char testdata[1];
testdata[0]=0xCC;
sio_open(1);
sio_ioctl(1,B9600,BIT_8||STOP_1||P_NONE);
sio_flush(1,2);
sio_write(1,testdata,strlen(testdata));
sio_close(1);
}

可是这样还是不行,请赐教!
zcq129 2005-07-25
  • 打赏
  • 举报
回复
pengsh(psh)大侠:
写串口函数sio_write(int port, char *buf, int len)要求的是char *型的数据阿,直接用char可以吗?我想的就是String型的数据,每个元素不都是char型的吗,不就可以把String型的数据当成char型的数组来访问了吗,这样不可以吗?
zcq129 2005-07-25
  • 打赏
  • 举报
回复
sio_open(1)是打开com1口的意思,我用的都是默认设置
char chrData = 0xCC;
chrData是char型的,sio_write函数的声明如下:
sio_write(int port, char *buf, int len)
其中,port是要打开的com口,1即是com1,2即是com2
*buf是要写入缓冲区的数据
len是*buf的长度
pengsh 2005-07-25
  • 打赏
  • 举报
回复
小猪快跑:
sio_open(1)是MOXA出的串口开发函数库中的函数。
风雨钟声:
没有必要采用串口调试助手的转换函数。因为串口调试助手要把以字符形式输入的16进制数据转换成真正意义上的16进制数,所以他要用转换函数。你这里只需要采用char chrData = 0xCC;的形式给变量赋值就可以了。记得打开串口后要根据通讯协议进行参数设置,用后要及时关闭。
FengSC 2005-07-25
  • 打赏
  • 举报
回复
char chrData = 0xCC;
PComm没用过不知道你写的sio_open(1)是啥意思,串口有很多设置项,难道你的应用正好都是默认值?
zcq129 2005-07-25
  • 打赏
  • 举报
回复
谢谢microheart(心)老大!!!问题已经解决,三种方法均好用,不胜感激!立即给分!
我的QQ是82783624,E-mail:internet16@163.com
希望与大家建立长久的联系!
对于其他各位大哥,也在此一并谢过!
microheart 2005-07-25
  • 打赏
  • 举报
回复
首先讲一下,strlen函数工作的原理:字符串是以'\0'(0x00)结束的,strlen函数就是对给定的字符串指针地址,查找'\0'并计数,直到找到后,返回计数值。
所以你的程序就是错在了使用的strlen(testdata))的问题上,char testdata[1];是你的定义,数组没有给字符串结束符留下位置,所以你写入的可能就不是你想要的东西。
当然如果是串数据设置的问题,还要根据你的硬件设置进行相应调整。
程序修改如下:
1.
void __fastcall TForm1::testClick(TObject *Sender)
{
char testdata[2];
testdata[0]=0xCC;
testdata[1]=0x00;
sio_open(1);
sio_ioctl(1,B9600,BIT_8||STOP_1||P_NONE);
sio_flush(1,2);
sio_write(1,testdata,strlen(testdata));
sio_close(1);
}
2.
void __fastcall TForm1::testClick(TObject *Sender)
{
char testdata[1];
testdata[0]=0xCC;
sio_open(1);
sio_ioctl(1,B9600,BIT_8||STOP_1||P_NONE);
sio_flush(1,2);
sio_write(1,testdata,1);//因为你的数据长度是可知的,即一个字节
sio_close(1);
}
3.
void __fastcall TForm1::testClick(TObject *Sender)
{
char testdata;
testdata=0xCC;
sio_open(1);
sio_ioctl(1,B9600,BIT_8||STOP_1||P_NONE);
sio_flush(1,2);
sio_write(1,&testdata,1);
sio_close(1);
}
内容概要:本文研究了基于空调与电动汽车联合虚拟储能的海岛微电网协同优化调度问题,提出了一种融合虚拟储能技术与混合整数线性规划(MILP)的多目标优化模型。通过将温控负荷(如空调)和电动汽车的充放电行为建模为可调度的虚拟储能资源,充分挖掘其在时间维度上的灵活调节潜力,实现对微电网中可再生能源波动的有效平抑。研究构建了一个涵盖经济性、可再生能源消纳率和系统运行稳定性的综合优化目标函数,并采用MILP方法进行高效求解,实现了源-荷两侧的协同优化调度。仿真结果表明,该策略不仅能显著降低系统综合运行成本,还能提升清洁能源的就地消纳水平,增强海岛微电网在孤立运行条件下的灵活性与韧性。; 适合人群:具备电力系统、能源优化或自动化相关背景,从事微电网、可再生能源集成、需求响应或智能调度研究的研发人员和研究生。; 使用场景及目标:①应用于海岛等远离主网的孤立微电网能量管理系统;②挖掘温控负荷与电动汽车的隐性储能价值,提升电网对高比例可再生能源的接纳能力;③为源荷互动、需求侧资源聚合参与优化调度的研究与实践提供可复现的模型框架与Matlab代码实现方案。; 阅读建议:此资源包含完整的Matlab代码实现,建议读者结合文档中的模型构建思路与仿真结果进行学习,重点关注虚拟储能的数学建模方法、多目标优化的线性化处理技巧以及MILP求解器的应用,可通过调整负荷参数、新能源出力场景等方式进行复现与拓展性实验。

1,317

社区成员

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

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