你好,现在这个奇怪的现象是这样的,我用delphi7加SPCOMM2.5开发串口通讯程序,有点象网上一些通讯小精灵之类的,主要是跟智能仪表这些设备进行采集,奇怪的是,很多时候都会出现这样的情况,第一次,运行我自己的程序,发送指令,好像com口那里都没有发出去似的,仪表没有响应,这时,我用网上下载的其他工具,发送同样的命令,可以通了,之后,又换回去我的程序,这时候,我自己做的程序就可以通讯了,我试过很多次都是这样,不知道为什么啊?感觉就好像要激活一下这样的,不知大家有没有遇到过这样情况呢,好奇怪,百思不得其解,还请各位指教指教

解决方案 »

  1.   

    DCB的各個參數都設置對了嗎?跟串口精靈設置的是不是一樣的??spComm.startCOmm   返回值是多少?
      

  2.   

    是的,发送都是16进制发送,发送命令都是经过复制的,完全一样,波特率哪些都是一样的,因为就是第一次才会这样,所以特别奇怪,好像SPCOMM打开不了串口似的,用人家工具一通上了,再用我做的程序就可以,继续求助,谢谢
      

  3.   


    spComm.startCOmm   返回多少???
      

  4.   

    你好,spComm.startCOmm  返回多少???是什么意思啊?startcomm是一个products啊,没有返回值啊我是使用mobus RTU 协议指令的,下发的指令都是一样的啊,不知为什么同一条指令下去,用网上下载的工具就可以啊,如果用自己编写的就不行呢,我一直是用笔记本的PCIMAI卡转串口的那种,一般很少用其他机器,不知这个有没有关系,真的百思不得其解,为什么啊????????????????谢谢
      

  5.   

    PCIMAI卡转串口对有些本本是有问题的,不知你从网上下载的程序也是通过PCIMAI卡转串口吗
      

  6.   

    我在网上下载的程序叫串口调试程序sscom32,作者是聂小猛(丁丁)啊,在标题上看到,我是指我现在的笔记本通过pcimia来转换rs232串口,跟程序没有关系啊,就是丁丁的程序一下子就可以同上设备了,我的好像一定要他的先通上了,我的再通就可以,超奇怪,不知何故,求教求教
      

  7.   

    啊啊啊啊!!!!
    老兄,咱俩遇到一模一样的问题, 现在还没有解决呢!!!!
    要是有答案的话给俺说声、
    [email protected]
      

  8.   

    你用 TMS裏的VACOM 控件去試吧,更加方便點。 
      

  9.   

    哦,可否提供下载地址呢?如果spcomm的问题就可能要更换啦,谢谢
      

  10.   

    http://www.2ccc.com/article.asp?articleid=4178看這個裏面有沒有。TMS網上上傳的有很多不提供這個串口控件。
      

  11.   

    spcomm控件的Inx_XonXoffFlow、Outx_XonXoffFlow属性设为False后试一下。
    哈哈!我当初使用USB转RS232线时只要我的程序一运行,串口就不能用了,必须要重新启动才行,就是改了这两个属性才解决问题
      

  12.   

    应该是spcomm控件的属性问题。
      

  13.   

    我试过,好像不行啊
    Inx_XonXoffFlow属性设为True的话,字符串中的$13,$11就会被当作spcomm中的信息,而截留,显示不出来,造成丢码
    但是这个帖子的问题不是丢码的问题,是第一次打开的问题啊!!
      

  14.   

    串口,我们一般是这样实验的。
    连接到硬件设备,打开windows的超级终端,然后测试是否成功。
    如果成功后,在使用自己的软件进行开发测试。
      

  15.   

    谢谢大家的讨论啊,我的Inx_XonXoffFlow、Outx_XonXoffFlow已经是false了,就是象楼上那样说的,每天早上开机通的话都会有这样的情况啊,奇怪,谢谢大家提的建议,再顶下
      

  16.   

    刚刚又试过了,开始是用一台笔记本PCIMIA转串口的通,通不上,但是2,3脚短接是有数据回的,又换了台台式机,同样的spcomm做的软件,还是没有同上,接着用作者是聂小猛(丁丁)的网上下载的工具,一通就同上了,接着换回我做的,就可以了,哎。怎么会这样,加分,继续求助,谢谢大家
      

  17.   

    我现在也碰到跟你一样的问题,不过我没用任何控件,纯粹用CreateFile
    想不通为什么。
      

  18.   

    先试试楼上的方法啦,看来还是有些人跟我一样的情况啊,不知有没有哪些可以知道具体是怎么引起的呢,不然就可能要不用spcomm这个控件啦,谢谢
      

  19.   

    spcomm不好用,还是mscomm好用,我在delphi中用,一点问题都没有
      

  20.   

    就是没有激活COM口  
      Comm1.CommName := 'COM1';
      Comm1.BaudRate := 9600;
      Comm1.Parity := None;
      Comm1.ByteSize := _8;
      Comm1.StopBits := _1;
      Comm1.StartComm;  Comm1.StopComm;
      //sleep(100);                AssignFile(F1,'COM1');
                    ReWrite(F1);
                    Writeln(F1,'TEST PRN1中文1测试2测试3测试4');                CloseFile(F1);试试这样第一次行不?
      

  21.   

    谢谢你们的回答啊,按照ckc 兄的做法,用我的软件发送命令到另外一台运行网上下载那个程序的电脑,数据真的是不一样哦,比如在我的软件要发送:0303010000018414,结果到接收的那边是这样显示啊:80 00 80 00 80 00 00 00 80 00 00 00 00 80 00 ,好像有点找到的眉目啦,接着我又用人家的软件“激活”一下,接收端变成正确了,奇怪奇怪,不知是哪里引起的
      

  22.   

    在各位的讨论下,我终于找到这个奇怪原因的出处啦,好激动原来是我设置SPCOMM的ByteSize数据位时的错误引起的啊,我现在是这样写的,用了一个combobox来选择,代码是这样case DataBit_CB.ItemIndex of
        0:Comm1.ByteSize :=TByteSize(5);
        1:Comm1.ByteSize :=TByteSize(6);
        2:Comm1.ByteSize :=TByteSize(7);
        3:Comm1.ByteSize :=TByteSize(8);
    end;我把上面这行代码注释了,接着重启电脑,竟然可以啦,试了几次,就是这里的问题,好激动,但是为什么我这样写这个代码不对的,谢谢大家指教
      

  23.   

    串口效率满,操作控制柔和一点
    SPCOMM里面要创建线程,和一个消息窗口,在打开串口,开始写数据前稍微加一点点的等待Sleep(50),给系统提供一个消息处理机会,手动运行一次消息泵:app..prcessmessage.(没拼错吧?)
    另外在,写完数据,如果马上关闭串口请在给他一点时间sleep(10)之类的。
    另外在你调试的时候可能会发现,数据发送没有问题,^_^.
      

  24.   

    哈哈,楼上的各位,我今天也遇到了同样的问题,不过比各位晚了一年多,希望能帮到以后的朋友.
        经过实验,发现是ByteSize上有点问题,在Spcomm.pas的代码中的
    procedure TComm._SetCommState;
    Begin
    ....//dcb.ByteSize := FByteSize;//未改前
    dcb.ByteSize := FByteSize+1;//修改后
    ...
    End; 就这样就好了,具体原因不清楚.
      

  25.   

    TMSComm是一个OCX控件,需要注册入系统,将MScomm32.OCX,MScomm32.oca,MScomm32.DEP,MScomm.SRG复制到系统目录下(通常是 C:\Windows\System32),然后在菜单运行命令中输入
     regsvr32 C:\Windows\System32\MScomm32.ocx
    现在,就可以在系统中运行需要MScomm32.ocx支持的程序了,但Delphi中要能添加上TMScomm32控件,还需要将下把下列信息导入注册表中:(最好做成注册表文件,双击后,点是,遇到问题不理会,完成了这些操作后,我们就能在Delphi正常使用TMscomm控件了)
    //注册表文件内容开始
    Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT][HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]
    @ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"
    //注册表文件内容结束TMscomm控件功能比较强,但打包程序时,需将TMscomm的文件也要打包在内,否则在别的机器上如果没有此控件程序将会报错,不能正常运行,TMscomm对二进制的数据的收发不如Spcomm方便,Spcomm控件短小,不需要其他辅助文件,可以做成绿色软件.
      

  26.   

    昨晚发现的问题不是问题所在,真正问题出在在Spcomm的函数
    function  TComm.GetStopBits(S:String):Byte;
    Var N:Integer;
        Str:string;
    begin
      Result:=0;
      Str:=Trim(S);
      N:=Round(StrToFloatDef(Str,1)*10);
      case N of
       10:Result:=0;//停止为为1时
       15:Result:=1;//停止为为1.5时
       20:Result:=2;停止为为2时
      End;
    end;
    之前用MSComm32将通讯设置为 波特率=57600,数据位=8,停止位=1就能正常通讯,而用Spcomm后,设置与MSComm32一样就不行了,将停止位设置1.5后就能正常通讯了.
    建议大家在通讯不上时,多调整一下通讯参数试试,TMSComm32的停止位设置为1.5会报错,不知道是什么原因?
      

  27.   

    一般是数据格式什么的问题,我也遇到过,比如开始比特位不是用_8,而是用强转的,...:=TBitByte(8)好像,这样就不行。