回 帖 发 新 帖 刷新版面

主题:在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通讯程序已经是正常的.

回复列表 (共2个回复)

沙发

cb++有个发送格式是以二进制形式发送的,不要变换

板凳

用TPort来做串口开发吧
http://www.anylib.com

我来回复

您尚未登录,请登录后再回复。点此登录或注册