主题:在C++Builder中如何利用MSComm控件施行串口通讯
各位大虾:
我制作在测试程序中遇到一个意想不到的问题:
我成功的打开了计算机串口,编译时没有问题,在试运行却出现了问题.
程序段如下,请指教!谢谢
void__fastcall TForm1::btnsendClick(Tobject* Sender)
{
//---向串口发送Byte数1,6,1三个数据------------------------------------
//----通讯设备已RTU方式进行通讯(支持MOUDELBUS协议)---------------------
int tmpInt1,tmpInt2,tmpInt3;
String tmpStr1,tmpStr2,tmpStr3;
if(MSComm1->PortOpen)
{
tmpInt1=1;
tmpInt2=6;
tmpInt3=1;
tmpStr1=tmpInt1;
tmpStr2=tmpInt2;
tmpStr3=tmpInt3;
MSComm1->Output=tmpStr1;
Sleep(60);
MSComm1->Output=tmpStr1;
Sleep(60);
MSComm1->Output=tmpStr1;
}
通讯设备没有接受数据,也就是无任何反应(通讯设备是PLC),查资料,发现MSComm控件的Output属性是Variant型的,而且地层数据交换是二进制的字符串,
当初怀疑是数据类型处理问题,如实对上段程序进行了修改:
void__fastcall TForm1::btnsendClick(Tobject* Sender)
{
//---向串口发送Byte数1,6,1三个数据------------------------------------
//----通讯设备已RTU方式进行通讯(支持MOUDELBUS协议)---------------------
int tmpInt1,tmpInt2,tmpInt3;
String tmpStr1,tmpStr2,tmpStr3;
Variant tmpVar1,tmpVar2,tmpVar3;
if(MSComm1->PortOpen)
{
tmpInt1=1;
tmpInt2=6;
tmpInt3=1;
tmpStr1=IntToBin(tmpInt1);//---将Int数转换成二进制的字符串---------
tmpStr2=IntToBin(tmpInt2);//---将Int数转换成二进制的字符串-----
tmpStr3=IntToBin(tmpInt3);//---将Int数转换成二进制的字符串-----
tmpVar1=tmpStr1;
MSComm1->Output=tmpStr1;
Sleep(60);
tmpVar2=tmpStr2;
MSComm1->Output=tmpStr2;
Sleep(60);
tmpVar3=tmpStr3;
MSComm1->Output=tmpStr3;
}
修改后第一次编译调试时,出现编译错误:没有发现函数IntToBin();如是在头文件给予申明,再调试时又发现一个连接错误[C++ Linking Error],按照"帮助"的提示,将"协议编译"选项中的"Calling functions"由默认的"C"选择为"pascal",又编译出现[C++ fata Error](C++出现致命错误,在帮助里面查找原因:提示为请与borland公司联系提供技术支持.
我的C++Builder 6.0安装后还没有网上注册.请各位大虾给予指正.谢谢!
另外,PLC用厂家的通讯测试发送数据,却非常正常,这说明PLC通讯程序已经是正常的.
我制作在测试程序中遇到一个意想不到的问题:
我成功的打开了计算机串口,编译时没有问题,在试运行却出现了问题.
程序段如下,请指教!谢谢
void__fastcall TForm1::btnsendClick(Tobject* Sender)
{
//---向串口发送Byte数1,6,1三个数据------------------------------------
//----通讯设备已RTU方式进行通讯(支持MOUDELBUS协议)---------------------
int tmpInt1,tmpInt2,tmpInt3;
String tmpStr1,tmpStr2,tmpStr3;
if(MSComm1->PortOpen)
{
tmpInt1=1;
tmpInt2=6;
tmpInt3=1;
tmpStr1=tmpInt1;
tmpStr2=tmpInt2;
tmpStr3=tmpInt3;
MSComm1->Output=tmpStr1;
Sleep(60);
MSComm1->Output=tmpStr1;
Sleep(60);
MSComm1->Output=tmpStr1;
}
通讯设备没有接受数据,也就是无任何反应(通讯设备是PLC),查资料,发现MSComm控件的Output属性是Variant型的,而且地层数据交换是二进制的字符串,
当初怀疑是数据类型处理问题,如实对上段程序进行了修改:
void__fastcall TForm1::btnsendClick(Tobject* Sender)
{
//---向串口发送Byte数1,6,1三个数据------------------------------------
//----通讯设备已RTU方式进行通讯(支持MOUDELBUS协议)---------------------
int tmpInt1,tmpInt2,tmpInt3;
String tmpStr1,tmpStr2,tmpStr3;
Variant tmpVar1,tmpVar2,tmpVar3;
if(MSComm1->PortOpen)
{
tmpInt1=1;
tmpInt2=6;
tmpInt3=1;
tmpStr1=IntToBin(tmpInt1);//---将Int数转换成二进制的字符串---------
tmpStr2=IntToBin(tmpInt2);//---将Int数转换成二进制的字符串-----
tmpStr3=IntToBin(tmpInt3);//---将Int数转换成二进制的字符串-----
tmpVar1=tmpStr1;
MSComm1->Output=tmpStr1;
Sleep(60);
tmpVar2=tmpStr2;
MSComm1->Output=tmpStr2;
Sleep(60);
tmpVar3=tmpStr3;
MSComm1->Output=tmpStr3;
}
修改后第一次编译调试时,出现编译错误:没有发现函数IntToBin();如是在头文件给予申明,再调试时又发现一个连接错误[C++ Linking Error],按照"帮助"的提示,将"协议编译"选项中的"Calling functions"由默认的"C"选择为"pascal",又编译出现[C++ fata Error](C++出现致命错误,在帮助里面查找原因:提示为请与borland公司联系提供技术支持.
我的C++Builder 6.0安装后还没有网上注册.请各位大虾给予指正.谢谢!
另外,PLC用厂家的通讯测试发送数据,却非常正常,这说明PLC通讯程序已经是正常的.