你好,现在这个奇怪的现象是这样的,我用delphi7加SPCOMM2.5开发串口通讯程序,有点象网上一些通讯小精灵之类的,主要是跟智能仪表这些设备进行采集,奇怪的是,很多时候都会出现这样的情况,第一次,运行我自己的程序,发送指令,好像com口那里都没有发出去似的,仪表没有响应,这时,我用网上下载的其他工具,发送同样的命令,可以通了,之后,又换回去我的程序,这时候,我自己做的程序就可以通讯了,我试过很多次都是这样,不知道为什么啊?感觉就好像要激活一下这样的,不知大家有没有遇到过这样情况呢,好奇怪,百思不得其解,还请各位指教指教
spComm.startCOmm 返回多少???
老兄,咱俩遇到一模一样的问题, 现在还没有解决呢!!!!
要是有答案的话给俺说声、
[email protected]
哈哈!我当初使用USB转RS232线时只要我的程序一运行,串口就不能用了,必须要重新启动才行,就是改了这两个属性才解决问题
Inx_XonXoffFlow属性设为True的话,字符串中的$13,$11就会被当作spcomm中的信息,而截留,显示不出来,造成丢码
但是这个帖子的问题不是丢码的问题,是第一次打开的问题啊!!
连接到硬件设备,打开windows的超级终端,然后测试是否成功。
如果成功后,在使用自己的软件进行开发测试。
想不通为什么。
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);试试这样第一次行不?
0:Comm1.ByteSize :=TByteSize(5);
1:Comm1.ByteSize :=TByteSize(6);
2:Comm1.ByteSize :=TByteSize(7);
3:Comm1.ByteSize :=TByteSize(8);
end;我把上面这行代码注释了,接着重启电脑,竟然可以啦,试了几次,就是这里的问题,好激动,但是为什么我这样写这个代码不对的,谢谢大家指教
SPCOMM里面要创建线程,和一个消息窗口,在打开串口,开始写数据前稍微加一点点的等待Sleep(50),给系统提供一个消息处理机会,手动运行一次消息泵:app..prcessmessage.(没拼错吧?)
另外在,写完数据,如果马上关闭串口请在给他一点时间sleep(10)之类的。
另外在你调试的时候可能会发现,数据发送没有问题,^_^.
经过实验,发现是ByteSize上有点问题,在Spcomm.pas的代码中的
procedure TComm._SetCommState;
Begin
....//dcb.ByteSize := FByteSize;//未改前
dcb.ByteSize := FByteSize+1;//修改后
...
End; 就这样就好了,具体原因不清楚.
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控件短小,不需要其他辅助文件,可以做成绿色软件.
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会报错,不知道是什么原因?