关于串口通讯的问题:延时发送 在某个条件下PC机向单片机发送一组数据,MSComm1.Output="!01B2CEC21*",,等单片机响应之后,清空输入缓冲区,过一段时间再发一个命令要求单片机返回一组数据。这个问题有什么方法可以解决呀? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 发完之后再运行下面的延迟函数试一下.Public Sub Delay(PauseTime As Long)Dim Start As SingleStart = Timer Do While Timer < Start + PauseTime DoEvents LoopEnd Sub Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)sleep(5000) '5000毫秒, 等单片机响应之后,清空输入缓冲区??????????????????自动的吧规定数据格式吧比如:点灯 灯序号 时间 01H 02H 02H当单片机接收到第一个字节为01H就转到点灯子程序,读取第二个字节表示要点哪个灯,读取第三个字节表示点亮的时间。上面这一组数据就表示把2号灯点亮2秒钟。 回复人: tztz520(午夜逛街) ( ) 信誉:100 2004-09-23 10:03:00 得分: 0 发完之后再运行下面的延迟函数试一下.Public Sub Delay(PauseTime As Long)Dim Start As SingleStart = Timer Do While Timer < Start + PauseTime DoEvents LoopEnd Sub 你指的是哪个发完之后再运行这个程序? 回复人: tobetter(豆豆) ( ) 我做的是一个电源监控系统,监控单片机的工作状态.通过触发OnComm事件来读取数据的.任务是这样的:我从PC机上通过485发送一组数据给单片机,让单片机按我发送的要求工作,一段时间后,PC机再发送一个命令要求单片机返回单片机的当前工作状态. 你说的"当你发送完数据后,就直接等待单片机的反馈数据。"这个我知道,我现在是要在中间加一段程序,就是PC机自己发送命令让单片机反馈数据.对于"如果在规定时间里面没有反馈可以提示通信超时。"这个想请教老兄可以怎么实现.还有"用定时器再调用发送函数。"我是不是可以把发送程序放在Timer_Click里就行了? 就是你发送一个信息到单片机是要等待它返回的.就在MSComm1.Output="!01B2CEC21*"之后执行delay 3 '就等待3秒 发送完后用sleep函数等待几秒sleep(3000) '3秒 我现在举两组数据,比如:一开始PC机向单片机发送一组数据,MSComm1.Output="!01B2CEC21*",等单片机响应之后,过一段时间后,给单片机发出命令要求其返回当前状态,MSComm1.Output="!01M65*",那我应该怎么实现?在这两句之间加延时吗? 你说的是不是这个意思: 向单片机发送命令 延时 再向单片机发送命令 if 在规定的时间内不响应 超时 else .... endif MSComm1.Output="!01B2CEC21*"Delay 5MSComm1.Output="!01M65*" 回复人: poni(poni) ( ) 信誉:100 2004-09-23 14:35:00 得分: 0 你说的是不是这个意思: 向单片机发送命令 延时 再向单片机发送命令 是这个意思,但两次输出缓冲区内的内容是不一样的!!! 它不需要判断第一次发送过去单片机是否响应,而是直接发送命令比如说发送“M”,MSComm1.Output="!01M65*",要球它返回当前状态。 回复人: tztz520(午夜逛街) ( ) 信誉:100 2004-09-23 14:36:00 得分: 0 MSComm1.Output="!01B2CEC21*" Delay 5 MSComm1.Output="!01M65*" 你的这个代码我运行后,5秒后将"!01B2CEC21*!01M65*"一起发送出去. 可以用Timer1_timer事件嘛把Timer1.Interval设成你想要的时间啊。串口定时发送一般都是这样做的啊 Mscomm1.OutBufferCount = 0 '清除发送缓冲区MSComm1.Output="..."sleep(延迟时间) Mscomm1.InBufferCount = 0 '清除接收缓冲区 Mscomm1.OutBufferCount = 0 '清除发送缓冲区MSComm1.Output="..."i=timer '取当前时间j=0 '作为判断标志do until timer-i<规定时间 if mscomm1.InBufferCount<>0 j=1 exit endifenddo if j=0 '超时else '处理缓冲器数据endif 回复人: sunny8226(袋鼠) ( ) 信誉:100 2004-09-23 15:01:00 得分: 0 可以用Timer1_timer事件嘛把Timer1.Interval设成你想要的时间啊。串口定时发送一般都是这样做的啊 我只要发送一次就够了! 在MSCOMM控件的ONCOMM事件中得到单片机在什么时候回发信息,然后再发送下一批数据。 回复人: clong320(clong320) ( ) 信誉:96 2004-09-23 15:08:00 得分: 0 在MSCOMM控件的ONCOMM事件中得到单片机在什么时候回发信息,然后再发送下一批数据。 我不需要知道单片机在什么时候回发信息.给单片机发送反馈数据的命令由PC机控制. 前面有个地方错了,do until ....enddo 应该是 do until .... loop Public Sub Delay(PauseTime As Long)Dim Start As SingleStart = Timer Do While Timer < Start + PauseTime DoEvents LoopEnd Sub没错我用的就是他Delay(n)了 Mscomm1.OutBufferCount = 0 '清除发送缓冲区MSComm1.Output="..."sleep(延迟时间) Mscomm1.InBufferCount = 0 '清除接收缓冲区 Mscomm1.OutBufferCount = 0 '清除发送缓冲区MSComm1.Output="..."我想问一下给位,延时sleep是不是就使让单片机响应之前PC机发送给单片机的数据呀?等到sleep执行完了,单片机就响应第二次发送给它的数据? 我做的是一个电源监控系统,监控单片机的工作状态.通过触发OnComm事件来读取数据的.任务是这样的:我从PC机上通过485发送一组数据给单片机,让单片机按我发送的要求工作,一段时间后,PC机再发送一个命令要求单片机返回单片机的当前工作状态.sleep就是执行的让PC机过“一段时间”sleep后,PC机就发送第二帧,等待单片机响应 回复人: poni(poni):: sleep后,PC机就发送第二帧,等待单片机响应也就是我在sleep之前发送给单片机的数据,单片机是收不到的了??? 发送一次那就再发送并接收正确后把Timer 关掉就好了啊,发送command1接收打开Timer1发送command2接收正确关掉Timer1 串口的东西要慢慢调,监视一下你程序中发送、ONCOMM事件触发、接收等几个主要状态,很简单的。 回复人: poni(poni)请问怎么调试可以看到第一次发送给单片机的数据?我是说从接受缓冲区中看 回复人: poni(poni)我是第一次做这个东西,有很多东西还一点不知道,比如像这个调试,我只知道逐句调试. 回复人: poni(poni)可以告诉我一个你的联系方式吗?我想以后有问题的话向你请教! 我做过一个和单片机实时通讯的软件用的是定时的收发,这方面的资料你可以去http://www.gjwtech.com/serialcomm.htm看看,或者买人民邮电出版的《VB串口通信工程》看看 都是用控件的,有人用过API编写串口通讯程序吗 回复人: solidsnake002() 可以有你的联系方式吗? to: gwm_123 我看了一下上面各位的方法,基本上也就是那几种方式。你发送第一次命令后,可以启动一个定时器。当定时器时间到了,就发送第二个命令,让单片机返回当前状态。至于你说的缓冲区的内容,你可以在找个程序监视,也可以采用两个计算机串口对连的方式。如果需要简单,2、3、5连法就可以。你还可以在发送语句执行前查看当前缓冲区和你即将要发送的数据。 求助,VB中双引号的应用 解决这个问题,愿以500分作为酬谢 请教关于连接SQL Server的问题? 向高手求助:如何得到条形码读卡器读出的条形码信息,并把它保存到ACCESS数据库? string类型的变量默认为多长?为何我取出的SQL语句只取了一半? File控件的问题(有源码)? FSO对象模型有关动态目录名的处理 有关于“类型不匹配”的问题!谢谢! 如何在EXCEL中运行此宏文件? 窗口的scalewidth和width有什么区别 E文Win2000不能显示中文的问题 如何设定一个form最小的长宽?
Dim Start As Single
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
End Sub
01H 02H 02H
当单片机接收到第一个字节为01H就转到点灯子程序,读取第二个字节表示要点哪个灯,读取第三个字节表示点亮的时间。上面这一组数据就表示把2号灯点亮2秒钟。
发完之后再运行下面的延迟函数试一下.Public Sub Delay(PauseTime As Long)
Dim Start As Single
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
End Sub
你指的是哪个发完之后再运行这个程序?
你说的"当你发送完数据后,就直接等待单片机的反馈数据。"这个我知道,我现在是要在中间加一段程序,就是PC机自己发送命令让单片机反馈数据.对于"如果在规定时间里面没有反馈可以提示通信超时。"这个想请教老兄可以怎么实现.还有"用定时器再调用发送函数。"我是不是可以把发送程序放在Timer_Click里就行了?
MSComm1.Output="!01B2CEC21*"之后执行delay 3 '就等待3秒
sleep(3000) '3秒
向单片机发送命令
延时
再向单片机发送命令
if 在规定的时间内不响应
超时
else
....
endif
Delay 5
MSComm1.Output="!01M65*"
你说的是不是这个意思:
向单片机发送命令
延时
再向单片机发送命令
是这个意思,但两次输出缓冲区内的内容是不一样的!!! 它不需要判断第一次发送过去单片机是否响应,而是直接发送命令比如说发送“M”,MSComm1.Output="!01M65*",要球它返回当前状态。
MSComm1.Output="!01B2CEC21*"
Delay 5
MSComm1.Output="!01M65*"
你的这个代码我运行后,5秒后将"!01B2CEC21*!01M65*"一起发送出去.
把Timer1.Interval设成你想要的时间啊。串口定时发送一般都是这样做的啊
Mscomm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.Output="..."
sleep(延迟时间) Mscomm1.InBufferCount = 0 '清除接收缓冲区
Mscomm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.Output="..."
i=timer '取当前时间
j=0 '作为判断标志
do until timer-i<规定时间
if mscomm1.InBufferCount<>0
j=1
exit
endif
enddo if j=0
'超时
else
'处理缓冲器数据
endif
可以用Timer1_timer事件嘛
把Timer1.Interval设成你想要的时间啊。串口定时发送一般都是这样做的啊
我只要发送一次就够了!
在MSCOMM控件的ONCOMM事件中得到单片机在什么时候回发信息,然后再发送下一批数据。
我不需要知道单片机在什么时候回发信息.给单片机发送反馈数据的命令由PC机控制.
do until
....
enddo 应该是
do until
....
loop
Dim Start As Single
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
End Sub
没错我用的就是他Delay(n)了
Mscomm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.Output="..."
sleep(延迟时间) Mscomm1.InBufferCount = 0 '清除接收缓冲区
Mscomm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.Output="..."
我想问一下给位,延时sleep是不是就使让单片机响应之前PC机发送给单片机的数据呀?等到sleep执行完了,单片机就响应第二次发送给它的数据?
sleep就是执行的让PC机过“一段时间”sleep后,PC机就发送第二帧,等待单片机响应
sleep后,PC机就发送第二帧,等待单片机响应
也就是我在sleep之前发送给单片机的数据,单片机是收不到的了???
接收
打开Timer1发送command2
接收正确关掉Timer1
我看了一下上面各位的方法,基本上也就是那几种方式。你发送第一次命令后,可以启动一个定时器。当定时器时间到了,就发送第二个命令,让单片机返回当前状态。至于你说的缓冲区的内容,你可以在找个程序监视,也可以采用两个计算机串口对连的方式。如果需要简单,2、3、5连法就可以。你还可以在发送语句执行前查看当前缓冲区和你即将要发送的数据。