用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,应该不是很难吧,小弟初次写串口程序,没有经验,还请各位大侠指教!
小弟在线等回音!

...全文
269 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);
}
C++ Builder与RS-232串行通信控制》配书光盘自述文件 1.光盘内容 Readme.txt 光盘说明文件 \EX 《C++ Builder与RS-232串行通信控制》书中各章范例所在的文件 夹,包含完整的工程范例程序代码。 \Other 此文件夹中包含以下内容:骅达科技公司授权提供的产品 PSIS仿真器的相关文件,四零四科技公司授权提供的PComm Lite软件的安 装程序PCOMM.exe,还有7520模块的说明文件等。 2.光盘运行环境 本光盘可以运行在Windows 操作系统下,包括98/2000/NT/XP。 范例程序的软件环境是C++ Builder 5。其中第4章及以后的范例程序的 运行,需要安装TComm组件,其安装过程参考书中4.3.1节的说明;第8章的范 例程序的运行,需要安装“\Other”文件夹下的PCOMM安装程序,安装和使用 方法参见书中附录A.3和第8章的有关说明。 3.光盘使用说明 在使用本光盘的范例文件时,要把“\EX”文件夹下的内容复制到硬盘, 然后把各章范例文件的只读属性取消。范例文件的具体操作说明参见书中附 录A.1节的有关介绍。有的范例文件可能不能直接打开,需要在C++ Builder 的集成开发环境中利用菜单命令或工具按钮来打开范例文件。 4.其他 因为本书与实验联系紧密,需要一定的实验环境。如果不具备实验环境, 范例程序在单独上机运行时,其结果只能是象征性的,与书中介绍和实际 的实验结果是不一样的。有些章节的范例文件夹中附有本书繁体字版附书 盘所带的演示文档,没有进行汉字简化,其中的运行结果应该与实际的实 验结果类似。由于光盘为引进版权产品,其内容与书之间可能存在个别不 一致的地方,敬读者谅解。

1,316

社区成员

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

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