紧急求助:如何用Delphi串口输出方波?(在线等待)(50分)

  • 主题发起人 主题发起人 articom
  • 开始时间 开始时间
A

articom

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用Delphi调用API函数,然后通过RS-232串口直接输出方波信号,接在示波器上查看。在编程时用了两种方法:<br> &nbsp;1: 一种直接输出字符串‘01010101’:Writefile(hcomm,0,'01010101',lrc,nil);这种方法只是出现一个向上的脉冲,但脉冲并不延时<br> &nbsp;2: 另一种是输出数组,<br> &nbsp;var &nbsp;fdata:array[1..4] of byte;<br>begin<br> &nbsp;if(hcomm=0)then exit;<br> &nbsp;fdata[1]:=byte(0);<br> &nbsp;fdata[1]:=byte(1);<br> &nbsp;fdata[1]:=byte(0);<br> &nbsp;fdata[1]:=byte(1);<br> &nbsp;writefile(hcomm,0,length(fdata),lrc,nil);<br>end;<br>这种出现类似锯齿波的形状。<br>以上两种方法都不行,请教高手指点,如何出现方波??
 
1、输出1并维持时间T;<br>2、输出0并维持时间t。<br>以上方法输出的是近似方波(梯形波形)。
 
1. 串口也可以输出方波的, 但不好控制, 速度也慢;<br>2. 建议使用并口输出方波, 好控制, 速度也快;
 
串口可以输出方波,必须使用同步方式,异步方式输出的都是近似的,不准确
 
怎么样维持时间t呀?<br> &nbsp; 能不能给个详细的代码?<br> &nbsp; 其实我是想做usb口输出方波,但波形一直弄不出来,所以先用串口输出看看,如果成功再用API函数通过usb口输出,关键是如何延时这个时间t呀?
 
对了,还要请教一下,那个同步方式如何设置呀?
 
输出方波就是一个高电平1和低电平0,可是我无论给多长的字符串‘00001111’,Writefile(hcomm,0,'01010101',lrc,nil);示波器上都只是显示一个向上的脉冲,根本无法控制高低电平的时间,如何改进才能控制呢
 
换个思路,不要用数据脚即2、3脚来实现,比如改用9脚,即Ring脚。<br>SetCommMask(handle, EV_RING); { 9脚置高电平 }<br>Sleep(100);<br>......
 
to:nicai_wgl<br>好的,谢谢提醒,我去实践一下!如果用9脚的话,那是不是就只接一个9脚输出就行,然后再接个5脚信号地啊?但是9脚的是输入的呀?
 
我又改进程序,还是用2,3数据线时,<br>var t:integer;<br>begin<br> &nbsp;for t:=0 to 10 do<br> &nbsp;begin<br> &nbsp; &nbsp;sleep(100);<br> &nbsp; &nbsp;Writefile(hcomm,'01010101',8,lrc,nil);<br> &nbsp;end;<br>end;但出来的波形和t和sleep的时间有关,如何控制,才能使之出现方波?
 
// &nbsp;准确延时。...延时间隔是us.<br>procedure delay(delay_time:integer;c:TLargeInteger);<br>var t,t1:TLargeInteger;<br>begin<br> &nbsp;QueryPerformanceCounter(t);<br> &nbsp;repeat<br> &nbsp; &nbsp;QueryPerformanceCounter(t1);<br> &nbsp;until (t1-t)*1000000/c&gt;=delay_time;<br>end;<br><br>var t:integer;<br> &nbsp;c:TLargeInteger;<br>begin<br> &nbsp;QueryPerformanceFrequency(c);<br> &nbsp;for t:=0 to 100000 do<br> &nbsp;begin<br> &nbsp; &nbsp;delay(delay_time;c);//方波的宽度,us为单位<br> &nbsp; &nbsp;Writefile(hcomm,'01010101',8,lrc,nil);<br> &nbsp;end;<br>end;
 
谢谢,谢谢,我马上试一下哈,希望可以呀,为了弄个方波,快把我郁闷死了
 
请问一下,那个QueryPerformanceFrequency(c);表示什么意思呀?
 
数据脚不可能得到方波吧,数据的1不是指ttl高电平,是指 从低到高,0是指从高到低,ring脚没试过,当年在学校做单片机时 ,串口外接了电路的,因为要控制高频设备,出来就用光隔分开了,然后用开关电路来得到方波的.
 
好像用Rs-232不好输出方波呀,怎么样让它从高电平变成低电平,再由低电平编程高电平呀???有谁知道如果用usb口如何输出方波呀?只要能输出方波就行,help!
 
to zywcd:<br>我刚刚试了你的方法,delay_time设定的是100,结果显示的是两行虚线,搞的系统死掉了,怎么回事呀?t,delay_time,c有什么限制么?运行的时候并不报错,但停止不了呀?
 
我给你的是一个准确的延迟过程而已。如果你的输出可以控制电平,这样就可以得到方波。<br> &nbsp;QueryPerformanceFrequency(c);//得到当前cpu主频。<br> QueryPerformanceCounter(t1);得到当前计算机运行时钟数目。
 
哦,谢谢哈,我把for循环中的t设置的太大了,所以系统太忙,才会死掉。我再实践一下!
 
请各位再帮忙想想,我试了那种延时的方法,还是不行,<br> &nbsp; 一:我觉得是writefile的原因,无论用哪种延时方法,都没有把writefile里的01010101延时,还是触发一个一个脉冲Writefile(hcomm,'01010101',8,lrc,nil);在writefile中,计算机只是把字符串当成一个脉冲,无论写入什么都是脉冲,并不是高低电平,延时也只是前一个写入和后一个写入的延时,请问谁还有别的思路呀?把高低电平延时?<br> &nbsp; 二:之前我用过上面写的数组的方法,但出来的也不是方波,而是类似于两条线的锯齿波一样,所以我想用延时的方法再把数组写入的延时,不知可不可行。我去实践下,各位有什么好的建议和思路请发贴告诉我呀?谢谢
 
唉,真的不知道LZ要做什么, 有很好控制的并口(打印口)不用,<br>我用并口产生方波控制电子器件已经有9年了, 现在还在用, 一直很好...
 
后退
顶部